package pl.webtest.util; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.Augmentable; import org.openqa.selenium.remote.Augmenter; import org.openqa.selenium.remote.ScreenshotException; import org.openqa.selenium.support.events.EventFiringWebDriver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pl.webtest.Config; /** * Webdriver utilities */ public class WebDriverUtils { private static final Logger logger = LoggerFactory.getLogger(WebDriverUtils.class); private WebDriverUtils() {} /** * Save screen shot method * @param webDriver * @param screenshotName name of the screenshot. It will be saved under @code Config.SCREENSHOT_FOLDER location. * @return created screenshot file. null will be returned if the were some problems with creating the screenshot file. */ public static File saveScreenshot(WebDriver webDriver, String screenshotName) { File dest = null; try { WebDriver returned = null; if (webDriver instanceof EventFiringWebDriver) { // Unwrap real webdriver EventFiringWebDriver eventFiringWebDriver = (EventFiringWebDriver)webDriver; webDriver = eventFiringWebDriver.getWrappedDriver(); } if(webDriver.getClass().isAnnotationPresent(Augmentable.class)) { //Augmenter can only be called on RemoteWebDriver and none of the child classes. See https://code.google.com/p/selenium/issues/detail?id=5087 returned = new Augmenter().augment(webDriver); } else { returned = webDriver; } if (returned != null) { File src = ((TakesScreenshot) returned).getScreenshotAs(OutputType.FILE); try { dest = getScreenshotFile(screenshotName); FileUtils.copyFile(src, dest); logger.debug("Screenshot saved to " + dest.getAbsolutePath()); } catch (IOException e) { logger.error("Error saving screenshot", e); } } } catch (ScreenshotException e) { logger.error("Error taking screenshot", e); } return dest; } private static File getScreenshotFile(String screenshotName) { File screenshotFolderFile = new File(Config.SCREENSHOT_FOLDER); screenshotFolderFile.mkdirs(); return new File(screenshotFolderFile, screenshotName + ".png"); } }