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);
   }
 }