web-dev-qa-db-ja.com

Seleniumをページ全体が読み込まれるまで待たないようにするにはどうすればよいですか?

Selenium driver.get (url)は、ページ全体がロードされるまで待機します。しかし、スクレイピングページは、デッドJSスクリプトをロードしようとします。だから私のPythonスクリプトはそれを待って数分動作しません。この問題はサイトのすべてのページで発生する可能性があります。

_from Selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.cortinadecor.com/productos/17/estores-enrollables-screen/estores-screen-corti-3000')
# It try load: https://www.cetelem.es/eCommerceCalculadora/resources/js/eCalculadoraCetelemCombo.js 
driver.find_element_by_name('ANCHO').send_keys("100")
_

待機時間を制限する方法、ブロックAJAXファイルのロード、または他の方法ですか?

また、webdriver.Chrome()でスクリプトをテストしますが、PhantomJS()またはおそらくFirefox()を使用します。そのため、何らかの方法でブラウザー設定の変更を使用する場合、それは普遍的でなければなりません。

12
bl79

Seleniumがデフォルトでページ/ URLをロードするとき、pageLoadStrategynormalに設定されたデフォルト構成に従います。 Seleniumがページ全体の読み込みを待たないようにするには、pageLoadStrategyを構成します。 pageLoadStrategyは、次の3つの異なる値をサポートします。

  1. normal(全ページ読み込み)
  2. eager(インタラクティブ)
  3. none

pageLoadStrategyを設定するコードブロックは次のとおりです。

  • Firefox

    from Selenium import webdriver
    from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    
    caps = DesiredCapabilities().FIREFOX
    caps["pageLoadStrategy"] = "normal"  #  complete
    #caps["pageLoadStrategy"] = "eager"  #  interactive
    #caps["pageLoadStrategy"] = "none"
    driver = webdriver.Firefox(desired_capabilities=caps, executable_path=r'C:\path\to\geckodriver.exe')
    driver.get("http://google.com")
    
  • Chrome

    from Selenium import webdriver
    from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    
    caps = DesiredCapabilities().CHROME
    caps["pageLoadStrategy"] = "normal"  #  complete
    #caps["pageLoadStrategy"] = "eager"  #  interactive
    #caps["pageLoadStrategy"] = "none"
    driver = webdriver.Chrome(desired_capabilities=caps, executable_path=r'C:\path\to\chromedriver.exe')
    driver.get("http://google.com")
    

pageLoadStrategynormaleagerおよびnoneWebDriver W3C EditorのDraft ですが、pageLoadStrategy値はeagerはまだWIP(Work In Progress)ChromeDriver 実装。詳細な議論は PythonでのChromedriver Seleniumの「熱心な」ページ読み込み戦略の回避策 にあります。

21
DebanjanB

Selenium Webdriverは、暗黙と明示の2種類の待機を提供します。明示的な待機により、WebDriverは特定の条件が発生するまで待機してから、さらに実行を進めます。

from Selenium import webdriver
from Selenium.webdriver.common.by import By
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

これは、10秒以内に返される要素を見つけない限り、TimeoutExceptionをスローする前に最大10秒待機します。

そのため、解決策として、待機する時間を設定し、その一定期間内に要素がキャッチされない場合、例外をキャッチしてイベントをログに記録するか、何も記録せずに最終的に続行します。コードサンプルは here から取得されています

1
arif