【问题标题】:Selenium+junit - Conflict with a @Rule and an @After methodSelenium+junit - 与 @Rule 和 @After 方法冲突
【发布时间】:2015-12-22 03:35:45
【问题描述】:

我正在努力使工作中的一些测试自动化,并希望添加在测试失败时截取屏幕截图的功能。我知道这可以很容易地用 TestNG 以干净的方式完成,但我们所有的单元/集成测试都使用 jUnit,所以我必须坚持这一点。

我几乎已经准备好它的逻辑/代码并且它正在工作,但我遇到了冲突,因为 @Rule 在 @After tearDown() 方法之后执行,到那时 webDriver 不再存在所以它没有任何东西可以截取屏幕截图。

这是我的代码:

  @Rule
  public TestRule testWatcher = new TestWatcher() {
    @Override
    protected void failed(Throwable e, Description description) {
      File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
      String scrFilename = "Screenshot_"+ DateUtils.now().getTime()+".png";
      File outputFile = new File(screenshotPath, scrFilename);
      try {
        LOGGER.info("Saving screenshot of failed test...");
        FileUtils.copyFile(scrFile, outputFile);
      } catch (IOException ioe) {
        LOGGER.warn("Error taking screenshot");
      }
    }
  };

这是tearDown方法:

  @After
  public void tearDown() {
    LOGGER.info("Quitting browser");
    driver.quit();

    LOGGER.info("Stopping Chrome Driver Service");
    chromeDriverService.stop();
  }

我现在遇到的错误是这样的:

org.openqa.selenium.remote.SessionNotFoundException:会话 ID 是 无效的。调用 quit() 后使用 WebDriver?

这当然是正在发生的事情。它试图在调用driver.quit()chromeDriverService.stop() 之后调用代码进行截图。如果我评论这 2 行,则屏幕截图已正确保存。

处理这个问题的正确方法是什么?有什么办法可以设置它让@Rule 先运行然后@After?

【问题讨论】:

    标签: java selenium junit


    【解决方案1】:

    好的,浏览/搜索更多我发现this question here 正是我想要的答案。我所做的是将拆解代码添加到@Rule 中,然后在try/catch 块之后使用finally 调用它。

      @Rule
      public TestRule testWatcher = new TestWatcher() {
        @Override
        protected void failed(Throwable e, Description description) {
          File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
          String scrFilename = "Screenshot_"+ DateUtils.now().getTime()+".png";
          File outputFile = new File(screenshotPath, scrFilename);
          try {
            LOGGER.info("Saving screenshot of failed test...");
            FileUtils.copyFile(scrFile, outputFile);
          } catch (IOException ioe) {
            LOGGER.warn("Error taking screenshot");
          } finally {
            tearDown();
          }
        }
    
        public void tearDown() {
          LOGGER.info("Quitting browser");
          driver.quit();
    
          LOGGER.info("Stopping Chrome Driver Service");
          chromeDriverService.stop();
        }
      };
    

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 2017-04-28
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2014-09-23
      • 1970-01-01
      相关资源
      最近更新 更多