Seleniumページのロードが遅い


Seleniumページのロードが遅い
問題の説明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スクリプトをタイムアウトしてウェブロードを停止するなどの方法がありますが、ここでは詳しく説明しません.