Inilah upaya saya untuk solusi yang sepenuhnya generik, dengan Python:
Pertama, fungsi "tunggu" generik (gunakan WebDriverWait jika Anda suka, saya menganggapnya jelek):
def wait_for(condition_function):
start_time = time.time()
while time.time() < start_time + 3:
if condition_function():
return True
else:
time.sleep(0.1)
raise Exception('Timeout waiting for {}'.format(condition_function.__name__))
Selanjutnya, solusinya bergantung pada fakta bahwa selenium mencatat nomor id (internal) untuk semua elemen pada halaman, termasuk <html>
elemen level atas . Saat halaman disegarkan atau dimuat, ia mendapat elemen html baru dengan ID baru.
Jadi, anggap Anda ingin mengeklik tautan dengan teks "tautan saya" misalnya:
old_page = browser.find_element_by_tag_name('html')
browser.find_element_by_link_text('my link').click()
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
Untuk bantuan Pythonic, reusable, generic yang lebih banyak, Anda dapat membuat manajer konteks:
from contextlib import contextmanager
@contextmanager
def wait_for_page_load(browser):
old_page = browser.find_element_by_tag_name('html')
yield
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
Dan kemudian Anda dapat menggunakannya di hampir semua interaksi selenium:
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
Saya rasa itu antipeluru! Bagaimana menurut anda?
Info lebih lanjut di posting blog tentang itu di sini