一尘不染

Selenium WebDriver:等待带有JavaScript的复杂页面加载

c#

我有一个Web应用程序可以使用Selenium进行测试。页面加载时运行着许多JavaScript。
该JavaScript代码编写得不太好,但是我什么也不能更改。因此,使用findElement()method 等待元素出现在DOM 中不是一个选择。
我想在Java中创建一个通用函数来等待页面加载,可能的解决方案是:

  • 运行JavaScript脚本WebDriver并将结果存储document.body.innerHTML在字符串变量中body
  • body变量与的早期版本进行比较body。如果它们相同,则设置递增计数器,notChangedCount否则设置notChangedCount为零。
  • 等待一小段时间(例如50毫秒)。
  • 如果页面有一段时间没有变化(例如500毫秒),notChangedCount >= 10则退出循环,否则循环至第一步。

您认为这是有效的解决方案吗?


阅读 224

收藏
2020-05-19

共1个答案

一尘不染

如果有人真的知道一个通​​用且始终适用的答案,那么它将 很久以前的 所有地方 得到实施,这将使我们的生活变得如此轻松。

您可以做很多事情,但是其中每一个都有一个问题:

  1. 正如Ashwin Prabhu所说,如果您对脚本非常了解,则可以观察其行为并在windowdocument等上跟踪其一些变量。但是,该解决方案并不适合所有人,只能由您自己使用,并且只能在有限的一组上使用。页面。

  2. 通过观察HTML代码以及一段时间内是否已更改,您的解决方案也不错(同样,有一种方法可以通过来直接获取原始HTML和未经编辑的HTML WebDriver),但是:

    • 实际声明页面需要花费很长时间,并且可能会大大延长测试时间。
    • 您永远不知道正确的间隔是多少。该脚本 可能 正在下载耗时超过500毫秒的大型内容。我们公司内部页面上的几个脚本在IE中需要花费几秒钟的时间。您的计算机可能暂时缺少资源-说防病毒软件可以使您的CPU正常工作,那么即使对于非复杂脚本,500 ms也可能太短。
    • 有些脚本永远不会完成。它们会以一定的延迟(setTimeout())调用自己,并一次又一次地工作,并且有可能在每次运行时更改HTML。认真地说,每个“ Web 2.0”页面都可以做到。甚至堆栈溢出。您可以覆盖最常用的方法,并考虑使用它们的脚本是否完整,但是…您不确定。
    • 如果脚本除了更改HTML之外还执行其他操作,该怎么办?它可以做成千上万的事情,而不仅仅是一些innerHTML乐趣。
    • 有一些工具可以帮助您。即Progress ListenernsIWebProgressListener等。但是,浏览器对此的支持是可怕的。Firefox开始尝试从FF4开始支持它(仍在不断发展),IE 9已对IE9提供了基本支持。

而且我想我很快会想到另一个有缺陷的解决方案。事实是-
由于永恒的脚本正在执行工作,因此何时说“现在页面已完成”没有确切的答案。选择一个最能为您服务的产品,但要提防它的缺点。

2020-05-19