用于轮询的DefaultWait <t> .until行为

时间:2016-05-10 00:59:45

标签: c# selenium-webdriver

我有一段代码,例如

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的行为?

1 个答案:

答案 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"));