WebDriver不使用最新的页面源

时间:2012-02-08 16:24:38

标签: selenium webdriver

我在针对基于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在第二次调用时不考虑刷新的页面源?

谢谢!

2 个答案:

答案 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不允许访问隐藏元素,并且隐藏了这个范围。

http://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions#Q:_Why_is_it_not_possible_to_interact_with_hidden_elements

我已经使用了上面链接中描述的基于JavaScript的解决方案。