結論
ドライバのオプションにpageLoadStrategy
を設定することで「どの程度まで読み込みを待つか」を設定できます。
解説
seleniumでは指定のページにアクセスしたときに「どの程度まで読み込みを待つか(読み込み戦略)」を設定することができます。以下に例を示します。
# webdriverのimportや他のoptionのコードは割愛
# すべてのリソースをダウンロードするのを待つ
options.set_capability('pageLoadStrategy', 'normal')
with webdriver.Chrome("chromedriver", options = options) as driver:
# 全てのリソースがダウンロードされるまでは処理が進まない
driver.get('https://www.yahoo.co.jp/')
# completeが出力される
print(driver.execute_script('return document.readyState'))
pageLoadStrategy
には以下の戦略を設定できます。
戦略 | 内容 |
---|---|
normal | すべてのリソースがダウンロードされるのを待つ(デフォルト) |
eager | DOMにはアクセスできる状態まで待つ |
none | ページの読み込みについて一切待たない |
「DOMにはアクセスできる状態まで待つ」というのは、find_element
で要素を取得できる状態という認識でいいかと思います。
# webdriverのimportや他のoptionのコードは割愛
# DOMにはアクセスできる状態まで待つ
options.set_capability('pageLoadStrategy', 'eager')
with webdriver.Chrome("chromedriver", options = options) as driver:
# DOMにはアクセスできる状態までは処理が進まない
# リソースや通信状況によるが、'normal'より処理時間が早い
driver.get('https://www.yahoo.co.jp/')
# interactiveが出力される
print(driver.execute_script('return document.readyState'))
# page_sourceの内容からも、DOMにアクセスできそうなことが分かる
print(driver.page_source)
# webdriverのimportや他のoptionのコードは割愛
# ページの読み込みについて一切待たない
options.set_capability('pageLoadStrategy', 'none')
with webdriver.Chrome("chromedriver", options = options) as driver:
driver.set_network_conditions(
latency = 10000, # 10秒遅延させる
download_throughput = 500 * 1024,
upload_throughput = 500 * 1024 #download_throughput, upload_throughputは引数に渡す必要がある。
)
# 上のコードで遅延を発生させているが読み込みは一切待たない
driver.get('https://www.yahoo.co.jp/')
# loadingなどが出力される
print(driver.execute_script('return document.readyState'))
# 何も表示されないことが多い
print(driver.page_source)
注意事項
下記の記事を一部引用します。
URL 経由で新しいページに移動する場合、デフォルトでは、WebDriver は、ドキュメントの準備完了状態が完了するまで、 ナビゲーション メソッド (driver.navigate().get() など) の完了を保留します。 これは必ずしもページの読み込みが完了したことを意味するわけではありません。 特に、Ready State が完了した後に JavaScript を使用してコンテンツを動的に読み込むシングル ページ アプリケーションのようなサイトの場合はそうです。
私自身も完全に理解できていない点、ご了承ください。javascriptのdocument.readyState
を確認しているようです。このステータスと「読み込み完了」が必ずしも一致するものではないから、「normal」でも読み込めていないということがあるという意味なのでしょうか・・・?申し訳ないですが、ここは私もよくわかってません。ただ、javascriptで通信して動的な挙動をするwebページではpageLoadStrategy
だけでページの読み込み状況を信頼し切るのは注意したほうが良さそうです。
以上です。
参考