硒 - 等待网络流量

2022-09-03 07:32:06

我们将Selenium与Java API和一些Javascript用户扩展一起使用。我们在应用程序中使用了很多 AJAX 调用。我们的许多测试都会随机失败,因为有时 AJAX 调用的完成速度比其他时间慢,因此页面未完全加载。我们通过等待特定元素或Thread.sleep来解决这个问题。我试图找到一种方法来等待网络流量完成。这样我们就可以这样做:

selenium.click("some JS button");
selenium.waitForNetwork();
assertTrue(something);

这样,当服务器响应更快并且不会因为时序问题而失败太多测试时,我们可以摆脱线程休眠状态,并使测试通过得更快。

我无法找到一种方法来搜索谷歌。有没有人对我们如何实现这一目标有任何想法?(最好通过Javascript或Java API,但欢迎所有建议)。

注意:“waitFor”的其他变体不是我想要的。我们已经在点击和其他方面使用了它们。我正在寻找等待网络流量的东西。感谢所有的反馈,我会尝试一些建议,但我仍然对其他想法持开放态度。

谢谢。


答案 1

有几种类型的等待在硒中可用。在测试用例中,如果您知道页面加载时会出现特定文本,则可以使用 waitForText。如果有不同的DOM元素被填充(通过Ajax/pageload),你可以按顺序添加waitForText。


答案 2

在尝试了此页面上描述的所有变体之后,我们最终采用了以下策略:

注入一个特殊的javascript,它基本上覆盖了所有相关的框架方法,并保留了未完成请求数量的计数器,该计数器在开始时递增,并在完成时递减。由于javascript的异步特性,仅保留布尔变量是不够的,您最终可能会在自己的逻辑中遇到竞争条件。

如果您使用的是视觉效果,您可能也想为视觉效果执行此操作;变形/淡入淡出和其他视觉效果将具有相同的问题。

因此,我们基本上执行常规的“单击”,然后始终等待此计数器再次达到0,使用javascript,就像其他人在这里建议的那样。在我们完成此操作后,我们将暂时性问题减少到无。

请记住,在处理完所有同步 onclick 事件之前,selenium 不会从“单击”返回,因此您必须确保将这些计数器作为单击的直接结果递增。

有关如何重写框架方法的说明,您需要查阅框架文档;我们在原型中使用addMethods。可以在一个特殊的javascript中保持这种覆盖,该javascript仅在运行测试时添加到页面中。


推荐