【问题标题】:Selenium Testing: Programming a more robust testSelenium 测试:编写更健壮的测试
【发布时间】:2014-07-08 14:44:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: java selenium


    【解决方案1】:

    我最初也是这样做的,使用线程睡眠来开发我的脚本。然而,即使脚本在开发过程中工作,但它会在生产运行中不可靠,因为它会不一致地失败 --这会增加挫败感。这是因为线程睡眠使用固定的等待时间,如果元素没有及时附加,它将无法通过测试。 singe31​​strong> 给出了一个有效的解决方案。另一种解决方案是使用 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。否则,它将每 5 秒轮询 DOM 以查找元素,如果未找到该元素,“NoSuchElementException”异常将被忽略。

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

    希望对你有帮助。

    【讨论】:

    • 如果元素等待不是问题怎么办。元素已加载,但有时 Selenium 会单击它,有时则不会。由于点击后的测试(基于它)随机失败。
    【解决方案2】:

    这是一个常见问题,而不是使用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;
    }
    

    这样,如果元素已经存在,您将不会等待,如果它正在加载,它将等待直到找到它或触发超时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2021-08-06
      • 1970-01-01
      相关资源
      最近更新 更多