【问题标题】:race condition in Selenium waitForPageToLoad?Selenium waitForPageToLoad 中的竞争条件?
【发布时间】:2010-07-06 16:56:19
【问题描述】:

我们正在使用 Selenium 对基于 Java Spring MVC 的网站进行烟雾测试。我们使用 JUnit 和 Java Selenium 客户端调用它。很多时候,我们的测试工作正常,但我们倾向于在 selenium.waitForPageToLoad 中明显随机的地方出现超时。 (即多次运行测试套件,超时的位置和次数会有很大差异。)

在前台运行它的服务器,我可以看到执行的测试。当这些超时之一发生时,在等待之前的 selenium.click 已经发生,但等待似乎没有注意到。右击页面并选择刷新出现清除阻塞。

对我来说,这表明在单击和 waitForPageToLoad 之间存在竞争条件。其他人有与 waitForPageToLoad 相关的问题,但似乎没有描述竞争条件。有些人建议前面的 selenium.click 调用存在问题,但我在这里没有看到。有其他人看到我观察到的吗?

我看到了许多不使用 waitForPageToLoad 的建议,但解决方法通常建议使用 waitForElementPresent 或手动轮询元素是否存在。对于我们的应用程序,它似乎需要使用仅由测试使用的 ID 来检测 HTML。这种方法有非侵入性的解决方法吗?

【问题讨论】:

  • 我也有同样的问题。 Selenium 服务器和远程控制 1.0.2!在 Internet exploder (IE8) 上运行测试

标签: java selenium timeout


【解决方案1】:

Selenium 的waitForPageToLoad() 函数相当可靠——我不知道为什么有人会建议你不要使用它。它在 Firefox 中工作得特别好,其中 Selenium RC 添加了一个插件来帮助它检测页面就绪状态,但它在 Internet Explorer 中也能正常工作。我们在测试套件中使用了数千次,而且从未失败。

您应该问的问题是“为什么我的页面等待超时?”最好通过捕获测试中涉及的网络流量并在测试失败时分析结果来回答这个问题。如果您有可重复的测试用例,WireShark 或 Fiddler 是很好的工具。如果没有,您可能会在异常处理程序中使用 Selenium RC 的 captureNetworkTraffic() 方法来保存失败时的流量。

【讨论】:

  • 看着这个,我对 Windows 非常生气,因为无法通过 Wireshark 窥探 localhost 流量。无论如何,我能够追踪到页面 readyState 偶尔只能达到 INTERACTIVE,这意味着 waitForPageToLoad 永远不会触发!这似乎只是偶尔发生,我不知道如何进行。
  • @Alan:我没有争论:Windows Wireshark localhost 愚蠢。
  • @Alan: Re: readyState: 深入挖掘一些捕获浏览器网络流量的东西——Fiddler 是 Firefox 的一个很好的答案。我希望您会发现该页面实际上还没有完全准备好 - 浏览器尝试加载的某些资源没有及时到达。
【解决方案2】:

我之前遇到过这个问题,等待页面加载经常发生在特定页面上,但是当我们检查日志和屏幕截图时,一切似乎都很正常。

@Ross,我同意您的“深入挖掘”声明。我最初也认为这是一个竞争条件,但在我的情况下,结果证明是一些 JavaScript 在页面上运行得相当高,并且它正在使用非我们托管的服务器做一些事情,所以它需要比平时更长的时间偶尔完成。

我为缓解这种情况所做的就是在仅针对此页面的 selenium 调用和使用 selenium 命令set_speed(time_in_ms) 进行此特定交互之间增加额外的时间。

$self->{sel}->open_ok("/", $self->{browser});
# Inject 2000 ms in between selenium calls
$self->{sel}->set_speed("2000");

然后将其设置回我们通常运行的时间,1000 毫秒。

【讨论】:

    【解决方案3】:

    我在 Selenium RC 2.25/Windows 7/IE 9 中遇到了同样的问题。

    两个重要步骤:

    • 在管理员上下文中从命令提示符调用 Java 包(右键单击 cmd.exe -> run as administrator
    • 在兼容模式下运行 Internet Explorer

    这解决了我的问题。

    【讨论】:

      【解决方案4】:

      我最近遇到了这个问题。就我而言,window.location 几乎在页面加载后立即更改为锚点(例如 window.location = "#myAnchor")。也许这个 URL 更改欺骗了 waitForPageToLoad 认为加载的页面不是预期的页面,因此最终失败。

      问题的随机部分是由触发此 window.location 更改的短暂(100 毫秒)“setTimeout”引起的。

      多亏了 Selenium,丑陋的代码被发现并变成了同步的。

      【讨论】:

        猜你喜欢
        • 2016-03-07
        • 2011-07-17
        • 2013-02-27
        • 2021-04-16
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        相关资源
        最近更新 更多