Selenium:等待一个元素确实消失了

时间:2014-07-02 15:54:32

标签: java selenium wait invisible

我提出了一项艰巨的任务。我对硒很新,并且仍然在研究等待元素和类似物的功能。

我必须操纵网站上的一些数据,然后继续操作另一个。问题:操作调用一个脚本,当在后台处理操纵数据时,会出现一个“Saving ...”标签。我必须等到可以进入下一个网站。

所以这里是: 我如何等待和元素消失?事情是:它始终存在于DOM中,但只能通过某些脚本显示(我想,见下图)。 The palish code contains the said element

这就是我尝试过但它只是不起作用 - 没有等待,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) {

        }
    }

8 个答案:

答案 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调用完成。我用它来检查页面加载何时完成并且所有元素都可见。

以下是代码 - https://stackoverflow.com/a/46640938/4418897

答案 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?