Selenium页面加载等待方法

Selenium page loading wait methods

我已经 运行 在本地环境中执行相对较快但在 Sauce Labs 中执行速度极慢的自动化测试。

现有的 Java 代码似乎有两种类型的冗余页面加载等待时间

//1. set at the beginning of the test
 driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);

//2. called before every UI interaction/assertion
(new WebDriverWait(wDriver, waitTime)).until((wDriver) -> {
return javascriptExecutor.execute_script("return document.readyState").equals("complete")
});

pageLoadTimeout 是否是一种可能与第二个“document.readyState”显式等待发生冲突的隐式等待?

这是否完全多余,或者是否存在其中一种检查可能不起作用而辅助方法充当备份的任何边缘情况?

感谢任何帮助 阿杰

设置在抛出错误之前等待页面完全加载的时间。

程序中的 确保程序等待 document.readyState 等于“完成” 至少对于已配置的 waitTime 加载缓慢的页面。

You can find a detailed discussion in Do we have any generic function to check if page has completely loaded in Selenium

你确定你真的需要在每个 UI interaction/assertion 之前等待 document.readyState -> complete 吗?
如果该页面上有一些繁重的 JavaScript 运行,则可能需要很长时间才能达到上述状态。
实际上在大多数情况下,您所需要的只是您当前需要访问的特定元素的准备/成熟状态。
因此,与其等待整个页面 readyState complete 状态,不如等待单个特定 Web 元素的可见性或可点击性。
我相信这将减少您在这里谈论的延迟。

这里有两个不同的概念。首先是使用 w3c 你现在可以设置一个 Page Load Strategy in the capabilities at the beginning of a session. This affects what Document readiness state the driver will wait for before returning control to the user. If the specified readiness state is not satisfied before the page load timeout,驱动程序应该 return 一个错误。

请注意,这两种情况仅适用于 navigation events,因此单击导致页面加载的元素不应触发这些情况。

更复杂的是,Chrome驱动程序有一个 open bug 错误:

wait[ing] for navigation to complete at the end of almost all commands

所以现在 Chrome 测试实际上将等待点击时指定的文档就绪状态。

最后,请记住,对于当今的网络,通常有大量内容通过 JavaScript 动态加载,因此即使文档就绪状态为“完成”,DOM 也不太可能处于它是最终状态,这就是为什么我们鼓励您将 explicit waits 用于您真正想要与之交互的事物。