我正在使用带有Webdriver的Java,而我在测试失败时遇到屏幕截图有问题。
我的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
方法关闭浏览器。
我有办法做到吗?
答案 0 :(得分:3)
问题在于以下代码:
@After
public void closeBrowser() {
driver.quit();
}
driver.quit()
试图在每次测试后关闭浏览器;它会在您TestWatcher
的回拨方法之前执行。这阻止了TestWatcher
获取driver
的句柄。尝试使用限制性更强的生命周期注释,例如@AfterClass
或@AfterSuite
。