Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
create test rule for screenshot
Browse files Browse the repository at this point in the history
  • Loading branch information
Patrick Huang committed Jan 7, 2014
1 parent fc7f6df commit 45457d9
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 37 deletions.
46 changes: 23 additions & 23 deletions functional-test/src/main/java/org/zanata/page/WebDriverFactory.java
Expand Up @@ -40,7 +40,7 @@
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import lombok.extern.slf4j.Slf4j;
import org.zanata.util.TestEventListener;
import org.zanata.util.TestEventForScreenshotListener;

import static org.zanata.util.Constants.chrome;
import static org.zanata.util.Constants.firefox;
Expand All @@ -53,8 +53,11 @@ public enum WebDriverFactory {

private volatile WebDriver driver = createDriver();
private DriverService driverService;
private TestEventListener eventListener = new TestEventListener(driver,
System.getProperty("webdriver.screenshot.dir"));
private TestEventForScreenshotListener eventListener;

public static String getScreenshotBaseDir() {
return PropertiesHolder.getProperty("webdriver.screenshot.dir");
}

public WebDriver getDriver() {
return driver;
Expand All @@ -69,20 +72,22 @@ public WebDriver createDriver() {
return driver;
}


public String getHostUrl() {
return PropertiesHolder.getProperty(zanataInstance.value());
}

private WebDriver enableScreenshots(WebDriver webDriver) {
private WebDriver enableScreenshots() {
log.info("Enabling screenshot module...");
webDriver = new Augmenter().augment(webDriver);
String screensDir = System.getProperty("webdriver.screenshot.dir");
eventListener = new TestEventListener(webDriver, screensDir);
return new EventFiringWebDriver(webDriver).register(eventListener);
return EventFiringWebDriver.class.cast(driver).register(eventListener);
}


public void updateListenerTestName(String testName) {
if (eventListener == null && getScreenshotBaseDir() != null) {
eventListener = new TestEventForScreenshotListener(driver,
getScreenshotBaseDir());
driver = enableScreenshots();
}
eventListener.updateTestID(testName);
}

Expand All @@ -105,17 +110,17 @@ private WebDriver configureHtmlDriver() {
private WebDriver configureChromeDriver() {
driverService = new ChromeDriverService.Builder()
.usingDriverExecutable(
new File(PropertiesHolder.properties
new File(PropertiesHolder
.getProperty("webdriver.chrome.driver")))
.usingAnyFreePort()
.withEnvironment(ImmutableMap.of("DISPLAY",
PropertiesHolder.properties
PropertiesHolder
.getProperty("webdriver.display")))
.withLogFile(
new File(PropertiesHolder.properties
.getProperty("webdriver.log"))).build();
new File(PropertiesHolder
.getProperty("webdriver.log"))).build();
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.binary", PropertiesHolder.properties
capabilities.setCapability("chrome.binary", PropertiesHolder
.getProperty("webdriver.chrome.bin"));
capabilities.setCapability("chrome.switches", Arrays
.asList("--start-maximized"));
Expand All @@ -125,18 +130,13 @@ private WebDriver configureChromeDriver() {
throw new RuntimeException("fail to start chrome driver service");
}

WebDriver webDriver =
new RemoteWebDriver(driverService.getUrl(), capabilities);
if (System.getProperty("webdriver.screenshot.dir") != null) {
webDriver = enableScreenshots(webDriver);
}
return webDriver;
return new RemoteWebDriver(driverService.getUrl(), capabilities);
}

private WebDriver configureFirefoxDriver() {
final String pathToFirefox =
Strings.emptyToNull(PropertiesHolder.properties
.getProperty("firefox.path"));
Strings.emptyToNull(PropertiesHolder
.getProperty("firefox.path"));

FirefoxBinary firefoxBinary = null;
if (pathToFirefox != null) {
Expand All @@ -149,7 +149,7 @@ private WebDriver configureFirefoxDriver() {
* firefoxBinary.setTimeout(TimeUnit.SECONDS.toMillis(30));
*/
firefoxBinary.setEnvironmentProperty("DISPLAY",
PropertiesHolder.properties.getProperty("webdriver.display"));
PropertiesHolder.getProperty("webdriver.display"));
return new FirefoxDriver(firefoxBinary, makeFirefoxProfile());
}

Expand Down
Expand Up @@ -23,7 +23,7 @@
public class TestEventForScreenshotListener extends AbstractWebDriverEventListener {

private WebDriver driver;
private String targetDir;
private File baseDir;
private String testId = "";

/**
Expand All @@ -34,10 +34,8 @@ public class TestEventForScreenshotListener extends AbstractWebDriverEventListen
*/
public TestEventForScreenshotListener(WebDriver drv, String targetDirectory) {
driver = drv;
targetDir =
targetDirectory.endsWith("/") ? targetDirectory
: targetDirectory.concat("/");
TestEventForScreenshotListener.log.info("Writing screenshots to {}", targetDir);
baseDir = new File(targetDirectory);
log.info("Writing screenshots to {}", baseDir);
}

/**
Expand All @@ -49,22 +47,20 @@ public void updateTestID(String testId) {
}

private void createScreenshot(String ofType) {
String outputDir;
try {
outputDir = targetDir.concat(testId);
File testIDDir = new File(outputDir);
File testIDDir = new File(baseDir, testId);
testIDDir.mkdirs();
File screenshotFile =
((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshotFile, new File(outputDir
+ File.separator + generateFileName(ofType)));
FileUtils.copyFile(screenshotFile,
new File(testIDDir, generateFileName(ofType)));

} catch (WebDriverException wde) {
throw new RuntimeException("[Screenshot]: Invalid WebDriver: "
+ wde.getMessage());
} catch (IOException ioe) {
throw new RuntimeException("[Screenshot]: Failed to write to "
+ targetDir);
+ baseDir);
} catch (NullPointerException npe) {
throw new RuntimeException("[Screenshot]: Null Object: "
+ npe.getMessage());
Expand Down Expand Up @@ -98,7 +94,7 @@ public void beforeClickOn(WebElement element, WebDriver driver) {
@Override
public void afterClickOn(WebElement element, WebDriver driver) {
if (isAlertPresent(driver)) {
TestEventForScreenshotListener.log.info("[Screenshot]: Prevented by Alert");
log.info("[Screenshot]: Prevented by Alert");
return;
}
createScreenshot("_click");
Expand Down
Expand Up @@ -27,12 +27,12 @@
import org.junit.experimental.categories.Category;
import org.zanata.feature.BasicAcceptanceTest;
import org.zanata.feature.DetailedTest;
import org.zanata.feature.FunctionalTest;
import org.zanata.page.account.ChangePasswordPage;
import org.zanata.page.account.MyAccountPage;
import org.zanata.page.utility.DashboardPage;
import org.zanata.page.utility.HomePage;
import org.zanata.util.AddUsersRule;
import org.zanata.util.TakeScreenshotRule;
import org.zanata.workflow.BasicWorkFlow;
import org.zanata.workflow.LoginWorkFlow;

Expand All @@ -43,12 +43,16 @@
* href="mailto:djansen@redhat.com">djansen@redhat.com</a>
*/
@Category(DetailedTest.class)
public class ChangePasswordTest extends FunctionalTest {
public class ChangePasswordTest {

// Override database class rule
@Rule
public AddUsersRule addUsersRule = new AddUsersRule();

@Rule
public TakeScreenshotRule screenshotRule =
new TakeScreenshotRule();

@Before
public void setUp() {
new BasicWorkFlow().goToHome().deleteCookiesAndRefresh();
Expand Down
@@ -0,0 +1,48 @@
package org.zanata.util;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.junit.rules.ExternalResource;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.zanata.page.WebDriverFactory;

/**
* @author Patrick Huang <a
* href="mailto:pahuang@redhat.com">pahuang@redhat.com</a>
*/
@Slf4j
public class TakeScreenshotRule extends ExternalResource {

private String testDisplayName;

@Override
public Statement apply(Statement base, Description description) {
testDisplayName = description.getDisplayName();
return super.apply(base, description);
}

@Override
protected void before() throws Throwable {
super.before();
WebDriverFactory.INSTANCE.updateListenerTestName(testDisplayName);
String date = new Date().toString();
log.debug("[TEST] {}:{}", testDisplayName, date);
}

@Override
protected void after() {
super.after();
File baseDir = new File(WebDriverFactory.getScreenshotBaseDir());
try {
FileUtils.deleteDirectory(baseDir);
}
catch (IOException e) {
log.warn("error deleting screenshot base directory: {}",
e.getMessage());
}
}
}
1 change: 1 addition & 0 deletions functional-test/src/test/resources/setup.properties
Expand Up @@ -7,6 +7,7 @@ webdriver.chrome.driver=${webdriver.chrome.driver}
webdriver.type=${webdriver.type}
webdriver.log=${webdriver.log}
webdriver.display=${webdriver.display}
webdriver.screenshot.dir=${webdriver.screenshot.dir}
zanata.instance.url=${zanata.instance.url}
zanata.sample.projects.basedir=${zanata.sample.projects.basedir}
zanata.apikey=${zanata.apikey}
Expand Down

0 comments on commit 45457d9

Please sign in to comment.