Selenium - 等到元素不可见

时间:2014-03-25 20:54:54

标签: c# selenium-webdriver

在下面的代码中,我尝试等到元素可见:

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("processing")));

是否可以告诉司机等到该元素不可见?

10 个答案:

答案 0 :(得分:30)

是的,可以使用方法invisibilityOfElementLocated

wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));

答案 1 :(得分:10)

以下内容应等到元素不再显示,即不可见(或10秒后超时)

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(driver => !driver.FindElement(By.Id("processing")).Displayed);

如果找不到标识为processing的元素,则会抛出异常。

答案 2 :(得分:5)

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("processing")));

想法是等到元素不可见。第一行设置元素必须消失的等待时间;这里10秒钟。第二行使用selenium检查条件" invisibilityofElementLocated"满足了。元素通过其id在主题案例中找到,即id="processing"。如果元素在请求的时间段内没有消失,则会引发超时异常并且测试将失败。

答案 3 :(得分:2)

从2020年开始,.NET中不赞成使用ExpectedConditions。

由于某种原因,我无法使IgnoreExceptionTypes正常工作。

唯一适用于我的解决方案是Anoop提出的解决方案。我喜欢他的解决方案的一件事是,一旦元素变得不可见,它就会立即返回。

我将他的解决方案概括如下:

//returns as soon as element is not visible, or throws WebDriverTimeoutException
protected void WaitUntilElementNotVisible(By searchElementBy, int timeoutInSeconds)
{
    new WebDriverWait(_driver, TimeSpan.FromSeconds(timeoutInSeconds))
                    .Until(drv => !IsElementVisible(searchElementBy));
}

private bool IsElementVisible(By searchElementBy)
{
    try
    {
        return _driver.FindElement(searchElementBy).Displayed;

    }
    catch (NoSuchElementException)
    {
        return false;
    }
}

用法:

WaitUntilElementNotVisible(By.Id("processing"), 10);

答案 4 :(得分:1)

使用隐身方法,这是一个示例用法。

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

答案 5 :(得分:0)

我知道这已经过时了,但是因为我正在寻找解决方案,我想我会添加自己的想法。

如果设置IgnoreExceptionTypes属性,则上面给出的答案应该有效:

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.IgnoreExceptionTypes = new[] { typeof(NoSuchElementException) }
wait Until(driver => !driver.FindElement(By.Id("processing")).Displayed);

答案 6 :(得分:0)

public void WaitForElementNotVisible(string id, int seconds)
    {

        try
        {
            var wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(seconds));                   
            wait.Until(driver1 => !visibility(id));
            Console.WriteLine("Element is not visible..");
        }
        catch (WebDriverTimeoutException)
        {
            Assert.Fail("Element is still visible..");
        }


    }


    bool visibility(string id)
    {
        bool flag;
        try
        {
            flag = driver.FindElement(By.Id(locator)).Displayed;
        }
        catch (NoSuchElementException)
        {
            flag = false;
        }
        return flag;
    }

答案 7 :(得分:0)

是的,您可以创建自己的预期条件,只需将其隐藏为不可见

以下是如何在python中执行此操作:

from selenium.webdriver.support.expected_conditions import _element_if_visible

class invisibility_of(object):

    def __init__(self, element):
        self.element = element

    def __call__(self, ignored):
        return not _element_if_visible(self.element)

以及如何使用它:

wait = WebDriverWait(browser, 10)
wait.until(invisibility_of(elem))

答案 8 :(得分:0)

您可以使用driver.FindElements来访问不存在的项目。

wait.Until(d => d.FindElements(By.Id("processing")).Count == 0);

答案 9 :(得分:-14)

在下面的代码中用于停止驱动程序几秒钟

System.Threading.Thread.Sleep(20000);