Selenium测试:编写更强大的测试

时间:2014-07-08 14:44:31

标签: java selenium

我正在尝试使用Selenium Webdriver自动执行涉及JavaServer Page的任务。我已经构建了一个大约90%的时间都可以运行的测试,这意味着Webdriver可以完成所有任务而不会出现任何错误。在测试期间,浏览器执行以下操作:

  • 打开一个页面
  • 点击链接并切换窗口
  • 关闭原始窗口
  • 登录系统
  • 切换帧
  • 点击链接
  • 填写表格
  • 提交表单
  • ...更多类似的任务

不幸的是,有些时候Webdriver会在其中一个步骤中随机失败。这是因为它无法找到某些内容,例如“找不到帧”,“无法找到带链接文本的元素......”以及其他类似错误。我不确定为什么有时会发生这种情况,并且它似乎在测试的不同阶段随机发生。我搜索了一个解决方案,我能做的最好的事情就是在程序的各个阶段使用thread.sleep减慢Webdriver的速度。这似乎是解决问题的一种非常随意的方式,我甚至不确定问题是驱动程序移动得太快。即使我放慢了半秒钟,我仍然有时会出错。我是Selenium的新用户,我不知道这通常是个问题。有没有人有更好的方法来解决这个问题?我忽略了一些简单的事情吗?

2 个答案:

答案 0 :(得分:1)

这是一个常见问题,而不是使用Thread.sleep(duration),您应该更好地创建一些实用工具方法,例如

public WebElement waitForElementPresent(By by, int timeout) {

    WebDriverWait wait = new WebDriverWait(driver, timeout);
    WebElement element = null;
    try {
        element = wait.until(ExpectedConditions.presenceOfElementLocated(by));
    } catch (TimeoutException e) {
        e.printStackTrace();
    }
    return element;
}

这样一来,如果元素已经存在,你就不会等待,如果它正在加载它会等到它找到它或者直到超时被触发

答案 1 :(得分:1)

我最初使用线程休眠来开发我的脚本。但是,尽管脚本在开发过程中起作用,但在生产运行中不可实现,因为它不一致地失败 - 这增加了挫败感。这是因为线程休眠利用固定的等待时间,如果元素没有及时附加,它将无法通过测试。 singe31 已经提供了有效的解决方案。另一种解决方案是使用 fluentWait

public void fluentWait(final By by)
{
    FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)
               .withTimeout(60, 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(by);
             }
           });
}

在这里,Selenium Webdriver将等待至少60秒才能找到一个元素,直到它抛出TimeOutException。否则,它将轮询DOM以每5秒找到一个元素,如果找不到该元素,将忽略“NoSuchElementException”异常。

您必须面对的另一个问题是StaleStateReference或NoSuchElementException。您可以查看this link以解决该问题。

希望它有所帮助。