我正在使用 Selenium 的 FireFox WebDriver。我有一个通过 AJAX 加载的窗口,因此我的测试不一致。
我可以在线程上延迟 3 秒,它每次都有效。我所做的只是检查一行的存在。
最好的方法是什么?
我正在使用 Selenium 的 FireFox WebDriver。我有一个通过 AJAX 加载的窗口,因此我的测试不一致。
我可以在线程上延迟 3 秒,它每次都有效。我所做的只是检查一行的存在。
最好的方法是什么?
据推测,您的 Selenium 测试应该模拟使用该站点的人,因此您为规避人类会做的事情(坐着等待)所做的任何事情都可能导致错误的结果。在这种情况下,我认为在 AJAX 加载(或失败)然后报告该延迟时添加延迟没有问题。
最好的方法(恕我直言)是使用流利的等待。无论如何,您都有所需元素的定位器(xpaths 或 css 选择器等)并将定位器传递给 fluentWait 函数,您将获得所需的 Web 元素进行交互。
fluentWait
功能代码如下:
public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo; } ;
需要注意的是,每个 FluentWait 实例都定义了等待条件的最长时间,以及检查条件的频率。此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在页面上搜索元素时的 NoSuchElementExceptions。(c)selenium API 文档
因此,您可以设置
.pollingEvery(1, TimeUnit.SECONDS)
并在此间隔期间验证您的 AJAX 是否返回。
一些关于流利等待的添加信息你可以在这里阅读
认为
String cssLocator=...blablabla.. // is the css of the table row
你传递给函数:
WebElement firstRow= fluentWait(By.cssSelector(cssLocator));
并以这种方式获得表格的第一行。
希望你现在清楚了)