これが、Pythonでの完全に一般的なソリューションでの私の試みです。
まず、一般的な「待機」関数(必要に応じてWebDriverWaitを使用してください。醜いものです):
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__))
次に、ソリューションは、セレンがトップレベルの<html>
要素を含むページ上のすべての要素の(内部)ID番号を記録するという事実に依存しています。ページが更新またはロードされると、新しいIDを持つ新しいhtml要素が取得されます。
したがって、たとえば「my link」というテキストのリンクをクリックしたい場合は、次のようにします。
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)
よりPythonicで再利用可能な汎用ヘルパーについては、コンテキストマネージャを作成できます。
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)
そして、ほとんどすべてのセレンの相互作用でそれを使用できます:
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
それは防弾だと思います!どう思いますか?
それについてのブログ投稿の詳細はこちら