Какой правильный синтаксис проверяет.readyState веб-сайта в Selenium Python?

Я пытаюсь проверить состояние.readyState веб-сайта с помощью.execute_script, но постоянно получаю сообщение об ошибке.

Я использую pageLoadStrategy "none" в chromedriver, поэтому я пытаюсь проверить, что готовность веб-сайтов больше не "загружается".

Примечание: этот вопрос специфичен для Python.

WebDriverWait(driver, timeout=20).until(
    driver.execute_script('return document.readyState') == 'interactive'
)

значение = метод (self._driver) TypeError: объект 'str' не вызывается

Я также попытался использовать лямбду, которая не выдает ошибку, однако печать готовности приведет к противоречивым результатам.

WebDriverWait(driver, timeout=20).until(
    lambda driver: driver.execute_script('return document.readyState') == 'interactive'
)
print(driver.execute_script('return document.readyState'))

погрузка

2 ответа

С помощью pageLoadStrategy как none а затем с помощью WebDriverWait для document.readyState как interactive не будет хорошим подходом. Вы можете использовать либо pageLoadStrategy или WebDriverWait для document.readyState следующее:

Настроить pageLoadStrategy как None Вы можете использовать любое из следующих решений:

  • Firefox:

    from selenium import webdriver
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    
    caps = DesiredCapabilities().FIREFOX
    caps["pageLoadStrategy"] = "none"
    #caps["pageLoadStrategy"] = "eager"  #  interactive
    #caps["pageLoadStrategy"] = "normal"  #  complete
    driver = webdriver.Firefox(desired_capabilities=caps, executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
    driver.get("http://google.com")
    
  • Хром:

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

Использование WebDriverWait для ожидания document.readyState как eager:

WebDriverWait(driver, 20).until(lambda driver: driver.execute_script("return document.readyState").equals("interactive"))

Использование WebDriverWait для ожидания document.readyState как normal:

WebDriverWait(driver, 20).until(lambda driver: driver.execute_script("return document.readyState").equals("complete"))

Вы можете найти подробное обсуждение в разделе Как заставить Selenium не ждать полной загрузки страницы с медленным сценарием?


Outro

Есть ли у нас какая-либо общая функция, чтобы проверить, полностью ли загружена страница в Selenium?

Вы можете переместить условие в JS:

WebDriverWait(driver, timeout=20).until(
    lambda driver: driver.execute_script('return document.readyState === "interactive"')
)
print(driver.execute_script('return document.readyState'))

Если сайт находится в угловом положении, вы можете использовать pendingRequests.length === 0 увидеть этот ответ.

Надеюсь это поможет!

Другие вопросы по тегам