我在针对基于Oracle SSXA的站点执行Selenium 2.18 WebDriver测试时遇到了问题,该站点转换为大量弹出窗口,加载Ajax的内容和iframe。对于给定页面,基于手动观察,页面最初加载空sslw_doc_content_id span(无文本)。大约一秒钟后,跨度仍然存在且包含文本。
要检查此页面是否已加载,我正在使用带有谓词的WebDriverWait,该谓词检查sslw_doc_content_id span是否包含非空文本:
new Predicate<WebDriver>() {
@Override
public boolean apply(final WebDriver input) {
return StringUtils.isNotEmpty(input.findElement(By.id("sslw_doc_content_id")).getText());
}
}
不知何故,WebDriver总是找到WebElement,但在调用WebElement.getText()时总是返回一个空字符串。所以这个谓词总是评估为假。
使用Chrome或Firefox检查页面显示该元素存在且确实有文本。在调试谓词时,我发现input.getPageSource()包含第一次调用时没有文本的span,但是input.getPageSource()包含第二次调用时带有一些文本的span(页面是ajax之后) -refreshed)。
为什么WebDriver在第二次调用时不考虑刷新的页面源?
谢谢!
答案 0 :(得分:0)
你可以尝试循环:
int seconds = 0;
for (int seconds =0; seconds<30; seconds++) {
if (apply(driver)){
break;
}
Thread.sleep(1000);
}
如果文本在那里,上面的循环将每秒检查并执行30秒。如果找到它,它将逃脱循环。您仍然可以在以下后再添加一项检查:
if (!apply(driver)){
throw new RuntimeException("Expected text still not there");
}
或者我正在使用的另一种方法:Whenewer我有很长时间加载的页面,我选择在页面的最后加载的元素并以相同的方式检查它的存在:
for (int seconds =0; seconds<30; seconds++){
try{
driver.findElement(By.id("lastelementonpage"));
}catch (Exception e){
Thread.sleep(1000);
}
}
答案 1 :(得分:0)
事实证明,WebDriver不允许访问隐藏元素,并且隐藏了这个范围。
我已经使用了上面链接中描述的基于JavaScript的解决方案。