selenium :等待元素消失

wsxa1bj1  于 2023-01-20  发布在  其他
关注(0)|答案(9)|浏览(327)

我提出了一项艰巨的任务。我对 selenium 相当陌生,仍在研究等待元素等的功能。
我不得不在一个网站上操作一些数据,然后转到另一个网站。问题:操纵调用一个脚本,使一个小的“保存...”标 checkout 现,而操纵的数据正在后台处理。我必须等待,直到我可以继续到下一个网站。
这就是:我该如何等待和元素消失?事情是:它总是存在于DOM中,但只有通过一些脚本才能显示(我想,请参见下图)。x1c 0d1x
这是我尝试过的,但它就是不起作用-没有等待, 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“显示”从“阻塞”变为另一状态。

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) {

        }
    }
f5emj3cl

f5emj3cl1#

您可以等待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以及要等待的最大秒数。

s4chpxco

s4chpxco2#

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);
 }
});
pxyaymoc

pxyaymoc3#

我不确定,但你可以试试这样的东西:)

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //time in second
WebElement we = driver.findElement(By.id("lblOrderHeaderSaving"));   
assertEquals("none", we.getCssValue("display"));
voj3qocg

voj3qocg4#

这是 selenium 2.4.0版的,你必须用隐形方法才能找到它。

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);
    }
}
uqxowvwt

uqxowvwt5#

我用下面的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;
        }
    }
qxsslcnc

qxsslcnc6#

你也可以尝试等待 AJAX 调用完成,我已经用它来检查页面加载完成和所有元素可见的时间。
代码如下-https://stackoverflow.com/a/46640938/4418897

5hcedyr0

5hcedyr07#

你可以使用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')]")));
1hdlvixo

1hdlvixo8#

尝试使用invisibilityOfElementLocated方法。您可以在此处引用示例How to wait until an element no longer exists in Selenium?

pgpifvop

pgpifvop9#

enter image description here我为元素从dom中消失创建了自己的方法....
在条件类中(在.m2\存储库\组织\ selenium hq\ selenium \ selenium 支持\3.141.59\ selenium 支持-3.141.59.jar!\组织\openqa\ selenium \支持\ui\预期条件类中)
我们可以看到"isInvisible“方法与”isDisplayed“方法,,,我对”isEnabled“编写了相同的内容

public static ExpectedCondition<Boolean> invisibilityOf(final WebElement element) {
    return new ExpectedCondition<Boolean>() {

        @Override
        public Boolean apply(WebDriver webDriver) {
            return isRemovedFromDom(element);
        }

        @Override
        public String toString() {
            return "invisibility of " + element;
        }
    };
}

private static boolean isRemovedFromDom(final WebElement element) {
    try {
        return !element.isEnabled();
    } catch (StaleElementReferenceException ignored) {
        return true;
    }
}

相关问题