我面临着一个复杂的任务。我对selenium仍然很陌生,并正在学习等待元素等功能。
我需要在一个网站上操作一些数据,然后再进入另一个网站。问题是:这个操作会调用一个脚本,在后台处理被操作的数据时会出现一个小的“保存...”标签。我必须等到它消失才能进入下一个网站。
所以问题来了: 如何等待某个元素消失?事实上:它始终存在于DOM中,但只有在某个脚本(我想是这样,请参见下面的图片)的控制下才会变得可见。
以下是我尝试过的方法,但它根本没有起到等待的作用。selenium只是继续执行下一步(并因为“保存...”而卡在弹出框上,询问我是否要离开或留在该页面)。
我需要在一个网站上操作一些数据,然后再进入另一个网站。问题是:这个操作会调用一个脚本,在后台处理被操作的数据时会出现一个小的“保存...”标签。我必须等到它消失才能进入下一个网站。
所以问题来了: 如何等待某个元素消失?事实上:它始终存在于DOM中,但只有在某个脚本(我想是这样,请参见下面的图片)的控制下才会变得可见。
![The palish code contains the said element](https://istack.dev59.com/lDQUZ.webp)
private By savingLableLocator = By.id("lblOrderHeaderSaving");
public boolean waitForSavingDone(By webelementLocator, Integer seconds){
WebDriverWait wait = new WebDriverWait(driver, seconds);
Boolean element = wait.until(ExpectedConditions.invisibilityOfElementLocated(webelementLocator));
return element;
}
更新/解决方案:
我想出了以下解决方案: 我建立了自己的方法。基本上,它在循环中检查CssValue是否发生变化。
循环检查特定时间段内CSSVALUE "display"是否从"block"状态变为其他状态。
public void waitForSavingOrderHeaderDone(Integer _seconds){
WebElement savingLbl = driver.findElement(By.id("lblOrderHeaderSaving"));
for (int second = 0;; second++) {
if (second >= _seconds)
System.out.println("Waiting for changes to be saved...");
try {
if (!("block".equals(savingLbl.getCssValue("display"))))
break;
} catch (Exception e) {
}
}