Я использую Java с Webdriver, и у меня возникла проблема с получением скриншотов с неудачным тестом.Невозможно сделать скриншоты с Selenium WebDriver, используя Java, когда тест JUnit завершился неудачно
Мой JUnit тест:
....
public class TestGoogleHomePage extends Browser {
....
@Test
public void testLoadGoogle() {
//this test will fail
}
}
Мой класс 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");
}
// 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: FirefoxDriver нельзя использовать после вызова quit().
Похоже, он жалуется на мой метод @After.
Я попытался изменить класс браузера быть:
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
.
Есть ли способ, которым я могу это сделать?
Почему у вас нет метода '@ Before', который повторно запускает ваш класс' WebDriver'? –
Потому что в моем классе TestGoogleHomePage я использую public TestGoogleHomePage() { \t \t super(); \t}, чтобы инициализировать мой класс Webdriver, и если я поместил \ @Before на этот конструктор, он будет жаловаться, что @before находится в незаконном месте. Но похоже, что он всегда будет повторно инициализировать класс Webdrive для каждого теста, даже без \ @before. – nzsquall