js/core: Take Screenshots with Driver, not import
`import` is not necessarily defined on all machines, so it's better to
use the driver (ChromeDriver) to take the screenshots for us.
Closes https://github.com/vanadium/issues/issues/assigned/afandria
MultiPart: 1/3
Change-Id: Iffa688dbd1e5eeebd03673c67c06a95ee6825c91
diff --git a/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java b/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java
index 68dcd47..474c1f3 100644
--- a/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java
+++ b/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java
@@ -6,6 +6,7 @@
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
+import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
@@ -32,7 +33,7 @@
protected void failed(Throwable e, Description description) {
// Take a screenshot for the current screen and write the html report.
HTMLReportData data = uiTest.getCurrentHTMLReportData();
- Util.takeScreenshot("test-failed.png", "Test Failed", data);
+ Util.takeScreenshot((TakesScreenshot)driver, "test-failed.png", "Test Failed", data);
HTMLReporter reporter = new HTMLReporter(data);
try {
reporter.generateReport();
diff --git a/test/ui/src/test/java/io/v/webdriver/Util.java b/test/ui/src/test/java/io/v/webdriver/Util.java
index 46e81a0..b677e80 100644
--- a/test/ui/src/test/java/io/v/webdriver/Util.java
+++ b/test/ui/src/test/java/io/v/webdriver/Util.java
@@ -6,6 +6,12 @@
import io.v.webdriver.htmlreport.HTMLReportData;
+import org.openqa.selenium.OutputType;
+import org.openqa.selenium.TakesScreenshot;
+import org.openqa.selenium.WebDriver;
+
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -56,27 +62,28 @@
/**
* Takes a screenshot.
*
- * <p>It uses the "import" command, saves it to the given file, and records it in the given
- * htmlReportData.
+ * <p>It uses the WebDriver to grab the screenshot data, saves it to the given file,
+ * and records it in the given htmlReportData.
*
+ * @param TakesScreenshot a driver that can getScreenshotAs, such as a ChromeDriver.
* @param fileName the file to save the screenshot to.
* @param caption the caption of the screenshot.
* @param htmlReportData the data model to add screenshot data to.
*/
- public static void takeScreenshot(String fileName, String caption,
- HTMLReportData htmlReportData) {
+ public static void takeScreenshot(TakesScreenshot taker, String fileName,
+ String caption, HTMLReportData htmlReportData) {
+
String fullFileName =
- String.format("%s-%s", getSafeFilename(htmlReportData.getTestName()), fileName);
+ String.format("%s-%s", getSafeFilename(htmlReportData.getTestName()), fileName);
Runtime rt = Runtime.getRuntime();
try {
- String imagePath = String.format("%s/%s", htmlReportData.getReportDir(), fullFileName);
- Process pr = rt.exec(
- String.format("import -window root -crop 1004x748+10+10 -resize 800 %s", imagePath));
- int retValue = pr.waitFor();
- if (retValue != 0) {
- System.err.println(String.format("Failed to capture screenshot: %s", imagePath));
- }
+ byte[] imageData = taker.getScreenshotAs(OutputType.BYTES); // throws WebDriverException
+ File imageFile = new File(htmlReportData.getReportDir(), fullFileName);
+ FileOutputStream fos = new FileOutputStream(imageFile);
+ fos.write(imageData);
+ fos.close();
} catch (Exception e) {
+ System.err.printf("Failed to copy screenshot to %s/%s\n", htmlReportData.getReportDir(), fullFileName);
e.printStackTrace();
}
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/ChromeSignInPage.java b/test/ui/src/test/java/io/v/webdriver/commonpages/ChromeSignInPage.java
index 6b51909..bcf1569 100644
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/ChromeSignInPage.java
+++ b/test/ui/src/test/java/io/v/webdriver/commonpages/ChromeSignInPage.java
@@ -5,6 +5,7 @@
package io.v.webdriver.commonpages;
import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.TakesScreenshot;
import io.v.webdriver.RobotHelper;
import io.v.webdriver.Util;
@@ -42,7 +43,7 @@
robotHelper.enter();
robotHelper.enterText(password);
robotHelper.tab();
- Util.takeScreenshot("before-chrome-signin.png", "Before Signing In Chrome", htmlReportData);
+ Util.takeScreenshot((TakesScreenshot)driver, "before-chrome-signin.png", "Before Signing In Chrome", htmlReportData);
robotHelper.enter();
Util.sleep(2000);
@@ -50,6 +51,6 @@
// This popup is not accessible by WebDriver.
log("Dismiss 'Sign-in successful' prompt");
robotHelper.enter();
- Util.takeScreenshot("after-chrome-signin.png", "After Signing In Chrome", htmlReportData);
+ Util.takeScreenshot((TakesScreenshot)driver, "after-chrome-signin.png", "After Signing In Chrome", htmlReportData);
}
}
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionInstallationPage.java b/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionInstallationPage.java
index 8a81494..4a833a7 100644
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionInstallationPage.java
+++ b/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionInstallationPage.java
@@ -5,6 +5,7 @@
package io.v.webdriver.commonpages;
import org.openqa.selenium.By;
+import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
@@ -37,7 +38,7 @@
WebElement btnSignin = wait.until(ExpectedConditions.elementToBeClickable(By.id("signIn")));
WebElement passwdTextField = driver.findElement(By.id("Passwd"));
passwdTextField.sendKeys(password);
- Util.takeScreenshot("google-account-signin.png", "Google Account Sign-In", htmlReportData);
+ Util.takeScreenshot((TakesScreenshot)driver, "google-account-signin.png", "Google Account Sign-In", htmlReportData);
btnSignin.click();
}
@@ -45,7 +46,7 @@
log("Install extension");
WebElement btnAddToChrome = wait.until(
ExpectedConditions.elementToBeClickable(By.cssSelector("div[aria-label='Add to Chrome']")));
- Util.takeScreenshot("before-install-extension.png", "Before Installing Extension",
+ Util.takeScreenshot((TakesScreenshot)driver, "before-install-extension.png", "Before Installing Extension",
htmlReportData);
btnAddToChrome.click();
Util.sleep(2000);
@@ -60,7 +61,7 @@
By.cssSelector("div[aria-label='Added to Chrome']")));
// It might take some time for the extension to actually be installed.
Util.sleep(3000);
- Util.takeScreenshot("after-install-extension.png", "After Installing Extension",
+ Util.takeScreenshot((TakesScreenshot)driver, "after-install-extension.png", "After Installing Extension",
htmlReportData);
}
}
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/OAuthLoginPage.java b/test/ui/src/test/java/io/v/webdriver/commonpages/OAuthLoginPage.java
index bb5bc95..bb2df3c 100644
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/OAuthLoginPage.java
+++ b/test/ui/src/test/java/io/v/webdriver/commonpages/OAuthLoginPage.java
@@ -5,6 +5,7 @@
package io.v.webdriver.commonpages;
import org.openqa.selenium.By;
+import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
@@ -25,13 +26,13 @@
public void login() {
log("OAuth login");
- Util.takeScreenshot("oauth-login.png", "OAuth Login", htmlReportData);
+ Util.takeScreenshot((TakesScreenshot)driver, "oauth-login.png", "OAuth Login", htmlReportData);
WebElement btnSignInGoogle = wait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//button[contains(text(), 'Sign in with a Google Account')]")));
btnSignInGoogle.click();
log("Accept access info");
- Util.takeScreenshot("accept-access-info.png", "Accepting Access Info", htmlReportData);
+ Util.takeScreenshot((TakesScreenshot)driver, "accept-access-info.png", "Accepting Access Info", htmlReportData);
WebElement btnAccept =
wait.until(ExpectedConditions.elementToBeClickable(By.id("submit_approve_access")));
btnAccept.click();
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/PageBase.java b/test/ui/src/test/java/io/v/webdriver/commonpages/PageBase.java
index bd30fd2..f3f9874 100644
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/PageBase.java
+++ b/test/ui/src/test/java/io/v/webdriver/commonpages/PageBase.java
@@ -4,6 +4,7 @@
package io.v.webdriver.commonpages;
+import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
@@ -64,7 +65,7 @@
* Takes a screenshot for the current page and names it using pageName.
*/
protected void takeScreenshotUsingPageName() {
- Util.takeScreenshot(String.format("%s.png", Util.getSafeFilename(pageName)), pageName,
+ Util.takeScreenshot((TakesScreenshot)driver, String.format("%s.png", Util.getSafeFilename(pageName)), pageName,
htmlReportData);
}
}