2

如果这个问题已经被问过/回答,我真的很抱歉。但我找不到它。

请原谅我的无知,因为我是 WebDriver 的新手。

当页面最初加载时,它会显示一个 LOADING DIV,直到所有数据都加载完毕。在我继续对页面元素执行其他操作之前,如何才能等到该 div 被隐藏?

我想知道如下:

    public static void waitForPageLoad(string ID, IWebDriver driver)
    {
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
        IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
        {
            return d.FindElement(By.Id(ID));
        });
    }

我将一些其他元素的 ID 传递给这个函数,当 LOADING DIV 消失时我将使用它。它返回错误的结果,因为 ID 的元素实际上存在/已加载,但位于显示“正在加载...请稍候”消息的灰色 DIV 后面。所以这不起作用。我想知道那个 LOADING div 什么时候消失。

任何帮助是极大的赞赏。

4

1 回答 1

7

通过等待bool值而不是IWebElement,.NETWebDriverWait类将等到true返回值 。鉴于此,尝试以下方法怎么样:

public static void WaitForElementToNotExist(string ID, IWebDriver driver)
{
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    wait.Until<bool>((d) =>
    {
        try
        {
            // If the find succeeds, the element exists, and
            // we want the element to *not* exist, so we want
            // to return true when the find throws an exception.
            IWebElement element = d.FindElement(By.Id(ID));
            return false;
        }
        catch (NoSuchElementException)
        {
            return true;
        }
    });
}

请注意,如果您要查找的元素实际上已从 DOM 中删除,则这是适当的模式。另一方面,如果“等待”元素始终存在于 DOM 中,但只是根据您的应用程序使用的 JavaScript 框架的要求使其可见/不可见,那么代码会更简单一些,看起来像这样:

public static void WaitForElementInvisible(string ID, IWebDriver driver)
{
    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    wait.Until<bool>((d) =>
    {
        try
        {
            IWebElement element = d.FindElement(By.Id(ID));
            return !element.Displayed;
        }
        catch (NoSuchElementException)
        {
            // If the find fails, the element exists, and
            // by definition, cannot then be visible.
            return true;
        }
    });
}
于 2013-04-29T16:03:54.983 回答