我提出了一项艰巨的任务。我对硒很新,并且仍然在研究等待元素和类似物的功能。
我必须操纵网站上的一些数据,然后继续操作另一个。问题:操作调用一个脚本,当在后台处理操纵数据时,会出现一个“Saving ...”标签。我必须等到可以进入下一个网站。
所以这里是: 我如何等待和元素消失?事情是:它始终存在于DOM中,但只能通过某些脚本显示(我想,见下图)。
这就是我尝试过但它只是不起作用 - 没有等待,selenium只是进入下一步(并且警告我,如果我想离开或停留在页面上,因为“保存...”)。
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) {
}
}
答案 0 :(得分:3)
您可以等待WebElement抛出StaleElementReferenceException,如下所示:
public void waitForInvisibility(WebElement webElement, int maxSeconds) {
Long startTime = System.currentTimeMillis();
try {
while (System.currentTimeMillis() - startTime < maxSeconds * 1000 && webElement.isDisplayed()) {}
} catch (StaleElementReferenceException e) {
return;
}
}
所以你会传递你想要等待的WebElement,以及你想要等待的最大秒数。
答案 1 :(得分:1)
我不确定,但你可以尝试这样的事情:)
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //time in second
WebElement we = driver.findElement(By.id("lblOrderHeaderSaving"));
assertEquals("none", we.getCssValue("display"));
答案 2 :(得分:1)
Webdriver内置了等待功能,您只需要在等待的条件下构建。
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return (driver.findElements(By.id("lblOrderHeaderSaving")).size() == 0);
}
});
答案 3 :(得分:0)
这适用于selenium 2.4.0。你必须使用隐形mehtod才能找到它。
final public static boolean waitForElToBeRemove(WebDriver driver, final By by) {
try {
driver.manage().timeouts()
.implicitlyWait(0, TimeUnit.SECONDS);
WebDriverWait wait = new WebDriverWait(UITestBase.driver,
DEFAULT_TIMEOUT);
boolean present = wait
.ignoring(StaleElementReferenceException.class)
.ignoring(NoSuchElementException.class)
.until(ExpectedConditions.invisibilityOfElementLocated(by));
return present;
} catch (Exception e) {
return false;
} finally {
driver.manage().timeouts()
.implicitlyWait(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
}
}
答案 4 :(得分:0)
我使用以下C#代码来处理此问题,您可以将其转换为Java
public bool WaitForElementDisapper(By element)
{
try
{
while (true)
{
try
{
if (driver.FindElement(element).Displayed)
Thread.Sleep(2000);
}
catch (NoSuchElementException)
{
break;
}
}
return true;
}
catch (Exception e)
{
logger.Error(e.Message);
return false;
}
}
答案 5 :(得分:0)
您也可以尝试等待ajax调用完成。我用它来检查页面加载何时完成并且所有元素都可见。
答案 6 :(得分:0)
您可以使用XPath和WebDriverWait来检查元素的style属性中是否存在display: none
。这是一个示例:
// Specify the time in seconds the driver should wait while searching for an element which is not present yet.
int WAITING_TIME = 10;
// Use the driver for the browser you want to use.
ChromeDriver driver = new ChromeDriver();
WebDriverWait wait = new WebDriverWait(driver, WAITING_TIME);
// Replace ELEMENT_ID with the ID of the element which should disappear.
// Waits unit style="display: none;" is present in the element, which means the element is not visible anymore.
driver.wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='ELEMENT_ID'][contains(@style, 'display: block')]")));
答案 7 :(得分:0)
尝试使用 invisibilityOfElementLocated
方法。
您可以在此处参考示例 How to wait until an element no longer exists in Selenium?