硒-等待元素不可见

本文关键字:元素 等待 | 更新日期: 2023-09-27 17:53:08

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

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

是否可以告诉驾驶员等待,直到该元素不可见?

硒-等待元素不可见

是的,使用方法invisibilityOfElementLocated 是可能的

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

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

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

如果找不到id为processing的元素,它将引发异常。

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

其想法是等待元素不可见。第一行设置元素必须消失的等待时间;现在是10秒。第二行使用硒来检查是否满足条件"元素不可见"。元素是根据其id找到的,就像在主题情况下一样,即id="processing"。如果元素在请求的时间段内没有消失,则会引发Timeout异常,测试将失败。

截至2020年,ExpectedConditions在.NET.中已弃用

由于某种原因,我无法使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);

使用不可见性方法,下面是一个用法示例。

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

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

wait.Until(d => d.FindElements(By.Id("processing")).Count == 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;
    }

是的,您可以创建自己的ExpectedCondition,只需将可见恢复为不可见。

以下是如何在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))

我知道这是旧的,但由于我正在寻找解决方案,我想我应该添加我的想法。

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

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

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

System.Threading.Thread.Sleep(20000(;