View Javadoc

1   /*
2    * Copyright 2006-2012 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  
17  package edu.samplu.common;
18  
19  import static com.thoughtworks.selenium.SeleneseTestBase.fail;
20  import static org.junit.Assert.assertEquals;
21  
22  import java.util.ArrayList;
23  import java.util.List;
24  import java.util.Set;
25  import java.util.concurrent.TimeUnit;
26  
27  import org.junit.After;
28  import org.junit.AfterClass;
29  import org.junit.Before;
30  import org.junit.BeforeClass;
31  import org.openqa.selenium.Alert;
32  import org.openqa.selenium.By;
33  import org.openqa.selenium.JavascriptExecutor;
34  import org.openqa.selenium.WebDriver;
35  import org.openqa.selenium.chrome.ChromeDriverService;
36  
37  
38  /**
39   * Base class for Selenium Webdriver integration tests
40   *
41   * @author Kuali Rice Team (rice.collab@kuali.org)
42   */
43  public abstract class WebDriverITBase {
44  
45      public WebDriver driver;
46      static ChromeDriverService chromeDriverService;
47  
48      /**
49       * Returns the URL to be used with this test
50       *
51       * @return URL of the test
52       */
53      public abstract String getTestUrl();
54  
55      /**
56       * Override in test to define a user other than admin
57       * @return
58       */
59      public String getUserName() {
60          return "admin";
61      }
62  
63      @BeforeClass
64      public static void createAndStartService() throws Exception {
65          chromeDriverService = WebDriverUtil.createAndStartService();
66          if (chromeDriverService != null) chromeDriverService.start();
67      }
68  
69  
70      /**
71       * Setup the WebDriver test, login and load the tested web page
72       *
73       * @throws Exception
74       */
75      @Before
76      public void setUp() throws Exception {
77          driver = WebDriverUtil.setUp(getUserName(), ITUtil.getBaseUrlString() + "/" + getTestUrl());
78      }
79  
80      /**
81       * Tear down the WebDriver test
82       *
83       * @throws Exception
84       */
85      @After
86      public void tearDown() throws Exception {
87          if (ITUtil.dontTearDownPropertyNotSet()) {
88              driver.quit(); // TODO not tested with chrome, the service stop might need this check too
89          }
90      }
91  
92      /**
93       * Tear down the WebDriver test
94       *
95       * @throws Exception
96       */
97      @AfterClass
98      public static void stopService() throws Exception {
99          if (chromeDriverService != null) {
100             chromeDriverService.stop();
101         }
102     }
103 
104     /**
105      * Check if an element is present
106      *
107      * <p>
108      * This test takes a while due to the 'implicit wait' time.
109      * </p>
110      *
111      * @param by The locating mechanism of the element
112      * @return true if the element is present, false otherwise
113      */
114     public boolean isElementPresent(By by) {
115         if (driver.findElements(by).isEmpty()) {
116             return false;
117         } else {
118             return true;
119         }
120     }
121 
122     /**
123      * Quickly check if an element is present
124      *
125      * <p>
126      * Just like {@link #isElementPresent(org.openqa.selenium.By)} but with a short 'implicit wait' time.  Use this only
127      * if it is guaranteed that all elements are rendered.
128      * </p>
129      *
130      * @param by The locating mechanism of the element
131      * @return true if the element is present, false otherwise
132      */
133     public boolean isElementPresentQuick(By by) {
134         driver.manage().timeouts().implicitlyWait(WebDriverUtil.SHORT_IMPLICIT_WAIT_TIME, TimeUnit.SECONDS);
135         boolean result = isElementPresent(by);
136         driver.manage().timeouts().implicitlyWait(WebDriverUtil.DEFAULT_IMPLICIT_WAIT_TIME, TimeUnit.SECONDS);
137         return result;
138     }
139 
140     /**
141      * Assert that clicking an element causes a popup window with a specific URL
142      *
143      * @param by The locating mechanism of the element to be clicked
144      * @param windowName The name of the popup window
145      * @param url The URL of the popup window
146      */
147     public void assertPopUpWindowUrl(By by, String windowName, String url) {
148         driver.findElement(by).click();
149         String parentWindowHandle = driver.getWindowHandle();
150         // wait page to be loaded
151         driver.switchTo().window(windowName).findElements(By.tagName("head"));
152         assertEquals(url, driver.getCurrentUrl());
153         driver.switchTo().window(parentWindowHandle);
154     }
155     
156     /**
157      * 
158      *
159      * @param by The locating mechanism of the element
160     */
161     protected void waitFor(By by) throws InterruptedException {
162         waitFor(by, "");
163     }
164 
165     /**
166      * 
167      *
168      * @param by The locating mechanism of the element
169      * @param message User defined message to display
170      */
171     protected void waitFor(By by, String message) throws InterruptedException {
172 //        for (int second = 0;; second++) {
173             Thread.sleep(1000);
174 //            if (second >= DEFAULT_WAIT_SEC) fail(by.toString() + " " + message + " " + DEFAULT_WAIT_SEC + " sec timeout.");
175             try { driver.findElement(by);
176                 //break;
177             } catch (Exception e) {}
178 //        }
179     }
180 
181     /**
182      * 
183      *
184      * @param by The locating mechanism of the element
185      * @param text The text to type
186     */
187     protected void waitAndType(By by, String text) throws InterruptedException {
188         waitFor(by, "");
189         try {
190             (driver.findElement(by)).sendKeys(text);
191         } catch (Exception e) {
192             fail(e.getMessage() + " " + by.toString() + " " + text);
193             e.printStackTrace();
194         }
195     }
196     
197     /**
198      * 
199      *
200      * @param by The locating mechanism of the element
201      * @param text The text to type
202      * @param message User defined message to display
203     */
204     protected void waitAndType(By by, String text, String message) throws InterruptedException {
205         waitFor(by, "");
206         try {
207             (driver.findElement(by)).sendKeys(text);
208         } catch (Exception e) {
209             fail(e.getMessage() + " " + by.toString() + " " + text + "  "+message);
210             e.printStackTrace();
211         }
212     }
213     
214     /**
215      * 
216      *
217      * @param locator The locating mechanism of the element
218      * @param text The text to type
219     */
220     protected void waitAndTypeByXpath(String locator, String text) throws InterruptedException {
221         waitAndType(By.xpath(locator), text);
222     }
223     
224     /**
225      * 
226      *
227      * @param locator The locating mechanism of the element
228      * @param text The text to type
229      * @param message User defined message to display
230     */
231     protected void waitAndTypeByXpath(String locator, String text, String message) throws InterruptedException {
232         waitAndType(By.xpath(locator), text, message);
233     }
234     
235     /**
236      * 
237      *
238      * @param name The name of the element
239      * @param text The text to type
240     */
241     protected void waitAndTypeByName(String name, String text) throws InterruptedException {
242         waitAndType(By.name(name), text);
243     }
244     
245     /**
246      * Clear the text written in an input field by name of an element
247      *
248      * @param name The name of the element
249     */
250     protected void clearTextByName(String name) throws InterruptedException {
251         clearText(By.name(name));
252     }
253     
254     /**
255      * Clear the text written in an input field by xpath of an element
256      *
257      * @param locator The locating mechanism of the element
258     */
259     protected void clearTextByXpath(String locator) throws InterruptedException {
260         clearText(By.xpath(locator));
261     }
262     
263     /**
264      * Clear the text written in an input field by xpath of an element
265      *
266      * @param by method used for finding the element
267     */
268     protected void clearText(By by)  throws InterruptedException {
269         driver.findElement(by).clear();        
270     }
271     
272     /**
273      * Dismiss the javascript alert (clicking Cancel)
274      *
275     */
276     protected void dismissAlert()
277     {
278         Alert alert = driver.switchTo().alert();
279         //update is executed
280         alert.dismiss();
281     }
282     
283     /**
284      * Accept the javascript alert (clicking OK)
285      *
286     */
287     protected void acceptAlert()
288     {
289         Alert alert = driver.switchTo().alert();
290         //update is executed
291         alert.accept();
292     }
293     
294     protected String getEval(String script)
295     {
296         JavascriptExecutor js = (JavascriptExecutor) driver;
297         return (String)js.executeScript(script);
298     }
299     
300     /**
301      * Switch to new window
302      *
303     */
304     protected void switchWindow()
305     {
306         Set<String> winSet = driver.getWindowHandles();
307         List<String> winList = new ArrayList<String>(winSet);
308         String newTab = winList.get(winList.size() - 1);
309         driver.switchTo().window(newTab);
310     }
311     
312     /**
313      * Get value of any attribute by using element name
314      *
315      *@param name name of an element
316      *@param attribute the name of an attribute whose value is to be retrieved
317     */
318     protected String getAttributeByName(String name,String attribute) throws InterruptedException {
319         return getAttribute(By.name(name),attribute);
320     }
321     
322     /**
323      * Get value of any attribute by using element xpath
324      *
325      *@param locator locating mechanism of an element
326      *@param attribute the name of an attribute whose value is to be retrieved
327     */
328     protected String getAttributeByXpath(String locator,String attribute) throws InterruptedException {
329         return getAttribute(By.xpath(locator),attribute);
330     }
331     
332     /**
333      * Get value of any attribute of an element
334      *
335      * @param by method used for finding the element
336      *@param attribute the name of an attribute whose value is to be retrieved
337     */
338     protected String getAttribute(By by,String attribute)  throws InterruptedException {
339         return driver.findElement(by).getAttribute(attribute);        
340     }
341     
342     /**
343      * 
344      *
345      * @param text text of the link
346     */
347     protected void waitAndClickByLinkText(String text) throws InterruptedException {
348         waitAndClick(By.linkText(text),"");
349     }
350 
351     /**
352      * 
353      *
354      * @param text text of the link
355      * @param message user defined message to display
356     */
357     protected void waitAndClickByLinkText(String text, String message) throws InterruptedException {
358         waitAndClick(By.linkText(text), message);
359     }
360     
361     /**
362      * 
363      *
364      * @param by method used for finding the element
365     */
366     protected void waitAndClick(By by) throws InterruptedException {
367         waitAndClick(by, "");
368     }
369 
370     /**
371      * 
372      *
373      * @param by method used for finding the element
374      * @param message user defined message to display
375     */
376     protected void waitAndClick(By by, String message) throws InterruptedException {
377         waitFor(by, message);
378         try {
379             (driver.findElement(by)).click();
380         } catch (Exception e) {
381             fail(e.getMessage() + " " + by.toString() + " " + message);
382             e.printStackTrace();
383         }
384     }
385     
386     /**
387      * 
388      *
389      * @param locator mechanism to locate element by xpath
390     */
391     protected void waitAndClick(String locator) throws InterruptedException {
392         waitAndClick(locator, "");
393     }
394     
395     /**
396      * 
397      *
398      * @param locator mechanism to locate element by xpath
399      * @param message user defined message to display
400     */
401     protected void waitAndClick(String locator, String message) throws InterruptedException {
402         waitAndClick(By.cssSelector(locator), message);
403     }
404 
405     /**
406      * 
407      *
408      * @param locator mechanism to locate element by xpath
409     */
410     protected void waitForElementPresent(String locator) throws InterruptedException {
411         waitFor(By.cssSelector(locator));
412     }
413 
414     /**
415      * 
416      *
417      * @param locator mechanism to locate element by xpath
418     */    
419     protected void waitForElementPresentByXpath(String locator) throws InterruptedException {
420         waitFor(By.xpath(locator));
421     }
422     
423     /**
424      * 
425      *
426      * @param name name of an element
427     */ 
428     protected void waitForElementPresentByName(String name) throws InterruptedException {
429         waitFor(By.name(name));
430     }
431     
432     protected void checkForIncidentReport() {
433         checkForIncidentReport("", "");
434     }
435 
436     protected void checkForIncidentReport(String locator) {
437         checkForIncidentReport(locator, "");
438     }
439     
440     protected void checkForIncidentReport(String locator, String message) {
441         WebDriverUtil.checkForIncidentReport(driver, locator, message);
442     }
443 
444 
445 }
446