在Selenium Python中检查网站的.readyState的正确语法是什么?

时间:2019-06-24 00:31:46

标签: python selenium selenium-webdriver webdriver pageloadstrategy

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

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

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

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

value = method(self._driver)   TypeError:“ str”对象不可调用

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

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

加载

2 个答案:

答案 0 :(得分: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参见this answer

希望这会有所帮助!

答案 1 :(得分:1)

pageLoadStrategy用作 none ,然后将 WebDriverWait 用作document.readyState interactive 并不是一个好方法。您可以为pageLoadStrategy使用document.readyState WebDriverWait ,如下所示:

要将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 的身份{@ {1}}:

eager

使用 WebDriverWait WebDriverWait(driver, 20).until(lambda driver: driver.execute_script("return document.readyState").equals("interactive")) 的身份{@ {1}}:

document.readyState
  

您可以在How to make Selenium not wait till full page load, which has a slow script?

中找到详细的讨论

Outro

Do we have any generic function to check if page has completely loaded in Selenium