Какой правильный синтаксис проверяет .readyState веб-сайта в Selenium Python? - PullRequest
1 голос
/ 24 июня 2019

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

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

Примечание: этот вопрос относится к Python.

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

значение = метод (self._driver) Ошибка типа: объект 'str' не может быть вызван

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

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

загрузка

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Использование 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")
    
  • Chrome:

    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

1 голос
/ 24 июня 2019

Вы можете переместить условие в 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 см. этот ответ .

Надеждаэто помогает!

...