我有一段代码,例如
DefaultWait<IWebDriver> wait = new DefaultWait<IWebDriver>(driver);
wait.PollingInterval = TimeSpan.FromMilliseconds(250);
wait.Message = "Can't find element";
wait.Timeout = TimeSpan.FromSeconds(30);
driver.Navigate().GotoUrl('.....');
IWebElement elem = wait.Until(x => x.FindElement(By.ClassName("abc")));
现在假设我导航到的URL不包含具有类名“abc”的元素。
我对DefaultWait的理解是它应该通过每250毫秒轮询并在30秒后超时来找到该元素。但我明白了 它几乎立即返回元素不存在或抛出异常。
我有点困惑,因为技术上在10秒左右之后,DOM可能已经被改变以创建该类的元素并且等待应该是成功的/或者可能是成功的。
所以问题是DefaultWait的行为是什么?它应该等到给定的超时还是我完全错过了DefaultWait的行为?
答案 0 :(得分:2)
让ElementExists
预期条件处理此问题最容易。
IWebElement elem = new WebDriverWait(Driver, TimeSpan.FromSeconds(30))
.Until(ExpectedConditions.ElementExists(By.ClassName("abc"));
您的示例未按预期工作的原因是因为FindElement
在失败时抛出异常。你可以修改你的例子来使用FindElements
,它会愉快地返回一个空集合,但即使这样,你也需要添加逻辑来处理一个空集合,因为DefaultWait.Until
会考虑任何非空的返回值得成功。
最简单的方法是使用ExpectedConditions
中提供的逻辑为您完成所有繁重的任务。
默认轮询间隔为500毫秒。您可以通过传入可选的第三个参数来设置轮询间隔,如下所示:
IWebElement elem =
new WebDriverWait(Driver,
TimeSpan.FromSeconds(30), // time out
TimeSpan.FromMilliseconds(250)) // polling interval
.Until(ExpectedConditions.ElementExists(By.ClassName("abc"));