Seleniumページのロードが遅い
4860 ワード
Seleniumページのロードが遅い
問題の説明
問題解決
For commands that cause a new document to load, the point at which the command returns is determined by the session’s page loading strategy.
上記の大まかな意味は、新しいロードされた
ページ・ロード・ポリシーを を待つ. を行う. に戻る.
上記のコードは、最終的な解析方法である
ネットで調べたところ、この方法の構想は、ウェブページのロードタイムアウトを設定し、
小結
上述したように、私が問題解決で出会ったいくつかの小さな問題と解決策は、実際には、本文で述べた以外に、スレッドを開いてプログラムを監視し、jsスクリプトをタイムアウトしてウェブロードを停止するなどの方法がありますが、ここでは詳しく説明しません.
問題の説明
Selenium
を用いてQQ
空間のシミュレーション登録を行ったところ,webdriver.get
メソッドはウェブページのすべてのロードが完了するまでブロックされることが分かったが,公式に提供された3つのwait
メソッドはウェブページのajax
に対してのみ明らかな効果を示した.QQ
空間にログインするには、Webページに必要な要素はすぐにロードされますが、ページ全体のロードが完了するには時間がかかるため、必要な要素をロードした後にWebページを停止させるには、本明細書で解決する必要がある問題です.問題解決
pageLoadStrategy
設定(推奨)For commands that cause a new document to load, the point at which the command returns is determined by the session’s page loading strategy.
上記の大まかな意味は、新しいロードされた
dom
に対して、ページがいつからコマンドを受け入れるかはページのロードポリシーによって決定されます.つまり、ページのロードポリシーを変更することで、ページがロード中であっても、私たちの命令を受け入れることができ、webdriver.get
のブロック問題を解決することができます.各クラスwebdriver
には、特定のクラスDesiredCapabilities
に対応するプロファイルが配置されており、その中のpageLoadStrategy
を修正することで、webdriver
のページロードポリシーを変更することができます.from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait
desired_capabilities = DesiredCapabilities.CHROME #
desired_capabilities["pageLoadStrategy"] = "none" # ,
driver = webdriver.Chrome('browsers/chromedriver.exe')
wait = WebDriverWait(driver, 10) # wait
driver.get('http://qzone.qq.com/')
# some code to work.
print("Reach end.")
ページ・ロード・ポリシーを
none
に変更した後、ページはロード中でもプログラムを実行し続けることができます.コードのpageLoadStrategy
プロパティは、次の3つのプロパティに設定できます.normal
すなわち通常の場合、selenium
はインタフェース全体のロード完了(html
とサブリソースのダウンロードと解析を指し、ajax
を含まない)eager
ツリー全体のロード完了、すなわちdom
というイベントの完了を待つには、DOMContentLoaded
のコンテンツのみをダウンロード解析html
ダウンロードが完了すると、解析の完了を待たずにnone
が上記のコードは、最終的な解析方法である
html
を用いて、待機せずに直接戻り、その後、後続のコードではselenium
またはnone
などの方法で特定の要素を待機捕捉することができ、具体的には公式ドキュメントを参照することができ、ここでは詳細に説明しない.explicit_wait
実測が通じなくて、疑問を解くことを望みますネットで調べたところ、この方法の構想は、ウェブページのロードタイムアウトを設定し、
implicit_wait
の過程で処理することであり、私はこの構想に従ってコードの作成を行ったが、driver.set_page_load_timeout()
以降のtry-catch
はいつもtry-except
と提示され、driver
に対する操作性を失っていることが分かった.以下は私のコードの一部である.from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome('browsers/chromedriver.exe')
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)
try:
driver.get('http://qzone.qq.com/')
except TimeoutException:
driver.execute_script("window.stop();") # js
wait = WebDriverWait(driver, 5)
frame = wait.until(
EC.presence_of_element_located(
(By.XPATH, '//*[@id="login_frame"]')
)
) # timeout
driver.switch_to.frame(frame)
wait.until(
EC.element_to_be_clickable(
(By.XPATH, '//*[@id="login_frame"]')
)
).click() #
# some code to work.
小結
上述したように、私が問題解決で出会ったいくつかの小さな問題と解決策は、実際には、本文で述べた以外に、スレッドを開いてプログラムを監視し、jsスクリプトをタイムアウトしてウェブロードを停止するなどの方法がありますが、ここでは詳しく説明しません.