3

我正在尝试使用 .execute_script 检查网站的 .readyState,但我不断收到错误消息。

我在 chromedriver 中使用了“none”的 pageLoadStrategy,所以我试图测试网站的 readystate 是否不再“加载”。

注意:这个问题是 Python 特有的。

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

value = method(self._driver) TypeError: 'str' object is not callable

我也尝试过使用不会引发错误的 lambda,但是打印 readystate 会返回冲突的结果。

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

加载

4

2 回答 2

2

使用pageLoadStrategyasnone然后使用WebDriverWait for document.readyStateasinteractive不是一个好方法。您可以使用WebDriverWaitpageLoadStrategyWebDriverWaitdocument.readyState如下所示:

要进行配置pageLoadStrategyNone您可以使用以下任一解决方案:

  • 火狐

    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.readyStateas eager

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

使用WebDriverWait等待document.readyStateas normal

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

您可以在How to make Selenium not wait until full page load, which has a slow script?中找到详细讨论?


奥特罗

我们是否有任何通用函数来检查页面是否已在 Selenium 中完全加载

于 2019-06-24T13:07:29.250 回答
1

您可以将条件移动到 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查看此答案

希望这可以帮助!

于 2019-06-24T07:50:19.427 回答