我想测试一个需要更新页面加载的功能。由于硒化物只检查元素是否出现,而不重新加载页面,因此它不会了解更新后的状态。
我现在是这样做的:
element(byAttribute("type", "submit")).click()
try {
element(byText("some specific text")).shouldBe(visible)
} catch (e: com.codeborne.selenide.ex.ElementNotFound){
refresh()
element(byText("some specific text")).shouldBe(visible)
}
这在很多方面都很糟糕:
- 它捕获了一个错误,而这个错误不是要捕获的(否则它将是一个异常(
- 它会引发副作用,比如创建错误屏幕截图
- 它只重试一次
- 它等待完整的第一次超时,这可能根本不需要。例如,也许它可以立即刷新,然后成功
如果您想知道:有问题的功能与缓存是热的还是冷的有关。在测试开始时强制缓存为冷缓存可能是可能的,但这也会增加很多复杂性(例如,直接与数据库交互(,我希望避免这种情况。
我不熟悉硒化物,但我认为通过以下更改,您至少可以解决列出的几个问题:
- 将
try-catch
块放入while true
循环中,以便应用发现可见的元素break
,否则继续循环
如果您想避免无限循环,请在那里添加一些计数器,以便在X次迭代后找不到元素时,将其保留 - 减少等待预期条件的超时时间。你没有在这里分享你定义如果的地方,所以我不知道如何改变
第一段的更改可能如下所示:
element(byAttribute("type", "submit")).click()
for(int i=0;i<100;i++){
try {
element(byText("some specific text")).shouldBe(visible)
break
} catch (e: com.codeborne.selenide.ex.ElementNotFound){
refresh()
element(byText("some specific text")).shouldBe(visible)
}
}