0

我正在将 Java 与 Webdriver 一起使用,但在测试失败时截屏时遇到问题。

我的 jUnit 测试:

....
public class TestGoogleHomePage extends Browser {

....
@Test
public void testLoadGoogle() {
//this test will fail
}
}

我的浏览器类:

public class Browser {
protected static WebDriver driver;

public Browser() {
    driver = new FirefoxDriver();
}

.....
@Rule
public TestWatcher watchman = new TestWatcher() {

    @Override
    protected void failed(Throwable e, Description description) {
        File scrFile = ((TakesScreenshot) driver)
                .getScreenshotAs(OutputType.FILE);
        try {
            FileUtils.copyFile(scrFile, new File(
                    "C:\\screenshot.png"));
        } catch (IOException e1) {
            System.out.println("Fail to take screen shot");
        }
        // this won't work
        // driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    }

    @Override
    protected void succeeded(Description description) {
     ....
    }
};

@After
public void closeBrowser() {
    driver.quit();
}

}

测试的执行将导致以下错误消息(错误消息的一部分):

org.openqa.selenium.remote.SessionNotFoundException:调用 quit() 后无法使用 FirefoxDriver。

看起来它在抱怨我的 @After 方法。

我试图将 Browser 类更改为:

public class Browser {
protected static WebDriver driver;

public Browser() {
    driver = new FirefoxDriver();
}

.....
@Rule
public TestWatcher watchman = new TestWatcher() {

    @Override
    protected void failed(Throwable e, Description description) {
        File scrFile = ((TakesScreenshot) driver)
                .getScreenshotAs(OutputType.FILE);
        try {
            FileUtils.copyFile(scrFile, new File(
                    "C:\\screenshot.png"));
        } catch (IOException e1) {
            System.out.println("Fail to take screen shot");
        }
        driver.quit();
    }

    @Override
    protected void succeeded(Description description) {
     ....
     driver.quit();
    }
};

}

上面的代码工作正常。但我不想在那里退出驱动程序,因为每次测试运行后我可能还想清理其他东西,并且我想在@After方法中关闭浏览器。

有没有办法我可以做到这一点?

4

1 回答 1

3

问题是由于以下代码:

@After
public void closeBrowser() {
    driver.quit();
}

driver.quit()每次测试后都试图关闭浏览器;它在你的回调方法之前被执行TestWatcher。这是防止TestWatcher获取driver. 尝试使用更严格的生命周期注释,例如@AfterClassor @AfterSuite

于 2013-11-12T03:48:30.267 回答