当前位置: 首页 > 知识库问答 >
问题:

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

姚兴安
2023-03-14

我有一个web应用程序要用Selenium测试。有很多JavaScript在页面加载时运行。
这段JavaScript代码写得不是很好,但我无法更改任何内容。因此,使用findElement()方法等待元素出现在DOM中不是一个选项。
我想在Java中创建一个泛型函数来等待页面加载,一个可能的解决方案是:

  • 运行JavaScript脚本表单WebDriver并将document.body.innerHTML的结果存储在字符串变量body中。
  • body变量与body的以前版本进行比较。如果相同,则设置increment a计数器NotChangedCount;否则将NotChangedCount设置为零。
  • 等待一小段时间(例如50 ms)。
  • 如果页面已有一段时间没有更改(例如500 ms),因此NotChangedCount>=10,则退出循环,否则循环到第一步。

你认为这是一个有效的解决办法吗?

共有1个答案

龙涵蓄
2023-03-14

如果真的有人知道一个通用的、永远适用的答案,那么早在很多年前就会在所有地方实施,并且会使我们的生活变得更加容易。

你可以做很多事情,但每一件事情都有一个问题:

>

  • 正如Ashwin Prabhu所说,如果您非常了解脚本,您可以在窗口文档等上观察它的行为并跟踪它的一些变量。然而,这个解决方案并不适合所有人,只能由您使用,并且只能在有限的页面集上使用。

    通过观察HTML代码以及它是否已经更改了一段时间,您的解决方案还不错(另外,有一种方法可以直接通过webdriver获取原始的未经编辑的HTML),但是:

    • 实际断言页面需要很长时间,可能会显著延长测试时间。
    • 你永远不知道什么是正确的间隔。脚本可能是html" target="_blank">下载需要超过500毫秒的大东西。我们公司的内页上有几个脚本在IE中需要几秒钟的时间。您的计算机可能暂时资源不足--假设防病毒可以使您的CPU完全工作,那么即使对于不复杂的脚本来说,500毫秒也太短了。
    • 有些脚本从未完成。它们调用自己时有一些延迟(setTimeout()),并且反复工作,并且每次运行时都可能更改HTML。说真的,每个“Web2.0”页面都是这样做的。甚至堆栈溢出。您可以覆盖最常用的方法,并将使用它们的脚本视为已完成,但...您不能确定。
    • 如果脚本执行了更改HTML以外的操作,该怎么办?它可以做成千上万的事情,而不仅仅是一些innerHTML的乐趣。

    在这方面有一些工具可以帮助你。即进度侦听器以及nsIWebProgressListener和其他一些侦听器。然而,浏览器对此的支持是可怕的。Firefox从FF4开始就开始尝试支持它(还在进化中),IE在IE9中有基本的支持。

    我想我很快就能想出另一个有缺陷的解决方案。事实是--没有确切的答案,什么时候说“现在页面完成了”,因为持久的脚本在做他们的工作。挑一个最能为你服务的,但要提防它的缺点。

  •  类似资料:
    • 我试图创建一个等待加载页面的方法,但我出现了一个错误。可能我没有正确使用这个方法。 错误是:

    • 本文向大家介绍jQuery EasyUI 页面加载等待及页面等待层,包括了jQuery EasyUI 页面加载等待及页面等待层的使用技巧和注意事项,需要的朋友参考一下 下面一个代码片段是 easyUI 页面加载等待,代码如下所示: 下面看个工具类 基于easyui的页面等待提示层,即mask 效果图: 以上所述是小编给大家介绍的jQuery EasyUI 页面加载等待及页面等待层,希望对大家有所帮

    • 问题内容: 我编写了一个脚本,该脚本从页面中获取数据,但是有时页面需要花费一些时间来加载,因此当将html拉到汤对象中时,有时它什么也不会拉,因为页面仍然需要完成。 我编写了以下代码以等待页面完成。 有用 但是调用函数时出现以下错误; 问题答案: 我认为您应该这样使用: 如手册所述。

    • 问题内容: 我想抓取无限滚动实现的页面的所有数据。以下python代码有效。 这意味着每次我向下滚动到底部时,我都需要等待5秒,这通常足以使页面完成加载新生成的内容。但是,这可能不是省时的。该页面可能会在5秒内完成新内容的加载。每次向下滚动时,如何检测页面是否完成了新内容的加载?如果可以检测到此情况,知道页面完成加载后,可以再次向下滚动以查看更多内容。这样更省时。 问题答案: 该会通过等待页面加载

    • 我实际上有三个问题: Selenium WebDriver如何实现此 因为我们不能给无限睡眠的线程一个负值。 有没有更好的方法来实现无限等待? 我们在SeleniumWebDriver文档中看到了这一点

    • 问题内容: 您如何使Selenium 2.0等待页面加载? 问题答案: 您还可以使用以下代码检查页面加载