如果已经询问/回答了这个问题,我真的很抱歉。但是我找不到它。
请原谅我的无知,因为我是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消失了。
非常感谢任何帮助。
答案 0 :(得分:7)
通过等待bool
值而不是IWebElement
,.NET WebDriverWait
类将一直等到返回值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;
}
});
}