我们正在使用Selenium对基于Java Spring MVC的网站进行烟雾测试。我们使用JUnit和Java Selenium客户端调用它。大多数情况下,我们的测试工作正常,但我们倾向于在selenium.waitForPageToLoad中显然在随机的地方获得超时。 (也就是说,多次运行测试套件,超时的位置和数量会有很大差异。)
在前台运行服务器,我可以看到测试正在执行。当其中一个超时发生时,等待之前的selenium.click已经发生,但等待似乎没有注意到。右键单击页面并选择“刷新”可以清除阻塞。
对我而言,这表明click和waitForPageToLoad之间存在竞争条件。其他人与waitForPageToLoad有相关的问题,但似乎没有描述竞争条件。有些人提出了上述selenium.click调用的问题,但我在这里没有看到。还有其他人看过我观察过的东西吗?
我已经看到了一些不使用waitForPageToLoad的建议,但是解决方法通常建议使用waitForElementPresent或手动轮询元素存在。使用我们的应用程序似乎需要使用只能由测试使用的ID检测HTML。这种方法是否存在非侵入性的解决方法?
答案 0 :(得分:1)
Selenium的waitForPageToLoad()
功能非常可靠 - 我不知道为什么有人会建议你不要使用它。它在Firefox中运行得特别好,其中Selenium RC添加了一个插件,可以帮助它检测页面就绪状态,但它在Internet Explorer中也可以正常工作。我们在测试套件中使用它几千次,它永远不会失败。
你应该问的问题是“为什么我的页面等待超时?”通过捕获测试中涉及的网络流量并在失败时分析结果,可以最好地解决这个问题。如果你有一个可重复的测试用例,WireShark或Fiddler是很好的工具。如果没有,您可以在异常处理程序中使用Selenium RC的captureNetworkTraffic()
方法,以便在失败时保存流量。
答案 1 :(得分:1)
之前我遇到过这个问题,等待页面加载会经常发生在特定页面上,但是当我们检查日志和屏幕捕获时,一切看起来都很正常。
@罗斯,我同意你的“深入挖掘”声明。我最初也认为这是一个竞争条件,但在我的情况下,它结果是一些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毫秒。
答案 2 :(得分:1)
我最近遇到过这个问题。在我的例子中,window.location几乎在页面加载后立即更改为锚点(例如window.location =“#myAnchor”)。也许这个URL更改欺骗了waitForPageToLoad,认为加载的页面不是预期的页面,因此最终会失败。
问题的随机部分是由一个短的(100ms)“setTimeout”触发此window.location更改引起的。
感谢Selenium,找到了丑陋的代码并且变成了同步。