Selenium - 等到元素不可见

use*_*239 28 c# selenium-webdriver

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

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

是否可以告诉驱动程序等到该元素不可见?

TDH*_*DHM 33

是的,方法可行 invisibilityOfElementLocated

wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
Run Code Online (Sandbox Code Playgroud)

  • 令人厌恶的一点是你需要等待隐式等待的持续时间.恼人的意外实施.(硒2.48.2) (2认同)
  • @Coops,截至2017年,现在也可用于C#. (2认同)

Rus*_*Cam 10

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

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

如果找不到带有id的元素,它将抛出异常processing.


Me *_*ies 6

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

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

  • 当然。我认为这是自我解释的,我的错。主题是:等到元素不可见。第一行设置元素必须消失的等待时间,这里是 10 秒。第二行使用 selenium 检查是否满足条件“invisibilityofElementLocated”。元素通过它的 id 找到,如主题案例,即 id="processsing" 如果元素在请求的时间内不会消失,则会引发超时异常并且测试将失败。 (2认同)

Jas*_*n D 5

自 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

WaitUntilElementNotVisible(By.Id("processing"), 10);
Run Code Online (Sandbox Code Playgroud)