0

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メソッドでブラウザーを閉じたいと考えています。

それを行う方法はありますか?

4

1 に答える 1

3

問題は、次のコードが原因です。

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

driver.quit()、すべてのテストの後にブラウザを閉じようとしています。のコールバックメソッドの前に実行されていますTestWatcher。これTestWatcherにより、 のハンドルを取得できなくなりdriverます。@AfterClassまたはのようなより制限的なライフサイクル アノテーションを使用してみてください@AfterSuite

于 2013-11-12T03:48:30.267 に答える