Selenium 2 and JUnit4: How to capture screenshot o

2019-03-10 00:19发布

I want to capture a screenshot only upon unexpected exception.

1条回答
倾城 Initia
2楼-- · 2019-03-10 00:37

Note.- This answer could be outdated. The answer is based on Selenium 2.15

Using TestWatcher does the trick (the unit test must extend following BaseTest):

public abstract class BaseTest {
// ...
protected WebDriver driver;


@Rule
public TestRule testWatcher = new TestWatcher() {
    @Override
    public void starting(Description desc) {
        LOG.info("Launching browser...");
        driver = Utils.getFirefoxDriver();
    }

    @Override
    public void finished(Description desc) {
        LOG.info("Quitting driver...");
        driver.quit();
    }

    @Override
    public void failed(Throwable e, Description d) {
        LOG.debug("Creating screenshot...");
        File scrFile = ((TakesScreenshot) driver).getScreenshotAs(
                OutputType.FILE);
        String scrFilename = "Screenshot.png";
        File outputFile = new File(SCREEN_SHOTS_RESULTS_PATH, scrFilename);
        LOG.info(scrFilename + " screenshot created.");
        try {
            org.​apache.​commons.​io.FileUtils.copyFile(scrFile, outputFile);
        } catch (IOException ioe) {
            LOG.error("Error copying screenshot after exception.", ioe);
        }
    }
};
}

Note

Utils.getFirefoxDriver() returns a customized WebDriver. Something like:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxBinary;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;

public class Utils {
    // ...
    public static WebDriver getFirefoxDriver() {
        FirefoxProfile firefoxProfile = new FirefoxProfile();

        // Profile customization. For example:
        // firefoxProfile.addExtension("firebug-1.8.4-fx.xpi");
        // firefoxProfile.setPreference("extensions.firebug.currentVersion","1.8.4");

        FirefoxBinary firefox = new FirefoxBinary();

        // Firefox customization. For example:
        // firefox.setEnvironmentProperty("DISPLAY", display);

        WebDriver driver = new FirefoxDriver(firefox, firefoxProfile);

        // WebDriver customizations. For example:
        // driver.manage().timeouts().implicitlyWait(SHORT_TIMEOUT_S, TimeUnit.SECONDS);
        return driver;
    }
}
查看更多
登录 后发表回答