4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

seleniumで「どの程度まで読み込みを待つか」を設定する

Last updated at Posted at 2023-06-23

結論

ドライバのオプションにpageLoadStrategyを設定することで「どの程度まで読み込みを待つか」を設定できます。

解説

seleniumでは指定のページにアクセスしたときに「どの程度まで読み込みを待つか(読み込み戦略)」を設定することができます。以下に例を示します。

normalの場合.py
# 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で要素を取得できる状態という認識でいいかと思います。

eagerの場合.py
# 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)
noneの場合.py
# 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だけでページの読み込み状況を信頼し切るのは注意したほうが良さそうです。

以上です。

参考

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?