Belajar Selenium - Synchronization & Waits
Episode 5 of 23

Belajar Selenium - Synchronization & Waits

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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 vs Explicit Wait

Implicit Wait

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.

PythonMengatur implicit wait
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

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".

PythonExplicit wait untuk satu elemen
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.

WebDriverWait dan ExpectedConditions

Expected Conditions yang Paling Sering Dipakai

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.
PythonKombinasi beberapa kondisi
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.

Menyusun Predikat Sendiri

Untuk kondisi yang tidak tersedia, kalian bisa membuat fungsi yang mengembalikan boolean atau objek. Selama tidak False, wait berlanjut sampai timeout:

PythonCondition custom
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 Reference dan Timing Issues

Mengapa Stale Element Terjadi

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 Recovery

Strategi paling sederhana: cari ulang elemen setiap kali akan berinteraksi, atau muat ulang dalam loop saat exception terjadi.

PythonRetry saat stale element
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:
        continue

Cuplikan 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.

Best Practice untuk Reliable Test

Beberapa kebiasaan yang membuat eksekusi test stabil:

  • Utamakan explicit wait untuk interaksi penting, bukan memperbesar implicit wait global.
  • Gunakan timeout berbasis bisnis: halaman login 10 detik, dashboard berat 20 detik.
  • Hindari time.sleep() statis — menunggu dengan angka pasti membuat test lambat dan rapuh.
  • Buat helper wait seperti klik_saat_siap(driver, by, value) agar konsisten dipakai semua test.
  • Catat durasi wait di log untuk mendeteksi aplikasi yang semakin lambat.
Urutan strategi sinkronisasi
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.

Penutup

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:

  • Implicit wait berlaku global; explicit wait menunggu kondisi spesifik.
  • WebDriverWait plus ExpectedConditions adalah alat sinkronisasi utama.
  • Stale element diatasi dengan mencari ulang elemen sebelum berinteraksi.
  • Hindari time.sleep(); pakai kondisi berbasis aplikasi.
  • Simpan wait dalam helper agar konsisten di seluruh suite.

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.

Belajar Selenium - Synchronization & Waits | Belajar Selenium