Episode ini membedah perbedaan implicit dan explicit wait, memakai WebDriverWait dengan ExpectedConditions, menangani stale element exception dan timing issues, serta menerapkan best practice agar eksekusi test berjalan stabil dan reliable.

Di episode 4 kalian sudah berkenalan dengan WebDriverWait untuk menunggu elemen muncul. Episode 5 ini melengkapi pemahaman itu menjadi strategi utuh: synchronization dan waits. Pertanyaan yang akan kita jawab: kapan memakai implicit wait, kapan explicit wait, bagaimana membaca ExpectedConditions, dan bagaimana keluar dari jebakan stale element yang sering menghancurkan test di tengah malam.
Web modern memuat konten secara async — komponen muncul setelah request selesai, animasi selesai, atau data di-render ulang. Tanpa sinkronisasi yang benar, test kalian akan berdebat dengan browser: test mencari elemen terlalu cepat, browser belum selesai memuat, lalu muncul NoSuchElementException. Episode ini memberi kalian kunci untuk menang itu.
Implicit wait adalah batas waktu yang diterapkan secara global ke semua perintah pencarian elemen. Ketika set, Selenium akan menunggu selama itu sebelum melempar error jika elemen belum ditemukan.
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://example.com")
judul = driver.find_element("tag name", "h1")
driver.quit()driver.implicitly_wait(10) menyetel polling default 10 detik. Jika elemen h1 muncul dalam 3 detik, perintah langsung kembali; jika tidak, Selenium menunggu sampai batas waktu lalu melempar error.
Explicit wait menunggu kondisi tertentu pada elemen tertentu, dengan batas waktu tersendiri. Ini lebih presisi karena kalian mengekspresikan apa yang kalian tunggu — bukan sekadar "elemen ada", tapi "elemen bisa diklik" atau "teks muncul".
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
tombol = WebDriverWait(driver, 15).until(
EC.element_to_be_clickable((By.ID, "submit"))
)
tombol.click()Aturan praktisnya: pakai implicit wait untuk pencarian elemen yang umum, dan explicit wait untuk kondisi yang penting secara fungsional. Keduanya bisa berjalan bersamaan, tapi berhati-hatilah karena efeknya menumpuk.
expected_conditions menyediakan puluhan kondisi siap pakai. Yang paling sering kita gunakan:
presence_of_element_located — elemen ada di DOM, belum tentu terlihat.visibility_of_element_located — elemen terlihat dan punya ukuran.element_to_be_clickable — elemen terlihat dan aktif.text_to_be_present_in_element — teks tertentu muncul di elemen.url_contains dan title_contains — navigasi sudah selesai.wait = WebDriverWait(driver, 20)
wait.until(EC.url_contains("/checkout"))
wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, "cart"), "Rp 250.000"))Pola WebDriverWait(driver, 20) disimpan sekali sebagai objek lalu dipakai berulang. Ini lebih bersih daripada menulis WebDriverWait(...) di setiap baris.
Untuk kondisi yang tidak tersedia, kalian bisa membuat fungsi yang mengembalikan boolean atau objek. Selama tidak False, wait berlanjut sampai timeout:
from selenium.webdriver.support.ui import WebDriverWait
def tabel_selesai(driver):
sel = driver.find_element("id", "spinner")
return not sel.is_displayed()
WebDriverWait(driver, 15).until(tabel_selesai)Fungsi tabel_selesai(driver) adalah condition sederhana yang menunggu spinner menghilang. Ini adalah teknik yang bagus untuk state yang tidak punya EC bawaan.
Stale element muncul ketika referensi elemen di memori tidak lagi terhubung ke DOM. Penyebabnya umum: halaman di-reload, elemen di-render ulang oleh framework JavaScript, atau bagian dari halaman diganti setelah aksi tertentu. Selenium melempar StaleElementReferenceException ketika kalian memakai referensi lama.
Strategi paling sederhana: cari ulang elemen setiap kali akan berinteraksi, atau muat ulang dalam loop saat exception terjadi.
from selenium.common.exceptions import StaleElementReferenceException
for _ in range(3):
try:
driver.find_element("id", "list").find_elements("tag name", "li")[2].click()
break
except StaleElementReferenceException:
continueCuplikan di atas mencoba klik sampai tiga kali. Pola find ulang di setiap aksi adalah fondasi utama menghindari stale element di aplikasi yang sering me-render ulang.
Beberapa kebiasaan yang membuat eksekusi test stabil:
time.sleep() statis — menunggu dengan angka pasti membuat test lambat dan rapuh.klik_saat_siap(driver, by, value) agar konsisten dipakai semua test.explicit wait -> short implicit -> retry stale -> sleep statis (terakhir)Urutan di atas menunjukkan prioritas: mulai dari kondisi eksplisit, jangan menjadikan sleep sebagai andalan.
Warning
time.sleep() bukan solusi sinkronisasi. Dia menunggu waktu tetap yang tidak mengetahui kondisi aplikasi, memperlambat suite, dan tetap gagal jika aplikasi lebih lambat dari angka yang kalian tebak.
Episode 5 menyelesaikan masalah timing yang sudah diperkenalkan di episode 4: kalian kini bisa membedakan implicit wait sebagai jaring pengaman global dan explicit wait sebagai kontrol presisi, membaca ExpectedConditions, mengatasi stale element dengan mencari ulang, dan menerapkan urutan strategi yang benar.
Inti yang harus dibawa pulang:
time.sleep(); pakai kondisi berbasis aplikasi.Di episode 6 selanjutnya kita akan membahas page object pattern dan struktur test — mengimplementasikan Page Object Model, meng-enkapsulasi interaksi halaman dan abstraksi locator, mengorganisasi folder tests, pages, dan utils, serta membuat helper yang bisa dipakai ulang agar test kalian lebih rapi dan mudah dipelihara.