在 python 中我写道:
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.get(url)
try:
WebDriverWait(driver, 10).until(
lambda driver: driver.execute_script('return document.readyState') == 'complete')
except se.TimeoutException:
return False
# Start Parsing
尽管我在解析某些网站时已经等待了 readyState
,但我发现没有复选框。但是,如果我在解析同一网站之前添加 time.sleep(5)
,我会发现有一个复选框。
我的问题是,如何才能拥有适用于大多数网站的通用解决方案?我不能只写 time.sleep(5)
因为有些网站可能需要更多,有些可能会在 0.001 秒内完成(这会对性能产生不良影响......)
我只是想刺激一个真正的浏览器,并且在刷新按钮再次出现之前不处理任何事情(这意味着所有内容都已加载)。
最佳答案
理想情况下,Web 应用程序在通过 get()
访问时,仅在 document.readyState
equals to complete
时才将控件返回给 WebDriver 。因此,除非 AUT(测试中的应用程序)有其他行为,否则以下代码行通常是开销:
WebDriverWait(driver, 10).until(lambda driver: driver.execute_script('return document.readyState') == 'complete')
但是,根据您的测试要求,您可以配置 pageLoadStrategy要么是:
无
渴望
正常
You can find a detailed discussion in What is the correct syntax checking the .readyState of a website in Selenium Python
此时需要注意的是使用time.sleep(secs)
没有任何特定条件来实现违背了自动化的目的,应该不惜一切代价避免。
解决方案
适用于所有网站的通用方法是诱导 WebDriverWait根据当前的测试场景。举个例子:
- 要等待元素出现,您需要调用
presence_of_element_ located()
的预期条件 - 要等待元素的可见性,您需要调用
visibility_of_element_ located()
的预期条件 - 要等待元素可见、启用并可交互以便您可以单击它,您需要调用
element_to_be_clickable()
的预期条件
关于python-3.x - Selenium 可以检测 Python3 中网页何时完成加载吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71592662/