1. 問題となる現象
Selenium のテストでは、ページ要素は読み込まれて操作できることがわかりましたが、ブラウザのアドレス バーがぐるぐる回ったままで、次のコードを実行できませんでした。
2、問題の原因
Selenium 要素操作などのメソッドは、ページのすべての要素が完全にロードされるまで待機してから実行する必要があるため、ページがロードされる前にコードはページのロードを待機し、実行を続行しません。
3. 解決策
1. WebDriver のページ読み込み時間を設定します ( set_page_load_timeout )
set_page_load_timeout(time) メソッドは、ページの読み込みタイムアウト時間を設定できます。ページの読み込みが設定時間を超えると、エラーが報告されます。レンダラーからのメッセージの受信がタイムアウトしました: 時間
try...excel を Javascript の window.stop() メソッドと組み合わせて使用すると、タイムアウト後にページの読み込みを強制的に停止し、後続の操作を続行できます。
import time
from selenium import webdriver
start = time.time()
driver = webdriver.Chrome()
# 设置页面加载时间
driver.set_page_load_timeout(5)
try:
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')
except:
# 超时后执行Javascript停止页面加载
driver.execute_script('window.stop()')
end = time.time()
# 计算页面加载时间
print(end - start)
>>>6.229357481002808
※ページの読み込み時間を設定する方法は、get()メソッドを使用してWebページを開く場合にのみ適用され、操作によってページがリダイレクトされる場合は適用されません
2. WebDriver のページ読み込み戦略(page_load_strategy)を変更します。
WebDriver がページをロードすると、デフォルトのロード戦略に従って、取得アドレスのページとすべての静的リソースがダウンロードされます。
デフォルトの戦略に加えて、eager 戦略と none 戦略を選択し、実際の状況に応じてページ読み込み戦略を調整して、待ち時間を短縮し、実行速度を向上させることもできます。
- 通常 (デフォルト): ファイル、CSS、JS などを含むページ全体がロードされるまで待ちます。
- eager: dom ツリー全体がロードされるまで、つまり DOMContentLoaded イベントが完了するまで、つまり html が完全にロードされ、解析されるまで待ちます。画像、スタイル、サブフレームが読み込まれるまで待つのはやめましょう。
- none: 解析がまだ開始されていない場合でも、HTML のダウンロードが完了するまで待ちます。
1) ページ読み込み戦略は正常です
import time
from selenium import webdriver
start = time.time()
# 默认加载策略为normal,可以不进行设置
driver = webdriver.Chrome()
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')
end = time.time()
# 计算页面加载时间
print(end - start)
>>>22.998253345489502
2) ページ読み込み戦略は熱心です
import time
from selenium import webdriver
start = time.time()
options = webdriver.ChromeOptions()
# 设置加载策略为eager
options.page_load_strategy = 'eager'
driver = webdriver.Chrome(options=options)
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')
end = time.time()
# 计算页面加载时间
print(end - start)
>>>1.859546184539795
3) ページ読み込み戦略はありません
import time
from selenium import webdriver
start = time.time()
options = webdriver.ChromeOptions()
# 设置加载策略为none
options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=options)
driver.get('https://search.damai.cn/search.html?keyword=111&spm=a2oeg.home.searchtxt.dsearchbtn')
end = time.time()
# 计算页面加载时间
print(end - start)
>>>1.1394140720367432
* ページの読み込み戦略を変更する場合、必要な要素が非インタラクティブな状態にあるときに後続の操作が途中で実行されてエラーが発生することを回避するために、表示待機と連携できます。