001    package edu.samplu.common;
002    
003    import org.junit.After;
004    import org.junit.Assert;
005    import org.junit.Before;
006    import org.junit.BeforeClass;
007    import org.junit.Rule;
008    import org.junit.rules.TestName;
009    import org.openqa.selenium.By;
010    import org.openqa.selenium.JavascriptExecutor;
011    import org.openqa.selenium.WebDriver;
012    import org.openqa.selenium.WebElement;
013    import org.openqa.selenium.chrome.ChromeDriverService;
014    import org.openqa.selenium.interactions.Actions;
015    import org.openqa.selenium.remote.RemoteWebDriver;
016    
017    import java.io.BufferedReader;
018    import java.io.InputStreamReader;
019    import java.net.HttpURLConnection;
020    import java.net.URL;
021    import java.util.List;
022    import java.util.Set;
023    import java.util.concurrent.TimeUnit;
024    
025    import static com.thoughtworks.selenium.SeleneseTestBase.fail;
026    import static org.junit.Assert.assertEquals;
027    
028    /**
029     * Class to upgrade UpgradedSeleniumITBase tests to WebDriver.
030     * @deprecated Use WebDriverITBase for new tests.
031     * @author Kuali Rice Team (rice.collab@kuali.org)
032     */
033    public abstract class WebDriverLegacyITBase { //implements com.saucelabs.common.SauceOnDemandSessionIdProvider {
034    
035        public static final int DEFAULT_WAIT_SEC = 60;
036        public static final String REMOTE_PUBLIC_USERPOOL_PROPERTY = "remote.public.userpool";
037        public static final String REMOTE_PUBLIC_USER_PROPERTY = "remote.public.user";
038    
039        public abstract String getTestUrl();
040    
041        protected WebDriver driver;
042        protected String user = "admin";
043        protected boolean passed = false;
044        static ChromeDriverService chromeDriverService;
045    
046        public @Rule TestName testName= new TestName();
047    
048        String sessionId = null;
049    
050        public String getSessionId() {
051            return sessionId;
052        }
053    
054        @BeforeClass
055        public static void createAndStartService() throws Exception {
056            chromeDriverService = WebDriverUtil.createAndStartService();
057            if (chromeDriverService != null) chromeDriverService.start();
058        }
059    
060        /**
061         * Setup the WebDriver test, login and load the tested web page
062         *
063         * @throws Exception
064         */
065        @Before
066        public void setUp() throws Exception {
067            // {"test":"1","user":"1"}
068            try {
069                if (System.getProperty(REMOTE_PUBLIC_USER_PROPERTY) != null) {
070                    user = System.getProperty(REMOTE_PUBLIC_USER_PROPERTY);
071                } else if (System.getProperty(REMOTE_PUBLIC_USERPOOL_PROPERTY) != null) { // deprecated
072                    String userResponse = getHTML(ITUtil.prettyHttp(System.getProperty(REMOTE_PUBLIC_USERPOOL_PROPERTY) + "?test=" + this.toString().trim()));
073                    user = userResponse.substring(userResponse.lastIndexOf(":" ) + 2, userResponse.lastIndexOf("\""));
074                }
075                driver = WebDriverUtil.setUp(getUserName(), ITUtil.getBaseUrlString() + getTestUrl(), getClass().getSimpleName(), testName);
076                this.sessionId = ((RemoteWebDriver)driver).getSessionId().toString();
077            } catch (Exception e) {
078                fail("Exception in setUp " + e.getMessage());
079                e.printStackTrace();
080            }
081            ITUtil.login(driver, user);
082        }
083    
084        @After
085        public void tearDown() throws Exception {
086            try {
087    //            if (System.getProperty(SauceLabsWebDriverHelper.SAUCE_PROPERTY) != null) {
088    //                SauceLabsWebDriverHelper.tearDown(passed, sessionId, System.getProperty(SauceLabsWebDriverHelper.SAUCE_USER_PROPERTY), System.getProperty(SauceLabsWebDriverHelper.SAUCE_KEY_PROPERTY));
089    //            }
090                if (System.getProperty(REMOTE_PUBLIC_USERPOOL_PROPERTY) != null) {
091                    getHTML(ITUtil.prettyHttp(System.getProperty(REMOTE_PUBLIC_USERPOOL_PROPERTY) + "?test=" + this.toString() + "&user=" + user));
092                }
093            } catch (Exception e) {
094                System.out.println("Exception in tearDown " + e.getMessage());
095                e.printStackTrace();
096            } finally {
097                if (driver != null) {
098                    if (ITUtil.dontTearDownPropertyNotSet()) {
099                        driver.close();
100                        driver.quit();
101                    }
102                } else {
103                    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?");
104                }
105            }
106        }
107    
108       protected String getHTML(String urlToRead) {
109          URL url;
110          HttpURLConnection conn;
111          BufferedReader rd;
112          String line;
113          String result = "";
114          try {
115             url = new URL(urlToRead);
116             conn = (HttpURLConnection) url.openConnection();
117             conn.setRequestMethod("GET");
118             rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
119             while ((line = rd.readLine()) != null) {
120                result += line;
121             }
122             rd.close();
123          } catch (Exception e) {
124             e.printStackTrace();
125          }
126          return result;
127       }
128    
129        protected void passed() {
130            passed = true;
131        }
132    
133        protected void assertElementPresentByName(String name) {
134            driver.findElement(By.name(name));
135        }
136        
137        protected void assertElementPresentByName(String name,String message) {
138            try{
139                    driver.findElement(By.name(name));
140            }catch(Exception e){
141                    Assert.fail(name+ " not present "+ message);                
142            }
143        }
144    
145        protected void assertElementPresentByXpath(String locator) {
146            driver.findElement(By.xpath(locator));
147        }
148        
149        protected void assertElementPresentByXpath(String locator,String message) {
150            try{
151                    driver.findElement(By.xpath(locator));
152            }catch(Exception e){
153                    Assert.fail(locator+ " not present "+ message);                
154            }
155        }
156        
157        protected void assertElementPresent(String locator) {
158            driver.findElement(By.cssSelector(locator));
159        }
160        
161        protected void assertTextPresent(String text) {
162            assertTextPresent(text, "");
163        }
164    
165        protected void assertTextPresent(String text, String message) {
166            if (!driver.getPageSource().contains(text)) {
167                Assert.fail(text + " not present " + message);
168            }
169        }
170    
171        protected void blanketApproveTest() throws InterruptedException {
172            ITUtil.checkForIncidentReport(driver.getPageSource(), "methodToCall.blanketApprove", "");
173            waitAndClickByName("methodToCall.blanketApprove", "No blanket approve button does the user " + getUserName() + " have permission?");
174            Thread.sleep(2000);
175    
176            if (driver.findElements(By.xpath(ITUtil.DIV_ERROR_LOCATOR)).size()>0) {
177                String errorText = driver.findElement(By.xpath(ITUtil.DIV_ERROR_LOCATOR)).getText();
178                if (errorText != null && errorText.contains("error(s) found on page.")) {
179                    errorText = ITUtil.blanketApprovalCleanUpErrorText(errorText);
180                    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)
181                        errorText = ITUtil.blanketApprovalCleanUpErrorText(driver.findElement(By.xpath(ITUtil.DIV_EXCOL_LOCATOR)).getText()); // replacing errorText as DIV_EXCOL_LOCATOR includes the error count
182                    }
183    
184                    //                if (selenium.isElementPresent("//div[@class='left-errmsg']/div")) {
185                    //                    errorText = errorText + " " + selenium.getText("//div[@class='left-errmsg']/div/div[1]");
186                    //                }
187                    Assert.fail(errorText);
188                }
189            }
190            ITUtil.checkForIncidentReport(driver.getPageSource(), "//img[@alt='doc search']", "Blanket Approve failure");
191            waitAndClickByXpath("//img[@alt='doc search']");
192            assertEquals("Kuali Portal Index", driver.getTitle());
193            selectFrame("iframeportlet");
194            waitAndClickByXpath("//input[@name='methodToCall.search' and @value='search']");
195        }
196    
197        protected void checkForIncidentReport() {
198            checkForIncidentReport("", "");
199        }
200    
201        protected void checkForIncidentReport(String locator) {
202            checkForIncidentReport(locator, "");
203        }
204    
205        protected void checkForIncidentReport(String locator, String message) {
206            WebDriverUtil.checkForIncidentReport(driver, locator, message);
207        }
208    
209        protected void clearText(By by)  throws InterruptedException {
210            driver.findElement(by).clear();
211        }
212    
213        protected void clearTextByName(String name) throws InterruptedException {
214            clearText(By.name(name));
215        }
216    
217        protected void clearTextByXpath(String locator) throws InterruptedException {
218            clearText(By.xpath(locator));
219        }
220        
221        protected String getAttribute(By by, String attribute) throws InterruptedException {
222            waitFor(by);
223            return driver.findElement(by).getAttribute(attribute);
224        }
225        
226        /**
227         * Get value of any attribute by using element name
228         *
229         *@param name name of an element
230         *@param attribute the name of an attribute whose value is to be retrieved
231        */
232        protected String getAttributeByName(String name,String attribute) throws InterruptedException {
233            return getAttribute(By.name(name),attribute);
234        }
235        
236        /**
237         * Get value of any attribute by using element xpath
238         *
239         *@param locator locating mechanism of an element
240         *@param attribute the name of an attribute whose value is to be retrieved
241        */
242        protected String getAttributeByXpath(String locator,String attribute) throws InterruptedException {
243            return getAttribute(By.xpath(locator),attribute);
244        }
245               
246        protected String getBaseUrlString() {
247            return ITUtil.getBaseUrlString();
248        }
249    
250        protected String getText(By by)  throws InterruptedException {
251            return driver.findElement(by).getText();
252        }
253    
254        protected String getTextByName(String name) throws InterruptedException {
255            return getText(By.name(name));
256        }
257        
258        protected String getText(String locator) throws InterruptedException {
259            return getText(By.cssSelector(locator));
260        }
261    
262        protected String getTextByXpath(String locator) throws InterruptedException {
263            return getText(By.xpath(locator));
264        }
265    
266        protected String getTitle() {
267            return driver.getTitle();
268        }
269    
270        /**
271         * Override in test to define a user other than admin
272         * @return
273         */
274        public String getUserName() {
275            return user;
276        }
277    
278        protected boolean isElementPresent(By by) {
279            return (driver.findElements(by)).size()>0;
280        }
281        
282        protected boolean isElementPresent(String locator) {
283            return (driver.findElements(By.cssSelector(locator))).size()>0;
284        }
285        
286        protected boolean isElementPresentByName(String name) {
287            return isElementPresent(By.name(name));
288        }
289        
290        protected boolean isElementPresentByXpath(String locator) {
291            return isElementPresent(By.xpath(locator));
292        }
293        
294        protected void open(String url) {
295            driver.get(url);
296        }
297    
298        protected void selectFrame(String locator) {
299            driver.switchTo().frame(locator);
300        }
301        
302        protected void selectTopFrame() {
303            driver.switchTo().defaultContent();
304        }
305        
306        protected void selectWindow(String locator) {
307            driver.switchTo().window(locator);
308        }
309    
310        protected String waitForDocId() throws InterruptedException {
311            waitForElementPresentByXpath("//div[@id='headerarea']/div/table/tbody/tr[1]/td[1]");
312            return driver.findElement(By.xpath("//div[@id='headerarea']/div/table/tbody/tr[1]/td[1]")).getText();
313        }
314        
315        protected void waitForElementPresent(String locator) throws InterruptedException {
316            waitFor(By.cssSelector(locator));
317        }
318    
319        protected void waitForElementPresentByXpath(String locator) throws InterruptedException {
320            waitFor(By.xpath(locator));
321        }
322        
323        protected void waitForElementPresentByName(String name) throws InterruptedException {
324            waitFor(By.name(name));
325        }
326    
327        protected void waitForTitleToEqualKualiPortalIndex() throws InterruptedException {
328            waitForTitleToEqualKualiPortalIndex("");
329        }
330    
331        protected void waitForTitleToEqualKualiPortalIndex(String message) throws InterruptedException {
332                Thread.sleep(2000);
333    // This started failing in CI....
334    //        boolean failed = false;
335    //        for (int second = 0;; second++) {
336    //            Thread.sleep(1000);
337    //            if (second >= 60) failed = true;
338    //            try { if (failed || ITUtil.KUALI_PORTAL_TITLE.equals(driver.getTitle())) break; } catch (Exception e) {}
339    //        }
340    //        WebDriverUtil.checkForIncidentReport(driver, message); // after timeout to be sure page is loaded
341    //        if (failed) fail("timeout of " + 60 + " seconds " + message);
342        }
343    
344        protected void waitAndClick(String locator) throws InterruptedException {
345            waitAndClick(locator, "");
346        }
347    
348        protected void waitForPageToLoad() {
349            // noop webdriver doesn't it need it, except when it does...
350        }
351    
352        protected void waitFor(By by) throws InterruptedException {
353            waitFor(by, "");
354        }
355    
356        protected void waitFor(By by, String message) throws InterruptedException {
357    //        for (int second = 0;; second++) {
358                Thread.sleep(1000);
359            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
360    
361    //            if (second >= DEFAULT_WAIT_SEC) fail(by.toString() + " " + message + " " + DEFAULT_WAIT_SEC + " sec timeout.");
362                try { driver.findElement(by);
363                    //break;
364                } catch (Exception e) {}
365            driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
366    //        }
367        }
368    
369        protected void waitAndClick(By by) throws InterruptedException {
370            waitAndClick(by, "");
371        }
372    
373        protected void waitAndClick(By by, String message) throws InterruptedException {
374            waitFor(by, message);
375            try {
376                (driver.findElement(by)).click();
377            } catch (Exception e) {
378                fail(e.getMessage() + " " + by.toString() + " " + message);
379                e.printStackTrace();
380            }
381        }
382    
383        protected void waitAndClick(String locator, String message) throws InterruptedException {
384            waitAndClick(By.cssSelector(locator), message);
385        }
386    
387        protected void waitAndClickByLinkText(String text) throws InterruptedException {
388            waitAndClick(By.linkText(text),"");
389        }
390    
391        protected void waitAndClickByLinkText(String text, String message) throws InterruptedException {
392            waitAndClick(By.linkText(text), message);
393        }
394    
395        protected void waitAndClickByName(String name) throws InterruptedException {
396            waitAndClick(By.name(name), "");
397        }
398    
399        protected void waitAndClickByXpath(String xpath) throws InterruptedException {
400            waitAndClick(By.xpath(xpath));
401        }
402    
403        protected void waitAndClickByName(String name, String message) throws InterruptedException {
404            waitAndClick(By.name(name), message);
405        }
406        
407        protected void waitAndClickByXpath(String xpath, String message) throws InterruptedException {
408            waitAndClick(By.xpath(xpath), message);
409        }
410    
411        protected void waitAndType(By by, String text) throws InterruptedException {
412            waitFor(by, "");
413            try {
414                (driver.findElement(by)).sendKeys(text);
415            } catch (Exception e) {
416                fail(e.getMessage() + " " + by.toString() + " " + text);
417                e.printStackTrace();
418            }
419        }
420        
421        protected void waitAndType(By by, String text, String message) throws InterruptedException {
422            waitFor(by, "");
423            try {
424                (driver.findElement(by)).sendKeys(text);
425            } catch (Exception e) {
426                fail(e.getMessage() + " " + by.toString() + " " + text + "  "+message);
427                e.printStackTrace();
428            }
429        }
430        
431        protected void waitAndTypeByXpath(String locator, String text) throws InterruptedException {
432            waitAndType(By.xpath(locator), text);
433        }
434        
435        protected void waitAndTypeByXpath(String locator, String text, String message) throws InterruptedException {
436            waitAndType(By.xpath(locator), text, message);
437        }
438        
439        protected void waitAndTypeByName(String name, String text) throws InterruptedException {
440            waitAndType(By.name(name), text);
441        }
442        
443        protected void selectByXpath(String locator, String select) throws InterruptedException {
444            select(By.xpath(locator), select);
445        }
446        
447        protected void selectByName(String name, String select) throws InterruptedException {
448            select(By.name(name), select);
449        }
450        
451        protected void select(By by, String select)  throws InterruptedException {
452            WebElement select1 = driver.findElement(by);
453            List<WebElement> options = select1.findElements(By.tagName("option"));
454            for(WebElement option : options){
455                if(option.getText().equals(select)){
456                    option.click();
457                    break;
458                }
459            }
460        }
461        
462        protected String[] getSelectOptions(By by) throws InterruptedException {
463            WebElement select1 = driver.findElement(by);
464            List<WebElement> options = select1.findElements(By.tagName("option"));
465            String[] optionValues = new String[options.size()];
466            int counter=0;
467            for(WebElement option : options){
468                optionValues[counter] = option.getAttribute("value");
469                counter++;
470            }
471            return optionValues;
472        }
473        
474        protected String[] getSelectOptionsByName(String name) throws InterruptedException {
475            return getSelectOptions(By.name(name));
476        }
477        
478        protected String[] getSelectOptionsByXpath(String locator) throws InterruptedException {
479            return getSelectOptions(By.xpath(locator));
480        }
481        
482        protected int getCssCount(String selector) {
483            return getCssCount(By.cssSelector(selector));
484        }
485        
486        protected int getCssCount(By by) {
487            return (driver.findElements(by)).size();
488        }
489        
490        protected void checkErrorMessageItem(String message)
491        {
492            final String error_locator = "//li[@class='uif-errorMessageItem']";
493            assertElementPresentByXpath(error_locator);
494            String errorText=null;
495            try {
496                errorText = getTextByXpath(error_locator);
497            } catch (InterruptedException e) {
498                e.printStackTrace();
499            }
500            if (errorText != null && errorText.contains("errors")) {
501                Assert.fail(errorText + message);
502            }
503                   
504        }
505    
506        protected boolean isVisible(String locator) {
507            return driver.findElement(By.cssSelector(locator)).isDisplayed();
508        }
509    
510        protected boolean isVisible(By by) {
511            return driver.findElement(by).isDisplayed();
512        }
513    
514        protected boolean isVisibleByXpath(String locator) {
515            return isVisible(By.xpath(locator));
516        }
517        
518        protected void waitNotVisible(By by) throws InterruptedException {
519            for (int second = 0;; second++) {
520                if (second >= 60) {
521                    Assert.fail("timeout");
522                }
523    
524                if (!isVisible(by)) {
525                    break;
526                }
527    
528                Thread.sleep(1000);
529            }
530        }   
531    
532        protected void waitNotVisibleByXpath(String locator) throws InterruptedException {
533            waitNotVisible(By.xpath(locator));
534        }   
535        
536        protected void waitIsVisible(By by) throws InterruptedException {
537            for (int second = 0;; second++) {
538                if (second >= 60) {
539                    Assert.fail("timeout");
540                }
541                if (isVisible(by)) {
542                    break;
543                }
544                Thread.sleep(1000);
545            }
546        }
547        
548        protected void waitForElementVisible(String elementLocator, String message) throws InterruptedException {
549            boolean failed = false;
550            for (int second = 0;; second++) {
551                if (second >= 60) failed = true;                 
552                try { if (failed || (driver.findElements(By.cssSelector(elementLocator))).size()>0) break; } catch (Exception e) {}
553                Thread.sleep(1000);
554            }
555            checkForIncidentReport(elementLocator); // after timeout to be sure page is loaded
556            if (failed) fail("timeout of 60 seconds waiting for " + elementLocator + " " + message);
557        }
558        
559        protected void waitIsVisible(String locator) throws InterruptedException {
560           waitIsVisible(By.cssSelector(locator));
561        }
562        
563        protected void waitIsVisibleByXpath(String locator) throws InterruptedException {
564            waitIsVisible(By.xpath(locator));
565        }
566        
567        protected void colapseExpandByXpath(String clickLocator, String visibleLocator) throws InterruptedException {
568            waitAndClickByXpath(clickLocator);
569            waitNotVisibleByXpath(visibleLocator);
570    
571            waitAndClickByXpath(clickLocator);
572            waitIsVisibleByXpath(visibleLocator);
573        }
574    
575        protected void expandColapseByXpath(String clickLocator, String visibleLocator) throws InterruptedException {
576            waitAndClickByXpath(clickLocator);
577            waitIsVisibleByXpath(visibleLocator);
578    
579            waitAndClickByXpath(clickLocator);
580            waitNotVisibleByXpath(visibleLocator);
581        }
582        
583        public void switchToWindow(String title) {
584            Set<String> windows = driver.getWindowHandles();
585    
586            for (String window : windows) {
587                driver.switchTo().window(window);
588                if (driver.getTitle().contains(title)) {
589                    return;
590                }
591            }
592        }
593        
594        protected void check(By by)  throws InterruptedException {
595            WebElement element =driver.findElement(by);
596            if(!element.isSelected()){
597                element.click();
598            }
599        }
600        
601        protected void checkByName(String name) throws InterruptedException {
602            check(By.name(name));
603        }
604        
605        protected void checkByXpath(String locator) throws InterruptedException {
606            check(By.xpath(locator));
607        }
608    
609        protected void uncheck(By by)  throws InterruptedException {
610            WebElement element =driver.findElement(by);
611            if(element.isSelected()){
612                element.click();
613            }
614        }
615        
616        protected void uncheckByName(String name) throws InterruptedException {
617            uncheck(By.name(name));
618        }
619        
620        protected void uncheckByXpath(String locator) throws InterruptedException {
621            uncheck(By.xpath(locator));
622        }
623        
624        protected void fireEvent(String name, String event) {
625            ((JavascriptExecutor)driver).executeScript(
626                    "var elements=document.getElementsByName(\""+name+"\");"+
627                    "for (var i = 0; i < elements.length; i++){"+
628                            "elements[i]."+event+"();}"
629                            );
630        }
631        
632        protected void fireEvent(String name, String value, String event) {
633            ((JavascriptExecutor)driver).executeScript(
634                    "var elements=document.getElementsByName(\""+name+"\");"+
635                    "for (var i = 0; i < elements.length; i++){"+
636                            "if(elements[i].value=='"+value+"')"+
637                            "elements[i]."+event+"();}"
638                            );
639        }
640        
641        public void fireMouseOverEventByName(String name) {    
642            this.fireMouseOverEvent(By.name(name));
643        }
644        
645        public void fireMouseOverEventByXpath(String locator) {    
646            this.fireMouseOverEvent(By.xpath(locator));
647        }
648        
649        public void fireMouseOverEvent(By by) {    
650            Actions builder = new Actions(driver);
651            Actions hover = builder.moveToElement(driver.findElement(by));
652            hover.perform();
653       
654        }
655    }