View Javadoc

1   /**
2    * Copyright 2005-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  package edu.samplu.common;
17  
18  import org.junit.After;
19  import org.junit.Assert;
20  import org.junit.Before;
21  import org.junit.BeforeClass;
22  import org.junit.Rule;
23  import org.junit.rules.TestName;
24  import org.openqa.selenium.By;
25  import org.openqa.selenium.JavascriptExecutor;
26  import org.openqa.selenium.NoSuchFrameException;
27  import org.openqa.selenium.WebDriver;
28  import org.openqa.selenium.WebElement;
29  import org.openqa.selenium.chrome.ChromeDriverService;
30  import org.openqa.selenium.interactions.Actions;
31  import org.openqa.selenium.remote.RemoteWebDriver;
32  
33  import java.io.BufferedReader;
34  import java.io.InputStreamReader;
35  import java.net.HttpURLConnection;
36  import java.net.URL;
37  import java.util.List;
38  import java.util.Set;
39  import java.util.concurrent.TimeUnit;
40  
41  import static com.thoughtworks.selenium.SeleneseTestBase.fail;
42  import static org.junit.Assert.assertEquals;
43  
44  /**
45   * Class to upgrade UpgradedSeleniumITBase tests to WebDriver.
46   * @deprecated Use WebDriverITBase for new tests.
47   * @author Kuali Rice Team (rice.collab@kuali.org)
48   */
49  public abstract class WebDriverLegacyITBase { //implements com.saucelabs.common.SauceOnDemandSessionIdProvider {
50  
51      public static final int DEFAULT_WAIT_SEC = 60;
52      public static final String REMOTE_PUBLIC_USERPOOL_PROPERTY = "remote.public.userpool";
53      public static final String REMOTE_PUBLIC_USER_PROPERTY = "remote.public.user";
54  
55      public abstract String getTestUrl();
56  
57      protected WebDriver driver;
58      protected String user = "admin";
59      protected boolean passed = false;
60      static ChromeDriverService chromeDriverService;
61  
62      public @Rule TestName testName= new TestName();
63  
64      String sessionId = null;
65  
66      public String getSessionId() {
67          return sessionId;
68      }
69  
70      @BeforeClass
71      public static void createAndStartService() throws Exception {
72          chromeDriverService = WebDriverUtil.createAndStartService();
73          if (chromeDriverService != null) chromeDriverService.start();
74      }
75  
76      /**
77       * Setup the WebDriver test, login and load the tested web page
78       *
79       * @throws Exception
80       */
81      @Before
82      public void setUp() throws Exception {
83          // {"test":"1","user":"1"}
84          try {
85              if (System.getProperty(REMOTE_PUBLIC_USER_PROPERTY) != null) {
86                  user = System.getProperty(REMOTE_PUBLIC_USER_PROPERTY);
87              } else if (System.getProperty(REMOTE_PUBLIC_USERPOOL_PROPERTY) != null) { // deprecated
88                  String userResponse = getHTML(ITUtil.prettyHttp(System.getProperty(REMOTE_PUBLIC_USERPOOL_PROPERTY) + "?test=" + this.toString().trim()));
89                  user = userResponse.substring(userResponse.lastIndexOf(":" ) + 2, userResponse.lastIndexOf("\""));
90              }
91              driver = WebDriverUtil.setUp(getUserName(), ITUtil.getBaseUrlString() + getTestUrl(), getClass().getSimpleName(), testName);
92              this.sessionId = ((RemoteWebDriver)driver).getSessionId().toString();
93          } catch (Exception e) {
94              fail("Exception in setUp " + e.getMessage());
95              e.printStackTrace();
96          }
97          ITUtil.login(driver, user);
98      }
99  
100     @After
101     public void tearDown() throws Exception {
102         try {
103 //            if (System.getProperty(SauceLabsWebDriverHelper.SAUCE_PROPERTY) != null) {
104 //                SauceLabsWebDriverHelper.tearDown(passed, sessionId, System.getProperty(SauceLabsWebDriverHelper.SAUCE_USER_PROPERTY), System.getProperty(SauceLabsWebDriverHelper.SAUCE_KEY_PROPERTY));
105 //            }
106             if (System.getProperty(REMOTE_PUBLIC_USERPOOL_PROPERTY) != null) {
107                 getHTML(ITUtil.prettyHttp(System.getProperty(REMOTE_PUBLIC_USERPOOL_PROPERTY) + "?test=" + this.toString() + "&user=" + user));
108             }
109         } catch (Exception e) {
110             System.out.println("Exception in tearDown " + e.getMessage());
111             e.printStackTrace();
112         } finally {
113             if (driver != null) {
114                 if (ITUtil.dontTearDownPropertyNotSet()) {
115                     driver.close();
116                     driver.quit();
117                 }
118             } else {
119                 System.out.println("WebDriver is null, if using saucelabs, has sauceleabs been uncommented in WebDriverUtil.java?  If using a remote hub did you include the port?");
120             }
121         }
122     }
123 
124    protected String getHTML(String urlToRead) {
125       URL url;
126       HttpURLConnection conn;
127       BufferedReader rd;
128       String line;
129       String result = "";
130       try {
131          url = new URL(urlToRead);
132          conn = (HttpURLConnection) url.openConnection();
133          conn.setRequestMethod("GET");
134          rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
135          while ((line = rd.readLine()) != null) {
136             result += line;
137          }
138          rd.close();
139       } catch (Exception e) {
140          e.printStackTrace();
141       }
142       return result;
143    }
144 
145     protected void passed() {
146         passed = true;
147     }
148 
149     protected void assertElementPresentByName(String name) {
150         driver.findElement(By.name(name));
151     }
152     
153     protected void assertElementPresentByName(String name,String message) {
154         try{
155                 driver.findElement(By.name(name));
156         }catch(Exception e){
157                 Assert.fail(name+ " not present "+ message);
158         }
159     }
160 
161     protected void assertElementPresentByXpath(String locator) {
162         driver.findElement(By.xpath(locator));
163     }
164     
165     protected void assertElementPresentByXpath(String locator,String message) {
166         try{
167                 driver.findElement(By.xpath(locator));
168         }catch(Exception e){
169                 Assert.fail(locator+ " not present "+ message);                
170         }
171     }
172     
173     protected void assertElementPresent(String locator) {
174         driver.findElement(By.cssSelector(locator));
175     }
176     
177     protected void assertTextPresent(String text) {
178         assertTextPresent(text, "");
179     }
180 
181     protected void assertTextPresent(String text, String message) {
182         if (!driver.getPageSource().contains(text)) {
183             Assert.fail(text + " not present " + message);
184         }
185     }
186 
187     protected void blanketApproveTest() throws InterruptedException {
188         ITUtil.checkForIncidentReport(driver.getPageSource(), "methodToCall.blanketApprove", "");
189         waitAndClickByName("methodToCall.blanketApprove", "No blanket approve button does the user " + getUserName() + " have permission?");
190         Thread.sleep(2000);
191 
192         if (driver.findElements(By.xpath(ITUtil.DIV_ERROR_LOCATOR)).size()>0) {
193             String errorText = driver.findElement(By.xpath(ITUtil.DIV_ERROR_LOCATOR)).getText();
194             if (errorText != null && errorText.contains("error(s) found on page.")) {
195                 errorText = ITUtil.blanketApprovalCleanUpErrorText(errorText);
196                 if (driver.findElements(By.xpath(ITUtil.DIV_EXCOL_LOCATOR)).size()>0) { // not present if errors are at the bottom of the page (see left-errmsg below)
197                     errorText = ITUtil.blanketApprovalCleanUpErrorText(driver.findElement(By.xpath(ITUtil.DIV_EXCOL_LOCATOR)).getText()); // replacing errorText as DIV_EXCOL_LOCATOR includes the error count
198                 }
199 
200                 //                if (selenium.isElementPresent("//div[@class='left-errmsg']/div")) {
201                 //                    errorText = errorText + " " + selenium.getText("//div[@class='left-errmsg']/div/div[1]");
202                 //                }
203                 Assert.fail(errorText);
204             }
205         }
206         ITUtil.checkForIncidentReport(driver.getPageSource(), "//img[@alt='doc search']", "Blanket Approve failure");
207         waitAndClickByXpath("//img[@alt='doc search']");
208         assertEquals("Kuali Portal Index", driver.getTitle());
209         selectFrame("iframeportlet");
210         waitAndClickByXpath("//input[@name='methodToCall.search' and @value='search']");
211     }
212 
213     protected void checkForIncidentReport() {
214         checkForIncidentReport("", "");
215     }
216 
217     protected void checkForIncidentReport(String locator) {
218         checkForIncidentReport(locator, "");
219     }
220 
221     protected void checkForIncidentReport(String locator, String message) {
222         WebDriverUtil.checkForIncidentReport(driver, locator, message);
223     }
224 
225     protected void clearText(By by)  throws InterruptedException {
226         driver.findElement(by).clear();
227     }
228     
229     protected void clearText(String selector) throws InterruptedException {
230         clearText(By.cssSelector(selector));
231     }
232 
233     protected void clearTextByName(String name) throws InterruptedException {
234         clearText(By.name(name));
235     }
236 
237     protected void clearTextByXpath(String locator) throws InterruptedException {
238         clearText(By.xpath(locator));
239     }
240     
241     protected String getAttribute(By by, String attribute) throws InterruptedException {
242         waitFor(by);
243         return driver.findElement(by).getAttribute(attribute);
244     }
245     
246     /**
247      * Get value of any attribute by using element name
248      *
249      *@param name name of an element
250      *@param attribute the name of an attribute whose value is to be retrieved
251     */
252     protected String getAttributeByName(String name,String attribute) throws InterruptedException {
253         return getAttribute(By.name(name),attribute);
254     }
255     
256     /**
257      * Get value of any attribute by using element xpath
258      *
259      *@param locator locating mechanism of an element
260      *@param attribute the name of an attribute whose value is to be retrieved
261     */
262     protected String getAttributeByXpath(String locator,String attribute) throws InterruptedException {
263         return getAttribute(By.xpath(locator),attribute);
264     }
265            
266     protected String getBaseUrlString() {
267         return ITUtil.getBaseUrlString();
268     }
269 
270     protected String getText(By by)  throws InterruptedException {
271         return driver.findElement(by).getText();
272     }
273 
274     protected String getTextByName(String name) throws InterruptedException {
275         return getText(By.name(name));
276     }
277     
278     protected String getText(String locator) throws InterruptedException {
279         return getText(By.cssSelector(locator));
280     }
281 
282     protected String getTextByXpath(String locator) throws InterruptedException {
283         return getText(By.xpath(locator));
284     }
285 
286     protected String getTitle() {
287         return driver.getTitle();
288     }
289 
290     /**
291      * Override in test to define a user other than admin
292      * @return
293      */
294     public String getUserName() {
295         return user;
296     }
297 
298     /**
299      * Handles simple nested frame content; validates that a frame and nested frame exists before switching to it
300      */
301     protected void gotoNestedFrame() {
302         driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
303         driver.switchTo().defaultContent();
304         if(driver.findElements(By.xpath("//iframe")).size() > 0) {
305             WebElement containerFrame = driver.findElement(By.xpath("//iframe"));
306             driver.switchTo().frame(containerFrame);
307         }
308         if(driver.findElements(By.xpath("//iframe")).size() > 0) {
309             WebElement contentFrame = driver.findElement(By.xpath("//iframe"));
310             driver.switchTo().frame(contentFrame);
311         }
312         driver.manage().timeouts().implicitlyWait(DEFAULT_WAIT_SEC, TimeUnit.SECONDS);
313     }
314 
315     protected boolean isElementPresent(By by) {
316         return (driver.findElements(by)).size()>0;
317     }
318     
319     protected boolean isElementPresent(String locator) {
320         return (driver.findElements(By.cssSelector(locator))).size()>0;
321     }
322     
323     protected boolean isElementPresentByName(String name) {
324         return isElementPresent(By.name(name));
325     }
326     
327     protected boolean isElementPresentByXpath(String locator) {
328         return isElementPresent(By.xpath(locator));
329     }
330     
331     protected void open(String url) {
332         driver.get(url);
333     }
334 
335     protected void selectFrame(String locator) {
336         if ("iframeportlet".equals(locator)) {
337             gotoNestedFrame();
338         } else {
339             try {
340                 driver.switchTo().frame(locator);
341             } catch (NoSuchFrameException nsfe) {
342                 // don't fail
343             }
344         }
345     }
346     
347     protected void selectTopFrame() {
348         driver.switchTo().defaultContent();
349     }
350     
351     protected void selectWindow(String locator) {
352         driver.switchTo().window(locator);
353     }
354     
355     protected void close() {
356         driver.close();
357     }
358 
359     protected void testCancelConfirmation() throws InterruptedException {
360         waitAndCancelConfirmation();
361         passed();
362     }
363 
364     protected void testCreateNewSearchReturnValueCancelConfirmation() throws InterruptedException, Exception {
365         selectFrame("iframeportlet");
366         waitAndCreateNew();
367         waitAndSearch();
368         waitAndReturnValue();
369         waitAndCancelConfirmation();
370         passed();
371     }
372 
373     protected void testSearchEditCancel() throws InterruptedException {
374         selectFrame("iframeportlet");
375         waitAndSearch();
376         waitAndEdit();
377         testCancelConfirmation();
378     }
379 
380     protected void testVerifyAddDeleteFiscalOfficerLegacy() throws Exception {
381         selectFrame("iframeportlet");
382         waitAndTypeByName("document.documentHeader.documentDescription", ITUtil.DTS_TWO);
383         waitAndTypeByName("newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].number", "1234567890");
384         waitAndTypeByName("newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].foId", "2");
385 
386         waitAndClickByXpath("//button[@data-loadingmessage='Adding Line...']");
387 
388         assertElementPresentByName("document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].number", "https://jira.kuali.org/browse/KULRICE-8564");
389 
390         assertEquals("1234567890", getAttributeByName("document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].number","value"));
391         assertEquals("2", getAttributeByName("document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].foId","value"));
392 
393         waitAndClickByXpath("//button[@data-loadingmessage='Deleting Line...']");
394 
395         assertElementPresentByName("document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].number");
396         passed();
397     }
398 
399     protected void waitAndCancelConfirmation() throws InterruptedException {
400         waitAndClickByName("methodToCall.cancel");
401         waitAndClickByName("methodToCall.processAnswer.button0");
402     }
403 
404     protected void waitAndCreateNew() throws InterruptedException {
405         waitAndClickByXpath("//img[@alt='create new']");
406 //        waitAndClickByXpath("//a[@title='Create a new record']");
407     }
408 
409     protected void waitAndEdit() throws InterruptedException {
410         waitAndClickByLinkText("edit");
411     }
412 
413     protected void waitAndReturnValue() throws InterruptedException {
414         waitAndClickByLinkText("return value");
415     }
416 
417     protected void waitAndSearch() throws InterruptedException {
418         waitAndClickByXpath("//input[@value='search']");
419 //        waitAndClickByXpath("//input[@name='methodToCall.search']");
420 //        waitAndClick("input[alt='search']");
421 //        waitAndClickByXpath("//input[@name='methodToCall.search' and @value='search']");
422     }
423 
424     protected String waitForDocId() throws InterruptedException {
425         waitForElementPresentByXpath("//div[@id='headerarea']/div/table/tbody/tr[1]/td[1]");
426         return driver.findElement(By.xpath("//div[@id='headerarea']/div/table/tbody/tr[1]/td[1]")).getText();
427     }
428     
429     protected void waitForElementPresent(String locator) throws InterruptedException {
430         waitFor(By.cssSelector(locator));
431     }
432 
433     protected void waitForElementPresentByXpath(String locator) throws InterruptedException {
434         waitFor(By.xpath(locator));
435     }
436     
437     protected void waitForElementPresentByName(String name) throws InterruptedException {
438         waitFor(By.name(name));
439     }
440 
441     protected void waitForTitleToEqualKualiPortalIndex() throws InterruptedException {
442         waitForTitleToEqualKualiPortalIndex("");
443     }
444 
445     protected void waitForTitleToEqualKualiPortalIndex(String message) throws InterruptedException {
446             Thread.sleep(2000);
447 // This started failing in CI....
448 //        boolean failed = false;
449 //        for (int second = 0;; second++) {
450 //            Thread.sleep(1000);
451 //            if (second >= 60) failed = true;
452 //            try { if (failed || ITUtil.KUALI_PORTAL_TITLE.equals(driver.getTitle())) break; } catch (Exception e) {}
453 //        }
454 //        WebDriverUtil.checkForIncidentReport(driver, message); // after timeout to be sure page is loaded
455 //        if (failed) fail("timeout of " + 60 + " seconds " + message);
456     }
457 
458     protected void waitAndClick(String locator) throws InterruptedException {
459         waitAndClick(locator, "");
460     }
461 
462     protected void waitForPageToLoad() {
463         // noop webdriver doesn't it need it, except when it does...
464     }
465 
466     protected void waitFor(By by) throws InterruptedException {
467         waitFor(by, "");
468     }
469 
470     protected void waitFor(By by, String message) throws InterruptedException {
471 //        for (int second = 0;; second++) {
472             Thread.sleep(1000);
473         driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
474 
475 //            if (second >= DEFAULT_WAIT_SEC) fail(by.toString() + " " + message + " " + DEFAULT_WAIT_SEC + " sec timeout.");
476             try { driver.findElement(by);
477                 //break;
478             } catch (Exception e) {}
479         driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
480 //        }
481     }
482 
483     protected void waitAndClick(By by) throws InterruptedException {
484         waitAndClick(by, "");
485     }
486 
487     protected void waitAndClick(By by, String message) throws InterruptedException {
488         waitFor(by, message);
489         try {
490             (driver.findElement(by)).click();
491         } catch (Exception e) {
492             fail(e.getMessage() + " " + by.toString() + " " + message + " " + driver.getCurrentUrl() );
493             e.printStackTrace();
494         }
495     }
496 
497     protected void waitAndClick(String locator, String message) throws InterruptedException {
498         waitAndClick(By.cssSelector(locator), message);
499     }
500 
501     protected void waitAndClickByLinkText(String text) throws InterruptedException {
502         waitAndClick(By.linkText(text),"");
503     }
504 
505     protected void waitAndClickByLinkText(String text, String message) throws InterruptedException {
506         waitAndClick(By.linkText(text), message);
507     }
508 
509     protected void waitAndClickByName(String name) throws InterruptedException {
510         waitAndClick(By.name(name), "");
511     }
512 
513     protected void waitAndClickByXpath(String xpath) throws InterruptedException {
514         waitAndClick(By.xpath(xpath));
515     }    
516 
517     protected void waitAndClickByName(String name, String message) throws InterruptedException {
518         waitAndClick(By.name(name), message);
519     }
520     
521     protected void waitAndClickByXpath(String xpath, String message) throws InterruptedException {
522         waitAndClick(By.xpath(xpath), message);
523     }
524 
525     protected void waitAndType(By by, String text) throws InterruptedException {
526         waitFor(by, "");
527         try {
528             (driver.findElement(by)).sendKeys(text);
529         } catch (Exception e) {
530             fail(e.getMessage() + " " + by.toString() + " unable to type text '" + text + "' current url " + driver.getCurrentUrl()
531                     + "\n" + ITUtil.deLinespace(driver.getPageSource())
532             );
533             e.printStackTrace();
534         }
535     }
536     
537     protected void waitAndType(By by, String text, String message) throws InterruptedException {
538         waitFor(by, "");
539         try {
540             (driver.findElement(by)).sendKeys(text);
541         } catch (Exception e) {
542             fail(e.getMessage() + " " + by.toString() + "  unable to type text '" + text + "'  " + message + " current url " + driver.getCurrentUrl()
543                     + "\n" + ITUtil.deLinespace(driver.getPageSource())
544             );
545             e.printStackTrace();
546         }
547     }
548     
549     protected void waitAndType(String selector, String text) throws InterruptedException {
550         waitAndType(By.cssSelector(selector), text);
551     }
552     
553     protected void waitAndTypeByXpath(String locator, String text) throws InterruptedException {
554         waitAndType(By.xpath(locator), text);
555     }
556     
557     protected void waitAndTypeByXpath(String locator, String text, String message) throws InterruptedException {
558         waitAndType(By.xpath(locator), text, message);
559     }
560     
561     protected void waitAndTypeByName(String name, String text) throws InterruptedException {
562         waitAndType(By.name(name), text);
563     }
564     
565     protected void selectByXpath(String locator, String selectText) throws InterruptedException {
566         select(By.xpath(locator), selectText);
567     }
568     
569     protected void selectByName(String name, String selectText) throws InterruptedException {
570         select(By.name(name), selectText);
571     }
572     
573     protected void select(By by, String selectText)  throws InterruptedException {
574         WebElement select1 = driver.findElement(by);
575         List<WebElement> options = select1.findElements(By.tagName("option"));
576         for(WebElement option : options){
577             if(option.getText().equals(selectText)){
578                 option.click();
579                 break;
580             }
581         }
582     }
583 
584     protected void selectOptionByName(String name, String optionValue) throws InterruptedException {
585         selectOption(By.name(name), optionValue);
586     }
587 
588     protected void selectOptionByXpath(String locator, String optionValue) throws InterruptedException {
589         selectOption(By.name(locator), optionValue);
590     }
591 
592     protected void selectOption(By by, String optionValue)  throws InterruptedException {
593         WebElement select1 = driver.findElement(by);
594         List<WebElement> options = select1.findElements(By.tagName("option"));
595         for(WebElement option : options){
596             if(option.getAttribute("value").equals(optionValue)){
597                 option.click();
598                 break;
599             }
600         }
601     }
602 
603     protected String[] getSelectOptions(By by) throws InterruptedException {
604         WebElement select1 = driver.findElement(by);
605         List<WebElement> options = select1.findElements(By.tagName("option"));
606         String[] optionValues = new String[options.size()];
607         int counter=0;
608         for(WebElement option : options){
609             optionValues[counter] = option.getAttribute("value");
610             counter++;
611         }
612         return optionValues;
613     }
614     
615     protected String[] getSelectOptionsByName(String name) throws InterruptedException {
616         return getSelectOptions(By.name(name));
617     }
618     
619     protected String[] getSelectOptionsByXpath(String locator) throws InterruptedException {
620         return getSelectOptions(By.xpath(locator));
621     }
622     
623     protected int getCssCount(String selector) {
624         return getCssCount(By.cssSelector(selector));
625     }
626     
627     protected int getCssCount(By by) {
628         return (driver.findElements(by)).size();
629     }
630     
631     protected void checkErrorMessageItem(String message)
632     {
633         final String error_locator = "//li[@class='uif-errorMessageItem']";
634         assertElementPresentByXpath(error_locator);
635         String errorText=null;
636         try {
637             errorText = getTextByXpath(error_locator);
638         } catch (InterruptedException e) {
639             e.printStackTrace();
640         }
641         if (errorText != null && errorText.contains("errors")) {
642             Assert.fail(errorText + message);
643         }
644                
645     }
646 
647     protected boolean isVisible(String locator) {
648         return driver.findElement(By.cssSelector(locator)).isDisplayed();
649     }
650 
651     protected boolean isVisible(By by) {
652         return driver.findElement(by).isDisplayed();
653     }
654 
655     protected boolean isVisibleByXpath(String locator) {
656         return isVisible(By.xpath(locator));
657     }
658     
659     protected void waitNotVisible(By by) throws InterruptedException {
660         for (int second = 0;; second++) {
661             if (second >= 60) {
662                 Assert.fail("timeout");
663             }
664 
665             if (!isVisible(by)) {
666                 break;
667             }
668 
669             Thread.sleep(1000);
670         }
671     }   
672 
673     protected void waitNotVisibleByXpath(String locator) throws InterruptedException {
674         waitNotVisible(By.xpath(locator));
675     }   
676     
677     protected void waitIsVisible(By by) throws InterruptedException {
678         for (int second = 0;; second++) {
679             if (second >= 60) {
680                 Assert.fail("timeout");
681             }
682             if (isVisible(by)) {
683                 break;
684             }
685             Thread.sleep(1000);
686         }
687     }
688     
689     protected void waitForElementVisible(String elementLocator, String message) throws InterruptedException {
690         boolean failed = false;
691         for (int second = 0;; second++) {
692             if (second >= 60) failed = true;                 
693             try { if (failed || (driver.findElements(By.cssSelector(elementLocator))).size()>0) break; } catch (Exception e) {}
694             Thread.sleep(1000);
695         }
696         checkForIncidentReport(elementLocator); // after timeout to be sure page is loaded
697         if (failed) fail("timeout of 60 seconds waiting for " + elementLocator + " " + message + " " + driver.getCurrentUrl());
698     }
699     
700     protected void waitIsVisible(String locator) throws InterruptedException {
701        waitIsVisible(By.cssSelector(locator));
702     }
703     
704     protected void waitIsVisibleByXpath(String locator) throws InterruptedException {
705         waitIsVisible(By.xpath(locator));
706     }
707     
708     protected void colapseExpandByXpath(String clickLocator, String visibleLocator) throws InterruptedException {
709         waitAndClickByXpath(clickLocator);
710         waitNotVisibleByXpath(visibleLocator);
711 
712         waitAndClickByXpath(clickLocator);
713         waitIsVisibleByXpath(visibleLocator);
714     }
715 
716     protected void expandColapseByXpath(String clickLocator, String visibleLocator) throws InterruptedException {
717         waitAndClickByXpath(clickLocator);
718         waitIsVisibleByXpath(visibleLocator);
719 
720         waitAndClickByXpath(clickLocator);
721         waitNotVisibleByXpath(visibleLocator);
722     }
723     
724     public void switchToWindow(String title) {
725         Set<String> windows = driver.getWindowHandles();
726 
727         for (String window : windows) {
728             driver.switchTo().window(window);
729             if (driver.getTitle().contains(title)) {
730                 return;
731             }
732         }
733     }
734     
735     public String [] getAllWindowTitles() {        
736         return (String[]) driver.getWindowHandles().toArray();
737     }
738     
739     
740     protected void check(By by)  throws InterruptedException {
741         WebElement element =driver.findElement(by);
742         if(!element.isSelected()){
743             element.click();
744         }
745     }
746     
747     protected void checkByName(String name) throws InterruptedException {
748         check(By.name(name));
749     }
750     
751     protected void checkByXpath(String locator) throws InterruptedException {
752         check(By.xpath(locator));
753     }
754 
755     protected void uncheck(By by)  throws InterruptedException {
756         WebElement element =driver.findElement(by);
757         if(element.isSelected()){
758             element.click();
759         }
760     }
761     
762     protected void uncheckByName(String name) throws InterruptedException {
763         uncheck(By.name(name));
764     }
765     
766     protected void uncheckByXpath(String locator) throws InterruptedException {
767         uncheck(By.xpath(locator));
768     }
769     
770     protected void fireEvent(String name, String event) {
771         ((JavascriptExecutor)driver).executeScript(
772                 "var elements=document.getElementsByName(\""+name+"\");"+
773                 "for (var i = 0; i < elements.length; i++){"+
774                         "elements[i]."+event+"();}"
775                         );
776     }
777     
778     protected void fireEvent(String name, String value, String event) {
779         ((JavascriptExecutor)driver).executeScript(
780                 "var elements=document.getElementsByName(\""+name+"\");"+
781                 "for (var i = 0; i < elements.length; i++){"+
782                         "if(elements[i].value=='"+value+"')"+
783                         "elements[i]."+event+"();}"
784                         );
785     }
786     
787     public void fireMouseOverEventByName(String name) {    
788         this.fireMouseOverEvent(By.name(name));
789     }
790     
791     public void fireMouseOverEventByXpath(String locator) {    
792         this.fireMouseOverEvent(By.xpath(locator));
793     }
794     
795     public void fireMouseOverEvent(By by) {    
796         Actions builder = new Actions(driver);
797         Actions hover = builder.moveToElement(driver.findElement(by));
798         hover.perform();
799    
800     }
801 }