我已经开始越来越多地使用显式等待来处理页面上的异步事件。例如,我将等待一个元素点击之前点击。如何等待Selenium Webdriver中的元素没有改变?
然而,很多时候,我也面临这种情况,当我需要等待一个元素变得稳定,即停止变化之前,我会采取行动。例如,我可以在页面上执行查询,并等待搜索结果(显示在列表或表中)停止更改,然后检索结果。
当然,这个等待会有超时时间。所以简而言之,我想等待列表或表格的值不变,比如5秒。
如何实现这种等待?任何人都可以在代码中提供一个简单的例子
谢谢,
我已经开始越来越多地使用显式等待来处理页面上的异步事件。例如,我将等待一个元素点击之前点击。如何等待Selenium Webdriver中的元素没有改变?
然而,很多时候,我也面临这种情况,当我需要等待一个元素变得稳定,即停止变化之前,我会采取行动。例如,我可以在页面上执行查询,并等待搜索结果(显示在列表或表中)停止更改,然后检索结果。
当然,这个等待会有超时时间。所以简而言之,我想等待列表或表格的值不变,比如5秒。
如何实现这种等待?任何人都可以在代码中提供一个简单的例子
谢谢,
使用FluentWait
将完成这项工作。它的优势是implicitWait
和explicitWait
是它使用轮询和超时频率。例如,对于轮询频率,我们有5秒和1秒的超时值。该元素将每1秒检查一次,直到达到超时值(5秒)。如果超过超时值而没有任何结果,则会引发异常。
FluentWait
在AJAX应用程序以及元素加载时间经常波动的情况下很有用,因为它在等待元素时忽略了NoSuchElementExceptions
等特定类型的例外。
您可以查看示例代码FluentWait
here
我会做这样的事情。基本上你要计算什么在改变,例如表行,列表元素等,等待X秒,再次计数。如果计数没有改变,你就完成了。如果确实发生了变化,请再等一等。
int count = 0;
int newCount = 0;
boolean done = false;
while (!done)
{
newCount = driver.findElements(...).size();
if (newCount > count)
{
count = newCount;
}
else
{
// no new results, stop waiting
done = true;
}
Thread.sleep(2000);
}
根据您的情况,您可能希望让你永远不会超过X分钟或其他添加一个整体超时。只需将其添加到while
的条件。
考虑到提供的信息量,这很难回答。你怎么知道元素是“稳定的”?请提供一些示例HTML。在搜索之前,搜索期间(但尚未稳定)和稳定时,页面看起来像什么? – JeffC
@JeffC一个例子是:在搜索过程中,搜索结果列表的大小正在变化(增加)。例如,搜索结果列表大小在2秒内未发生变化时搜索结束。 – user1559625