2013-11-12 7 views
0

Я использую 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.

Есть ли способ, которым я могу это сделать?

+0

Почему у вас нет метода '@ Before', который повторно запускает ваш класс' WebDriver'? –

+0

Потому что в моем классе TestGoogleHomePage я использую public TestGoogleHomePage() { \t \t super(); \t}, чтобы инициализировать мой класс Webdriver, и если я поместил \ @Before на этот конструктор, он будет жаловаться, что @before находится в незаконном месте. Но похоже, что он всегда будет повторно инициализировать класс Webdrive для каждого теста, даже без \ @before. – nzsquall

ответ

2

Проблема в том, что в следующем коде:

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

driver.quit() пытается закрыть браузер после каждого теста; и он выполняется перед обратными методами вашего TestWatcher. Это предотвращает получение TestWatcher от ручки driver. Попробуйте использовать более ограничительную аннотацию цикла жизни, например @AfterClass или @AfterSuite.

+0

Привет, спасибо за ваш ответ. Я изменил '@ After' на' @ AfterSuite', и снимки экрана были сохранены правильно. Но открытые браузеры не закрыты, почему? Благодарю. – nzsquall

+0

@nzsquall Драйвер = новый FirefoxDriver(); предпочтительно делать в методе counter-part для драйвера.quit(). Например, если вы делаете driver.quit() в AfterSuite, вы можете сделать новый бит FireFoxDriver() в BeforeSuite. – aquaraga

+0

Привет aquaraga, извините, я стараюсь, и это не работает хорошо для меня. – nzsquall

Смежные вопросы