我已經開始越來越多地使用顯式等待來處理頁面上的異步事件。例如,我將等待一個元素點擊之前點擊。如何等待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