1 /**
2 * Copyright 2005-2016 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.rice.testtools.selenium;
17
18 import org.apache.commons.io.FileUtils;
19 import org.openqa.selenium.OutputType;
20 import org.openqa.selenium.TakesScreenshot;
21 import org.openqa.selenium.WebDriver;
22
23 import java.io.File;
24 import java.io.IOException;
25
26 /**
27 * @author Kuali Rice Team (rice.collab@kuali.org)
28 */
29 public class WebDriverScreenshotHelper {
30
31 /**
32 * -Dremote.driver.screenshot.filename= appended with a formatted date time stamp and png file extension.
33 */
34 private static final String REMOTE_DRIVER_SCREENSHOT_FILENAME = "remote.driver.screenshot.filename";
35
36 /**
37 * -Dremote.driver.screenshot.dir= default is java working dir.
38 */
39 private static final String REMOTE_DRIVER_SCREENSHOT_DIR = "remote.driver.screenshot.dir";
40
41 /**
42 * -Dremote.driver.screenshot.archive.url= default is empty string.
43 *
44 * Used to link Jenkins output of screenshots to their archive.
45 */
46 private static final String REMOTE_DRIVER_SCREENSHOT_ARCHIVE_URL = "remote.driver.screenshot.archive.url";
47
48 /**
49 * -Dremote.driver.failure.screenshot= default is false
50 *
51 */
52 private static final String REMOTE_DRIVER_FAILURE_SCREENSHOT = "remote.driver.failure.screenshot";
53
54 /**
55 * -Dremote.driver.step.screenshot= default is false
56 */
57 private static final String REMOTE_DRIVER_STEP_SCREENSHOT = "remote.driver.step.screenshot";
58
59 /**
60 * Screenshots will be saved using either the value of (#REMOTE_DRIVER_SCREENSHOT_FILENAME or if none, testName.testNameMethod)
61 * appended with a date time stamp and the png file extension.
62 *
63 * @see WebDriverUtils#getDateTimeStampFormatted
64 *
65 * @param driver to use, if not of type TakesScreenshot no screenshot will be taken
66 * @param testName to save test as, unless #REMOTE_DRIVER_SCREENSHOT_FILENAME is set
67 * @param testMethodName to save test as, unless #REMOTE_DRIVER_SCREENSHOT_FILENAME is set
68 * @throws IOException
69 */
70 public void screenshot(WebDriver driver, String testName, String testMethodName) throws IOException {
71 screenshot(driver, testName, testMethodName, "");
72 }
73
74 /**
75 * Screenshots will be saved using either the value of (#REMOTE_DRIVER_SCREENSHOT_FILENAME or if none, testName.testNameMethod)
76 * appended with a date time stamp and the png file extension.
77 *
78 * @see WebDriverUtils#getDateTimeStampFormatted
79 *
80 * @param driver to use, if not of type TakesScreenshot no screenshot will be taken
81 * @param testName to save test as, unless #REMOTE_DRIVER_SCREENSHOT_FILENAME is set
82 * @param testMethodName to save test as, unless #REMOTE_DRIVER_SCREENSHOT_FILENAME is set
83 * @throws IOException
84 */
85 public void screenshot(WebDriver driver, String testName, String testMethodName, String screenName) throws IOException {
86 if (driver instanceof TakesScreenshot) {
87
88 if (!"".equals(screenName)) {
89 screenName = "-" + screenName;
90 }
91
92 File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
93 // It would be nice to make the screenshot file name much more configurable.
94 String screenshotFileName = WebDriverUtils.getDateTimeStampFormatted() + "-"
95 + System.getProperty(REMOTE_DRIVER_SCREENSHOT_FILENAME, testName + "." + testMethodName)
96 + screenName + ".png";
97 FileUtils.copyFile(scrFile, new File(System.getProperty(REMOTE_DRIVER_SCREENSHOT_DIR, ".")
98 + File.separator, screenshotFileName));
99 String archiveUrl = System.getProperty(REMOTE_DRIVER_SCREENSHOT_ARCHIVE_URL, "");
100 WebDriverUtils.jGrowl(driver, "Screenshot", false, archiveUrl + screenshotFileName);
101 }
102 }
103
104 /**
105 * @return false unless #REMOTE_DRIVER_FAILURE_SCREENSHOT is set to true.
106 */
107 public boolean screenshotOnFailure() {
108 return "true".equals(System.getProperty(REMOTE_DRIVER_FAILURE_SCREENSHOT, "false"));
109 }
110
111 /**
112 * @return false unless #REMOTE_DRIVER_STEP_SCREENSHOT is set to true.
113 */
114 public boolean screenshotSteps() {
115 return "true".equals(System.getProperty(REMOTE_DRIVER_STEP_SCREENSHOT, "false"));
116 }
117 }