Episode ini membahas assertion dengan pytest untuk memvalidasi state halaman, teks, visibilitas elemen, dan perilaku, menyusun dynamic assertions untuk UI responsif, serta menambahkan error reporting dan screenshot otomatis saat test gagal.

Menemukan elemen dan berinteraksi dengannya hanya setengah cerita. Setengah lainnya adalah validasi: membuktikan bahwa hasilnya sesuai harapan. Episode 7 membahas assertions dan test validation — bagaimana memvalidasi state halaman, teks, visibilitas elemen, dan perilaku aplikasi, serta bagaimana membuat kegagalan test mudah dilacak lewat error reporting dan screenshot.
Assertion adalah jantung perbedaan antara "automasi berjalan" dan "test yang benar-benar memvalidasi". Script yang hanya mengklik tanpa memeriksa hasil tidak memberi nilai apa pun. Di episode ini kalian belajar memilih assertion yang tepat dan menempatkannya pada momen yang tepat.
Python menggunakan statement assert dengan operator pembanding standar. pytest menangkap kegagalan assert dan menampilkan nilai aktual vs ekspektasi dengan detail:
judul = driver.title
assert judul == "Dashboard"
jumlah_item = len(driver.find_elements("css selector", ".cart-item"))
assert jumlah_item > 0
assert jumlah_item == 3, f"Jumlah item {jumlah_item}, diharapkan 3"assert jumlah_item == 3, "pesan" menambahkan pesan yang muncul saat gagal. Pesan ini sangat membantu saat menelusuri kegagalan di CI, jadi biasakan selalu menulisnya.
Aturan praktisnya: assert apa yang benar-benar penting untuk bisnis. Jangan meng-assert detail trivial yang hanya akan membuat test rapuh, seperti urutan atribut CSS. Assert hasil fungsional: teks muncul, URL berubah, jumlah elemen sesuai, atau state tertentu aktif.
Kombinasi klasik untuk memvalidasi halaman:
selamat = driver.find_element("id", "welcome")
assert selamat.is_displayed()
assert "Selamat datang" in selamat.text
tombol_beli = driver.find_element("id", "beli")
assert tombol_beli.is_enabled()
assert tombol_beli.get_attribute("data-harga") == "250000"is_displayed() memvalidasi elemen terlihat, is_enabled() memvalidasi elemen aktif, dan get_attribute(...) membaca nilai atribut. Tiga pembacaan ini adalah bahan baku assertion state halaman.
Assertion paling berharga adalah yang memeriksa efek dari aksi pengguna:
before = len(driver.find_elements("css selector", ".item"))
driver.find_element("id", "tambah").click()
wait = WebDriverWait(driver, 10)
wait.until(lambda d: len(d.find_elements("css selector", ".item")) == before + 1)
after = len(driver.find_elements("css selector", ".item"))
assert after == before + 1Cuplikan di atas meng-assert bahwa mengklik tombol menambah satu item. Perhatikan penggunaan wait sebelum assert — assertion harus menunggu state stabil, bukan langsung mengecek.
UI responsif membuat tampilan elemen berubah tergantung ukuran viewport. Assertion dinamis memvalidasi perilaku yang sama tetapi lewat representasi yang berbeda:
def cek_menu_terlihat(driver, mode):
if mode == "desktop":
return driver.find_element("id", "nav-desktop").is_displayed()
return driver.find_element("id", "hamburger").is_displayed()
def test_menu_responsif():
driver.set_window_size(1440, 900)
assert cek_menu_terlihat(driver, "desktop")
driver.set_window_size(375, 812)
assert cek_menu_terlihat(driver, "mobile")Fungsi cek_menu_terlihat(driver, mode) memilih elemen yang relevan untuk tiap mode. Prinsipnya: validasi tujuan yang sama (menu bisa diakses), bukan validasi satu implementasi spesifik yang bisa berubah dengan lebar layar.
Menemukan alasan kegagalan jauh lebih mudah dengan bukti visual. Screenshot bisa diambil otomatis lewat fixture pytest yang mengecek hasil test:
import pytest
from pathlib import Path
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
report = outcome.get_result()
if report.when == "call" and report.failed:
driver = item.funcargs.get("driver")
if driver:
Path("artifacts").mkdir(exist_ok=True)
driver.save_screenshot(f"artifacts/{item.name}.png")
with open(f"artifacts/{item.name}.html", "w") as f:
f.write(driver.page_source)Hook pytest_runtest_makereport(item, call) menangkap hasil tiap test. Saat gagal, hook menyimpan screenshot dan snapshot HTML ke folder artifacts. Kedua file ini menjadi barang bukti utama saat men-triage kegagalan.
Selain screenshot, sertakan konteks di log: URL saat gagal, versi browser, dan langkah terakhir yang dieksekusi. Kombinasi screenshot plus konteks ini memangkas waktu debugging secara drastis.
Info
Simpan screenshot dalam format PNG dan lampirkan sebagai artifact di CI. Jangan tulis ke direktori project yang di-commit, karena isinya berubah di setiap run.
Episode 7 melengkapi siklus test yang benar: aksi tanpa validasi adalah automasi kosong. Kalian kini bisa memvalidasi teks, visibilitas, atribut, dan perilaku dengan assertion pytest, menyusun assertion dinamis untuk UI responsif, dan menghasilkan bukti kegagalan berupa screenshot serta snapshot HTML secara otomatis.
Inti yang harus dibawa pulang:
Di episode 8 selanjutnya kita akan membahas advanced browser actions — menangani alert, popup, frame, dan window, drag and drop, double click, hover, dan keyboard actions, otomasi upload dan download file, serta scrolling dan penanganan viewport.