如何等待元素不可见

时间:2017-06-19 15:49:06

标签: c# selenium pageobjects

我需要等待一个元素不可见 并为此找到了几个解决方案,但它们似乎都不适合我。

我认为问题是因为我正在使用PageObject Models。但我不完全确定。

 public static void WaitForElementToBeInvisible(this Browser browser, IWebElement element, int seconds = 30)
        {
            var wait = new WebDriverWait(browser.Driver, new TimeSpan(0, 0, seconds));
            wait.Until(ExpectedConditions.InvisibilityOfElementLocated(element));
        }

但它返回错误cannot convert from IWebElement to Selenium.By

提前致谢

4 个答案:

答案 0 :(得分:1)

简短的回答,这是不可能的。 Selenium的开发人员已经确定没有有用的用例。

如果可以使用By定位器,您可以使用:

  public static void WaitUntilInvisible(this By locator)
        {
            try
            {
                if (Driver.FindElement(locator).Displayed)
                {
                    wait.Until(ExpectedConditions.ElementIsVisible(locator));
                }
        }

另请参阅:Trying to convert IWebElement into a By element

答案 1 :(得分:1)

您的代码不正确。它调用InvisibilityOfElementLocated,它不接收IWebElement作为参数。请参阅下面的示例。

public static bool WaitForElementToBeInvisible(this IWebElement element, int timeoutSecond = 10)
{
    IWait<IWebElement> wait = new DefaultWait<IWebElement>(element);
    wait.Timeout = TimeSpan.FromSeconds(timeoutSecond);
    wait.PollingInterval = TimeSpan.FromMilliseconds(300);
    try
    {
        wait.Until(!element.Displayed);
    }
    catch (WebDriverTimeoutException)
    {
        return false;
    }

    return true;
}

IWebElement div = driver.FindElement(By.Id("id"));
var result = div.WaitForElementToBeInvisible(5);

答案 2 :(得分:0)

感谢所有的答案,但是这样解决了。

public static void WaitUntilInvisible(this Browser browser, By element, int seconds = 30)
        {
            var wait = new WebDriverWait(browser.Driver, new TimeSpan(0, 0, seconds));
            wait.Until(ExpectedConditions.InvisibilityOfElementLocated(element));
        }

然后用作By Locator

By LoadingIcon = By.XPath(".//*[contains(@class, 'loading')]");

就像一个魅力:)

答案 3 :(得分:0)

do { Playback.Wait(100); } while (_driver.FindElements(By.Id("elementId")).Count() > 0);