是否有一种方法可以让python-selenium等到页面的所有元素都加载完毕?

问题描述 投票:0回答:3

我要求一般检查是否已加载页面的所有元素。有没有办法检查基本上?

在具体示例中有一个页面,我点击一些按钮,然后我必须等到我点击“下一步”按钮。但是,这个“下一步”按钮可用,可选择并且可以随时点击。那么如何用selenium检查页面的“状态”(?)?

提醒一下:这是一个关于硒的问题,而不是有问题的网页的质量....

python selenium selenium-webdriver
3个回答
0
投票

可靠地确定页面是否已满载可能具有挑战性。没有办法知道是否所有元素都已加载。您必须在每个页面中定义一些“锚点”,以便您知道,如果已加载这些元素,则可以假设整个页面已加载。通常这涉及测试的组合。例如,您可以定义如果下面的测试组合通过,则认为页面已加载:

  • JavaScript document.readyState === 'complete'
  • “锚”元素
  • 如果存在,各种“旋转器”都消失了。

0
投票

有一种叫做document.readyState的东西可以通过Selenium执行JavaScript脚本来检索。这不适用于动态加载的内容。它返回以下三种状态之一:

正在加载文档仍在加载,没有可用的CSS或其他资源

交互式文档已加载,没有可用的CSS或其他资源

完成加载文档和css /其他资源

你至少在寻找互动。您可以通过调用execute_script来检索状态:

driver.execute_script("return document.readyState")

0
投票

正如你的问题是如果有一种方法让python-selenium等到页面的所有元素都已加载,答案是否定的。

替代方法:

从根本上说,您可以编写一行代码(或通过函数实现它)来检查'document.readyState' == "complete",如下所示:

self.driver.execute_script("return document.readyState").equals("complete"))

但是这种方法有一个缺点,即它不能解释JavaScript / AJAX Calls要完成。

为什么不:

编写上述行以等待Page Loading默认情况下通过Selenium实现。所以重写同样是一个完整的overhead。除非'document.readyState'等于"complete",否则客户端(即Web浏览器)将永远不会将控件返回给WebDriver实例。一旦满足此条件,Selenium将执行下一行代码。

值得一提的是,虽然客户端(即Web浏览器)可以在达到'document.readyState' equal to "complete"后将控制权返回给WebDriver实例,但并不认为新HTML DOM上的所有WebElements都是presentvisibleinteractableclickable

因此,根据我们的要求,如果在WebElement达到时你必须与之相互作用的下一个interactable不是'document.readyState' equal to "complete",你必须使用匹配的WebDriverWait来诱导expected_conditions相对于个体WebElement。以下是一些最常用的expected_conditions

  • element_to_be_clickable(locator)
  • presence_of_element_located(locator)
  • visibility_of(element)

这是关于'document.readyState' == "complete"讨论的链接

© www.soinside.com 2019 - 2024. All rights reserved.