001    /**
002     * Copyright 2005-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package edu.samplu.common;
017    
018    import com.thoughtworks.selenium.SeleneseTestBase;
019    import edu.samplu.admin.test.AdminTmplMthdSTNavBase;
020    import org.apache.commons.lang.RandomStringUtils;
021    import org.apache.commons.logging.Log;
022    import org.apache.commons.logging.LogFactory;
023    import org.junit.After;
024    import org.junit.Before;
025    import org.junit.BeforeClass;
026    import org.junit.Rule;
027    import org.junit.rules.TestName;
028    import org.openqa.selenium.Alert;
029    import org.openqa.selenium.By;
030    import org.openqa.selenium.JavascriptExecutor;
031    import org.openqa.selenium.NoSuchElementException;
032    import org.openqa.selenium.WebDriver;
033    import org.openqa.selenium.WebElement;
034    import org.openqa.selenium.chrome.ChromeDriverService;
035    import org.openqa.selenium.interactions.Actions;
036    import org.openqa.selenium.remote.RemoteWebDriver;
037    import org.openqa.selenium.support.ui.Select;
038    import org.testng.annotations.AfterMethod;
039    import org.testng.annotations.BeforeMethod;
040    
041    import java.lang.reflect.Method;
042    import java.util.ArrayList;
043    import java.util.Calendar;
044    import java.util.LinkedList;
045    import java.util.List;
046    import java.util.Set;
047    import java.util.concurrent.TimeUnit;
048    
049    import static org.junit.Assert.assertEquals;
050    
051    /**
052     * <p>
053     * Originally used to upgrade UpgradedSeleniumITBase (Selenium 1.0) tests to WebDriver (Selenium 2.0).  Now there is
054     * refactoring to be done:
055     * <ol>
056     *   <li><a href="https://jira.kuali.org/browse/KULRICE-9206">KULRICE-9206</a> Replace literal strings used more than 3 times with Constants, Javadoc constant with constant value.
057     *   <li>Extract duplicate waitAndClick...(CONSTANT) to waitAndClickConstant, Javadoc a <pre>{@link &#35;CONSTANT}</pre>.
058     *   <li>Replace large chunks of duplication</li>
059     *   <li><a href="https://jira.kuali.org/browse/KULRICE-9205">KULRICE-9205</a> Invert dependencies on fields and extract methods to WebDriverUtil so inheritance doesn't have to be used for
060     * reuse.  See WebDriverUtil.waitFor </li>
061     *   <li>Extract Nav specific code?</li>
062     *   <li>Rename to WebDriverAbstractSmokeTestBase</li>
063     * </ol>
064     * </p>
065     * <p>Calls to passed() probably don't belong in the methods reused here.</p>
066     * @author Kuali Rice Team (rice.collab@kuali.org)
067     */
068    public abstract class WebDriverLegacyITBase implements Failable { //implements com.saucelabs.common.SauceOnDemandSessionIdProvider {
069    
070        /**
071         * Administration
072         */
073        public static final String ADMINISTRATION_LINK_TEXT = "Administration";
074    
075        /**
076         * Agenda Lookup
077         */
078        public static final String AGENDA_LOOKUP_LINK_TEXT = "Agenda Lookup";
079    
080        /**
081         * "//input[@aria-invalid]"
082         */
083        public static final String ARIA_INVALID_XPATH = "//input[@aria-invalid]";
084    
085        /**
086         * methodToCall.blanketApprove
087         */
088        public static final String BLANKET_APPROVE_NAME = "methodToCall.blanketApprove";
089    
090        /**
091         * methodToCall.cancel
092         * different cancel than CANCEL2_XPATH
093         */
094        public static final String CANCEL_NAME = "methodToCall.cancel";
095    
096        /**
097         * //a[contains(text(), 'ancel')]
098         * Different cancel than CANCEL_NAME
099         */
100        public static final String CANCEL2_XPATH = "//a[contains(text(), 'ancel')]";
101    
102        /**
103         * //*[@title='close this window']
104         */
105        public static final String CLOSE_WINDOW_XPATH_TITLE = "//*[@title='close this window']";
106    
107        /**
108         * Collections
109         */
110        public static final String COLLECTIONS_LINK_TEXT = "Collections";
111    
112        /**
113         * "Kuali :: Configuration Test View"
114         */
115        public static final String CONFIGURATION_VIEW_WINDOW_TITLE = "Kuali :: Configuration Test View";
116    
117        /**
118         * (//a[contains(text(),'Configuration Test View')])[3]
119         */
120        public static final String CONFIGURATION_VIEW_XPATH = "(//a[contains(text(),'Configuration Test View')])[3]";
121    
122        /**
123         * copy
124         */
125        public static final String COPY_LINK_TEXT = "copy";
126    
127        /**
128         * New Document not submitted successfully
129         */
130        public static final String CREATE_NEW_DOCUMENT_NOT_SUBMITTED_SUCCESSFULLY_MESSAGE_TEXT = "New Document not submitted successfully";
131    
132        /**
133         * //img[@alt='create new']
134         */
135        public static final String CREATE_NEW_XPATH = "//img[@alt='create new']";
136    
137        /**
138         * Default "long" wait period is 30 seconds.  See REMOTE_PUBLIC_WAIT_SECONDS_PROPERTY to configure
139         */
140        public static final int DEFAULT_WAIT_SEC = 30;
141    
142        /**
143         * //div[@class='left-errmsg-tab']/div/div
144         */
145        public static final String DIV_LEFT_ERRMSG = "//div[@class='left-errmsg-tab']/div/div";
146    
147        /**
148         * //input[@id='document.newMaintainableObject.code']
149         */
150        public static final String DOC_CODE_XPATH = "//input[@id='document.newMaintainableObject.code']";
151    
152        /**
153         * //div[@id='headerarea']/div/table/tbody/tr[1]/td[1]
154         */
155        public static final String DOC_ID_XPATH = "//div[@id='headerarea']/div/table/tbody/tr[1]/td[1]";
156    
157        /**
158         * //table[@id='row']/tbody/tr[1]/td[1
159         */
160        public static final String DOC_ID_XPATH_2 = "//table[@id='row']/tbody/tr[1]/td[1]";
161    
162        /**
163         * //table[@id='row']/tbody/tr[1]/td[1]/a
164         */
165        public static final String DOC_ID_XPATH_3 ="//table[@id='row']/tbody/tr[1]/td[1]/a";
166    
167        /**
168         * //input[@id='document.documentHeader.documentDescription']
169         */
170        public static final String DOC_DESCRIPTION_XPATH ="//input[@id='document.documentHeader.documentDescription']";
171    
172        /**
173         * "//img[@alt='doc search']
174         */
175        public static final String DOC_SEARCH_XPATH = "//img[@alt='doc search']";
176    
177        /**
178         * //a[@title='Document Search']
179         */
180        public static final String DOC_SEARCH_XPATH_TITLE = "//a[@title='Document Search']";
181    
182        /**
183         * ENROUTE
184         */
185        public static final String DOC_STATUS_ENROUTE = "ENROUTE";
186    
187        /**
188         * FINAL
189         */
190        public static final String DOC_STATUS_FINAL = "FINAL";
191    
192        /**
193         * SAVED
194         */
195        public static final String DOC_STATUS_SAVED = "SAVED";
196    
197        /**
198         * //table[@class='headerinfo']//tr[1]/td[2]
199         */
200        public static final String DOC_STATUS_XPATH = "//table[@class='headerinfo']//tr[1]/td[2]";
201    
202        /**
203         * //table[@id='row']/tbody/tr[1]/td[4]
204         */
205        public static final String DOC_STATUS_XPATH_2 = "//table[@id='row']/tbody/tr[1]/td[4]";
206    
207        /**
208         * //div[contains(div,'Document was successfully submitted.')]
209         */
210        public static final String DOC_SUBMIT_SUCCESS_MSG_XPATH ="//div[contains(div,'Document was successfully submitted.')]";
211    
212        /**
213         * edit
214         */
215        public static final String EDIT_LINK_TEXT = "edit";
216    
217        /**
218         * iframeportlet
219         */
220        public static final String IFRAMEPORTLET_NAME = "iframeportlet";
221    
222        /**
223         * (//a[contains(text(),'Uif Components (Kitchen Sink)')])[2]
224         */
225        public static final String KITCHEN_SINK_XPATH = "(//a[contains(text(),'Uif Components (Kitchen Sink)')])[2]";
226    
227        /**
228         * KRAD
229         */
230        public static final String KRAD_XPATH = "KRAD";
231    
232        /**
233         * Kuali :: Uif Components
234         */
235        public static final String KUALI_UIF_COMPONENTS_WINDOW_XPATH = "Kuali :: Uif Components";
236    
237        /**
238         * "Kuali :: View Title"
239         */
240        public static final String KUALI_VIEW_WINDOW_TITLE = "Kuali :: View Title";
241    
242        /**
243         * //input[@name='imageField' and @value='Logout']
244         */
245        public static final String LOGOUT_XPATH = "//input[@name='imageField' and @value='Logout']";
246    
247        /**
248         * Main Menu
249         */
250        public static final String MAIN_MENU_LINK_TEXT = "Main Menu";
251    
252        /**
253         * ^[\s\S]*error[\s\S]*$"
254         */
255        public static final String REGEX_ERROR = "^[\\s\\S]*error[\\s\\S]*$";
256    
257        /**
258         * ^[\s\S]*valid[\s\S]*$
259         */
260        public static final String REGEX_VALID = "^.*\\bvalid\\b.*$";
261    
262        /**
263         * Set -Dremote.public.user= to the username to login as
264         */
265        public static final String REMOTE_PUBLIC_USER_PROPERTY = "remote.public.user";
266    
267        /**
268         * You probably don't want to really be using a userpool, set -Dremote.public.userpool= to base url if you must.
269         */
270        public static final String REMOTE_PUBLIC_USERPOOL_PROPERTY = "remote.public.userpool";
271    
272        /**
273         * Set -Dremote.login.uif=KNS to use old login screen.  Default value = KRAD
274         */
275        public static final String REMOTE_LOGIN_UIF = "remote.login.uif";
276    
277        /**
278         * Set -Dremote.public.wait.seconds to override DEFAULT_WAIT_SEC
279         */
280        public static final String REMOTE_PUBLIC_WAIT_SECONDS_PROPERTY = "remote.public.wait.seconds";
281    
282        /**
283         * return value
284         */
285        public static final String RETURN_VALUE_LINK_TEXT = "return value";
286    
287        /**
288         * Kuali :: Rich Messages
289         */
290        public static final String RICH_MESSAGES_WINDOW_TITLE = "Kuali :: Rich Messages";
291    
292        /**
293         * //div[contains(div,'Document was successfully saved.')]
294         */
295        public static final String SAVE_SUCCESSFUL_XPATH = "//div[contains(div,'Document was successfully saved.')]";
296    
297        /**
298         * //input[@name='methodToCall.save' and @alt='save']
299         */
300        public static final String SAVE_XPATH="//input[@name='methodToCall.save' and @alt='save']";
301    
302        /**
303         * KIM Screens
304         * //*[@name='methodToCall.save' and @alt='save']
305         */
306        public static final String SAVE_XPATH_2 = "//*[@name='methodToCall.save' and @alt='save']";
307    
308        /**
309         * //input[@title='search' and @name='methodToCall.search']
310         */
311        public static final String SAVE_XPATH_3 = "//input[@title='search' and @name='methodToCall.search']";
312    
313        /**
314         * //input[@name='methodToCall.search' and @value='search']
315         */
316        public static final String SEARCH_XPATH="//input[@name='methodToCall.search' and @value='search']";
317    
318        /**
319         * //input[@name='methodToCall.route' and @alt='submit']
320         */
321        public static final String SUBMIT_XPATH="//input[@name='methodToCall.route' and @alt='submit']";
322    
323        /**
324         * //input[@value='search']
325         */
326        public static final String SEARCH_XPATH_2 = "//input[@value='search']";
327    
328        /**
329         * //button[contains(text(),'Search')]
330         */
331        public static final String SEARCH_XPATH_3 = "//button[contains(text(),'earch')]";
332    
333        /**
334         * div.uif-group.uif-collectionGroup.uif-tableCollectionGroup.uif-tableSubCollection.uif-disclosure span.uif-headerText-span
335         */
336        public static final String SUB_COLLECTION_UIF_DISCLOSURE_SPAN_UIF_HEADER_TEXT_SPAN_XPATH =
337                "div.uif-group.uif-collectionGroup.uif-tableCollectionGroup.uif-tableSubCollection.uif-disclosure span.uif-headerText-span";
338    
339        /**
340         * timeout
341         */
342        public static final String TIMEOUT_MESSAGE = "timeout";
343    
344        /**
345         * Travel Account Lookup
346         */
347        public static final String TRAVEL_ACCOUNT_LOOKUP_LINK_TEXT = "Travel Account Lookup";
348    
349        /**
350         * Uif Components (Kitchen Sink)
351         */
352        public static final String UIF_COMPONENTS_KITCHEN_SINK_LINK_TEXT = "Uif Components (Kitchen Sink)";
353    
354        /**
355         * (//a[contains(text(),'Validation Framework Demo')])[2]
356         */
357        public static final String VALIDATION_FRAMEWORK_DEMO_XPATH = "(//a[contains(text(),'Validation Framework Demo')])[2]";
358    
359        /**
360         * Kuali :: Collection Totaling
361         */
362        public static final String KUALI_COLLECTION_TOTALLING_WINDOW_XPATH = "Kuali :: Collection Totaling";
363    
364        /**
365         * //a[text()='Collection Totaling']
366         */
367        public static final String KUALI_COLLECTION_TOTALLING_XPATH = "//a[text()='Collection Totaling']";
368        
369        /**
370         * XML Ingester
371         */
372        public static final String XML_INGESTER_LINK_TEXT = "XML Ingester";
373    
374        /**
375         * //a[@title='FiscalOfficerInfo Maintenance (New)']
376         */
377        public static final String FISCAL_OFFICER_INFO_MAINTENANCE_NEW_XPATH = "//a[@title='FiscalOfficerInfo Maintenance (New)']";
378        
379        static ChromeDriverService chromeDriverService;
380    
381        protected WebDriver driver;
382        protected String user = "admin";
383        protected int waitSeconds = DEFAULT_WAIT_SEC;
384        protected boolean passed = false;
385        protected String uiFramework = ITUtil.REMOTE_UIF_KNS;   // default to KNS
386    
387        private Log log = LogFactory.getLog(getClass());
388    
389        public @Rule
390        TestName testName = new TestName();
391    
392        protected String testMethodName;
393    
394        protected String jGrowlHeader;
395    
396        String sessionId = null;
397    
398        /**
399         * If WebDriverUtil.chromeDriverCreateCheck() returns a ChromeDriverService, start it.
400         * {@link edu.samplu.common.WebDriverUtil#chromeDriverCreateCheck()}
401         * @throws Exception
402         */
403        @BeforeClass
404        public static void chromeDriverService() throws Exception {
405            chromeDriverService = WebDriverUtil.chromeDriverCreateCheck();
406            if (chromeDriverService != null)
407                chromeDriverService.start();
408        }
409    
410        /**
411         * Navigation tests should return ITUtil.PORTAL.
412         * Bookmark tests should return BOOKMARK_URL.
413         *
414         * @return string
415         */
416        public abstract String getTestUrl();
417    
418        protected void navigateInternal() throws Exception {
419            // just a hook...for now...
420        }
421    
422        @BeforeMethod
423        protected void startSession(Method method) throws Exception {
424            testMethodName = method.getName(); // TestNG
425        }
426    
427        /**
428         * Setup the WebDriver properties, test, and login.  Named testSetUp so it runs after TestNG's startSession(Method)
429         *
430         * {@link WebDriverUtil#determineUser(String)}
431         * {@link WebDriverUtil#setUp(String, String, String, String)}
432         * @throws Exception
433         */
434        @Before
435        @BeforeMethod
436        public void testSetUp() {
437            try { // Don't throw any exception from this methods, exceptions in Before annotations really mess up maven, surefire, or failsafe
438    
439                if (testName != null && testName.getMethodName() != null) { // JUnit
440                    testMethodName = testName.getMethodName();
441                }
442    
443                waitSeconds = Integer.parseInt(System.getProperty(REMOTE_PUBLIC_WAIT_SECONDS_PROPERTY, DEFAULT_WAIT_SEC + ""));
444                String givenUser = WebDriverUtil.determineUser(this.toString());
445                if (givenUser != null) {
446                    user = givenUser;
447                }
448    
449                driver = WebDriverUtil.setUp(getUserName(), getTestUrl(), getClass().getSimpleName(), testMethodName);
450                this.sessionId = ((RemoteWebDriver) driver).getSessionId().toString();
451    
452                // login via either KRAD or KNS login page
453                if (isKradLogin()){
454                    WebDriverUtil.kradLogin(driver, user, this);
455                } else {
456                    WebDriverUtil.login(driver, user, this);
457                }
458    
459                jGrowlHeader = getClass().getSimpleName() + "." + testMethodName;
460                System.out.println(jGrowlHeader + " sessionId is " + sessionId);
461                jGrowl("setUp");
462    
463                navigateInternal();
464    
465            } catch (Throwable t) {
466                System.out.println("Throwable " + t.getMessage() + " in Before annotated method is very bad, ignoring and letting first method of test class to fail.");
467                t.printStackTrace();
468                System.out.println("Throwable " + t.getMessage() + " in Before annotated method is very bad, ignoring and letting first method of test class to fail.");
469            }
470        }
471    
472        /**
473         * Tear down test as configured.  Do not allow exceptions to be thrown by tearDown, it kills the test run.
474         * {@link WebDriverUtil#tearDown(boolean, String, String, String)}
475         * {@link WebDriverLegacyITBase#REMOTE_PUBLIC_USERPOOL_PROPERTY}
476         * {@link edu.samplu.common.ITUtil#dontTearDownPropertyNotSet()}
477         * @throws Exception
478         */
479        @After
480        @AfterMethod
481        public void tearDown() {
482            try {
483                if (!passed) {
484                    jGrowlSticky("FAILURE!");
485                }
486    
487                WebDriverUtil.tearDown(passed, sessionId, this.toString().trim(), user);
488            }
489    
490            catch (Throwable t) {
491                System.out.println("Exception in tearDown " + t.getMessage());
492                t.printStackTrace();
493            }
494    
495            finally {
496                try {
497                    closeAndQuitWebDriver();
498                }
499    
500                catch (Throwable t) {
501                    System.out.println(t.getMessage() + " occured during tearDown, ignoring to avoid killing test run.");
502                    t.printStackTrace();
503                    System.out.println(t.getMessage() + " occured during tearDown, ignoring to avoid killing test run.");
504                }
505            }
506        }
507    
508        private void closeAndQuitWebDriver() {
509            if (driver != null) {
510                if (ITUtil.dontTearDownPropertyNotSet()) {
511                    driver.close();
512                    driver.quit();
513                }
514            }
515            
516            else {
517                System.out.println("WebDriver is null for " + this.getClass().toString() + ", if using saucelabs, has" +
518                        " sauceleabs been uncommented in WebDriverUtil.java?  If using a remote hub did you include the port?");
519            }
520        }
521    
522        /**
523         * Set the test state to passed, this method is required to be called at the conclusion of a test for the saucelabs state of a test to be updated.
524         */
525        protected void passed() {
526            passed = true;
527            jGrowlSticky("Passed");
528        }
529    
530        protected void agendaLookupAssertions() throws Exception {
531            testLookUp();
532            assertTextPresent("Rules");
533            waitAndClick(By.xpath(CANCEL2_XPATH));
534        }
535    
536        /**
537         * Accept the javascript alert (clicking OK)
538         *
539         */
540        protected void alertAccept() {
541            Alert alert = driver.switchTo().alert();
542            //update is executed
543            alert.accept();
544        }
545    
546        /**
547         * Dismiss the javascript alert (clicking Cancel)
548         *
549         */
550        protected void alertDismiss() {
551            Alert alert = driver.switchTo().alert();
552            //update is executed
553            alert.dismiss();
554        }
555    
556        protected void assertAttributeClassRegexDoesntMatch(String field, String regex) throws InterruptedException {
557            String attribute = getAttributeByName(field, "class");
558            SeleneseTestBase.assertTrue("getAttributeByName(" + field + ", \"class\") should not be null", attribute != null);
559            SeleneseTestBase.assertFalse("attribute " + attribute + " matches regex " + regex + " and it should not",
560                    attribute.matches(regex));
561        }
562    
563        protected void assertAttributeClassRegexMatches(String field, String regex) throws InterruptedException {
564            String attribute = getAttributeByName(field, "class");
565            SeleneseTestBase.assertTrue("getAttributeByName(" + field + ", \"class\") should not be null", attribute != null);
566            SeleneseTestBase.assertTrue("attribute " + attribute + " doesn't match regex " + regex, attribute.matches(
567                    regex));
568        }
569    
570        protected void assertBlanketApproveButtonsPresent() {
571            assertElementPresentByName("methodToCall.route");
572            assertElementPresentByName("methodToCall.save");
573            assertElementPresentByName(BLANKET_APPROVE_NAME, "Blanket Approve button not present does " + user + " have permssion?");
574            assertElementPresentByName("methodToCall.close");
575            assertElementPresentByName(CANCEL_NAME);
576        }
577    
578        protected void assertCancelConfirmation() throws InterruptedException {
579            waitAndClickByLinkText("Cancel");
580            alertDismiss();
581        }
582    
583        protected void assertDocFinal(String docId) throws InterruptedException {
584            jiraAwareWaitFor(By.linkText("spreadsheet"), "");
585    
586            if (isElementPresent(By.linkText(docId))) {
587                SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getDocStatus());
588            } else {
589                SeleneseTestBase.assertEquals(docId,driver.findElement(By.xpath(DOC_ID_XPATH_2)));
590                SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getDocStatus());
591            }
592        }
593    
594        protected void assertElementPresentByName(String name) {
595            driver.findElement(By.name(name));
596        }
597    
598        protected void assertElementPresentByName(String name, String message) {
599            try {
600                driver.findElement(By.name(name));
601            } catch (Exception e) {
602                failableFail(name + " not present " + message);
603            }
604        }
605    
606        protected void assertElementPresentByXpath(String locator) {
607            driver.findElement(By.xpath(locator));
608        }
609    
610        protected void assertElementPresentByXpath(String locator, String message) {
611            try {
612                driver.findElement(By.xpath(locator));
613            } catch (Exception e) {
614                jiraAwareFail(By.xpath(locator), message, e);
615            }
616        }
617    
618        protected void assertElementPresentByLinkText(String linkText) {
619            driver.findElement(By.linkText(linkText));
620        }
621    
622        protected void assertElementPresent(String locator) {
623            driver.findElement(By.cssSelector(locator));
624        }
625    
626        protected void assertFocusTypeBlurError(String field, String textToType) throws InterruptedException {
627            fireEvent(field, "focus");
628            waitAndTypeByName(field, textToType);
629            fireEvent(field, "blur");
630            Thread.sleep(200);
631            assertAttributeClassRegexMatches(field, REGEX_ERROR);
632        }
633    
634        protected void assertFocusTypeBlurError(String field, String[] errorInputs) throws InterruptedException {
635            for (String errorInput: errorInputs) {
636                assertFocusTypeBlurError(field, errorInput);
637                clearTextByName(field);
638            }
639        }
640    
641        protected void assertFocusTypeBlurValid(String field, String textToType) throws InterruptedException {
642            fireEvent(field, "focus");
643            waitAndTypeByName(field, textToType);
644            fireEvent(field, "blur");
645            Thread.sleep(200);
646            assertAttributeClassRegexMatches(field, REGEX_VALID);
647            assertAttributeClassRegexDoesntMatch(field, REGEX_ERROR);
648        }
649    
650        protected void assertFocusTypeBlurValid(String field, String[] validInputs) throws InterruptedException {
651            for (String validInput: validInputs) {
652                assertFocusTypeBlurValid(field, validInput);
653                clearTextByName(field);
654            }
655        }
656    
657        protected void assertIsVisibleByXpath(String xpath, String message) {
658            if (!isVisibleByXpath(xpath)) {
659                failableFail(xpath + " not visible " + message);
660            }
661        }
662    
663        protected void assertIsNotVisibleByXpath(String xpath, String message) {
664            if (isVisibleByXpath(xpath)) {
665                failableFail(xpath + " visible " + message);
666            }
667        }
668    
669        protected void assertIsVisible(String locator) {
670            if (!isVisible(locator)) {
671                failableFail(locator + " is not visible and should be");
672            }
673        }
674    
675        protected void assertIsNotVisible(String locator) {
676            if (isVisible(locator)) {
677                failableFail(locator + " is visible and should not be");
678            }
679        }
680    
681        /**
682         * Assert that clicking an element causes a popup window with a specific URL
683         * Uses Selenium's findElements method which does not throw a test exception if not found.
684         * @param by The locating mechanism of the element to be clicked
685         * @param windowName The name of the popup window
686         * @param url The URL of the popup window
687         */
688        protected void assertPopUpWindowUrl(By by, String windowName, String url) {
689            driver.findElement(by).click();
690            String parentWindowHandle = driver.getWindowHandle();
691            // wait page to be loaded
692            driver.switchTo().window(windowName).findElements(By.tagName("head"));
693            SeleneseTestBase.assertEquals(url, driver.getCurrentUrl());
694            driver.switchTo().window(parentWindowHandle);
695        }
696    
697        protected void assertTableLayout() {
698            String pageSource = driver.getPageSource();
699            SeleneseTestBase.assertTrue(pageSource.contains("Table Layout"));
700            SeleneseTestBase.assertTrue(pageSource.contains("Field 1"));
701            SeleneseTestBase.assertTrue(pageSource.contains("Field 2"));
702            SeleneseTestBase.assertTrue(pageSource.contains("Field 3"));
703            SeleneseTestBase.assertTrue(pageSource.contains("Field 4"));
704            SeleneseTestBase.assertTrue(pageSource.contains("Actions"));
705        }
706    
707        protected void assertTextPresent(String text) {
708            assertTextPresent(text, "");
709        }
710    
711        protected void assertTextPresent(String text, String message) {
712            if (!driver.getPageSource().contains(text)) {
713                failableFail(text + " not present " + message);
714            }
715        }
716    
717        protected void assertTextPresent(String text, String cssSelector, String message){
718            WebElement element = driver.findElement(By.cssSelector(cssSelector));
719            if (!element.getText().contains(text)){
720                failableFail(text + " for " + cssSelector + " not present " + message);
721            }
722        }
723    
724        /**
725         * Asset that the given text does not occur in the page
726         * @param text the text to search for
727         */
728        protected void assertTextNotPresent(String text) {
729            assertTextNotPresent(text, "");
730        }
731    
732        /**
733         * Assert that the given text does not occur in the page, and add an additional message to the failure
734         * @param text the text to search for
735         * @param message the message to add to the failure
736         */
737        protected void assertTextNotPresent(String text, String message) {
738            if (driver.getPageSource().contains(text)) {
739                failableFail(text + " not present " + message);
740            }
741        }
742    
743        protected void back() {
744            driver.navigate().back();
745        }
746    
747        private void blanketApproveAssert() throws InterruptedException {
748            checkForDocError();
749            ITUtil.checkForIncidentReport(driver.getPageSource(), DOC_SEARCH_XPATH, this, "Blanket Approve failure");
750            waitAndClickDocSearch();
751            SeleneseTestBase.assertEquals("Kuali Portal Index", driver.getTitle());
752            selectFrameIframePortlet();
753            waitAndClickSearch();
754        }
755    
756        /**
757         * Tests blanket approve action.
758         * This method is used by several different tests which perform various types of blanket approvals.
759         * Therefore, this is a candidate to remain in this base class
760         *
761         * @throws InterruptedException
762         */
763        protected void blanketApproveTest() throws InterruptedException {
764            ITUtil.checkForIncidentReport(driver.getPageSource(), BLANKET_APPROVE_NAME, this, "");
765            waitAndClickByName(BLANKET_APPROVE_NAME,
766                    "No blanket approve button does the user " + getUserName() + " have permission?");
767            Thread.sleep(2000);
768    
769            blanketApproveAssert();
770        }
771    
772        protected void check(By by) throws InterruptedException {
773            WebElement element = driver.findElement(by);
774    
775            if (!element.isSelected()) {
776                element.click();
777            }
778        }
779    
780        protected void checkByName(String name) throws InterruptedException {
781            check(By.name(name));
782        }
783    
784        protected void checkByXpath(String locator) throws InterruptedException {
785            check(By.xpath(locator));
786        }
787    
788        protected void checkErrorMessageItem(String message) {
789            final String error_locator = "//li[@class='uif-errorMessageItem']";
790            assertElementPresentByXpath(error_locator);
791            String errorText = null;
792    
793            try {
794                errorText = getTextByXpath(error_locator);
795            } catch (InterruptedException e) {
796                e.printStackTrace();
797            }
798    
799            if (errorText != null && errorText.contains("errors")) {
800                failableFail(errorText + message);
801            }
802        }
803    
804        /**
805         * Uses Selenium's findElements method which does not throw a test exception if not found.
806         */
807        public void checkForDocError() {
808            if (hasDocError()) {
809                String errorText = driver.findElement(By.xpath(ITUtil.DIV_ERROR_LOCATOR)).getText();
810                errorText = ITUtil.blanketApprovalCleanUpErrorText(errorText);
811                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)
812                    errorText = ITUtil.blanketApprovalCleanUpErrorText(driver.findElement(
813                            By.xpath(ITUtil.DIV_EXCOL_LOCATOR)).getText()); // replacing errorText as DIV_EXCOL_LOCATOR includes the error count
814                }
815                if (driver.findElements(By.xpath(DIV_LEFT_ERRMSG)).size() > 0) {
816                    errorText = errorText + ITUtil.blanketApprovalCleanUpErrorText(driver.findElement(By.xpath(DIV_LEFT_ERRMSG)).getText());
817                }
818                failableFail(errorText);
819            }
820        }
821    
822        /**
823         * Uses Selenium's findElements method which does not throw a test exception if not found.
824         * @return
825         */
826        public boolean hasDocError() {
827            if (driver.findElements(By.xpath(ITUtil.DIV_ERROR_LOCATOR)).size() > 0) {
828                String errorText = driver.findElement(By.xpath(ITUtil.DIV_ERROR_LOCATOR)).getText();
829                if (errorText != null && errorText.contains("error(s) found on page.")) {
830                    return true;
831                }
832            }
833            return false;
834        }
835    
836        /**
837         * Uses Selenium's findElements method which does not throw a test exception if not found.
838         * @param errorTextToMatch
839         * @return
840         */
841        public boolean hasDocError(String errorTextToMatch) {
842            if (driver.findElements(By.xpath(ITUtil.DIV_ERROR_LOCATOR)).size() > 0) {
843                String errorText = driver.findElement(By.xpath(ITUtil.DIV_ERROR_LOCATOR)).getText();
844                if (errorText != null && errorText.contains("error(s) found on page.")) {
845                    return errorText.contains(errorTextToMatch);
846                }
847            }
848            return false;
849        }
850    
851        protected void checkForIncidentReport() {
852            checkForIncidentReport("", "");
853        }
854    
855        protected void checkForIncidentReport(String locator) {
856            checkForIncidentReport(locator, "");
857        }
858    
859        protected void checkForIncidentReport(String locator, String message) {
860            ITUtil.checkForIncidentReport(driver.getPageSource(), locator, this, message);
861        }
862    
863        protected void checkForIncidentReport(String locator, Failable failable, String message) {
864            ITUtil.checkForIncidentReport(driver.getPageSource(), locator, failable, message);
865        }
866    
867        protected void clearText(By by) throws InterruptedException {
868            driver.findElement(by).clear();
869        }
870    
871        protected void clearText(String selector) throws InterruptedException {
872            clearText(By.cssSelector(selector));
873        }
874    
875        protected void clearTextByName(String name) throws InterruptedException {
876            clearText(By.name(name));
877        }
878    
879        protected void clearTextByXpath(String locator) throws InterruptedException {
880            clearText(By.xpath(locator));
881        }
882    
883        protected void close() {
884            driver.close();
885        }
886    
887        protected void colapseExpandByXpath(String clickLocator, String visibleLocator) throws InterruptedException {
888            waitAndClickByXpath(clickLocator);
889            waitNotVisibleByXpath(visibleLocator);
890            waitAndClickByXpath(clickLocator);
891            waitIsVisibleByXpath(visibleLocator);
892        }
893    
894        protected String configNameSpaceBlanketApprove() throws Exception {
895            String docId = waitForDocId();
896            String dtsPlusTwoChars = ITUtil.createUniqueDtsPlusTwoRandomChars();
897            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Namespace " + dtsPlusTwoChars);
898            assertBlanketApproveButtonsPresent();
899            waitAndTypeByXpath(DOC_CODE_XPATH, "VTN" + dtsPlusTwoChars);
900            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']",
901                    "Validation Test NameSpace " + dtsPlusTwoChars);
902            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.applicationId']", "RICE");
903    
904            return docId;
905        }
906    
907        protected void contextLookupAssertions() throws Exception {
908            testLookUp();
909            assertTextPresent("Notes and Attachments");
910            waitAndClick(By.xpath(CANCEL2_XPATH));
911            passed();
912        }
913    
914    //    protected void deleteSubCollectionLine() throws Exception {
915    //        // click on collections page link
916    //        waitAndClickByLinkText(COLLECTIONS_LINK_TEXT);
917    //        Thread.sleep(5000);
918    //
919    //        // wait for collections page to load by checking the presence of a sub collection line item
920    //        waitForElementPresentByName("list4[0].subList[0].field1");
921    //
922    //        // change a value in the line to be deleted
923    //        waitAndTypeByName("list4[0].subList[0].field1", "selenium");
924    //
925    //        // click the delete button
926    //        waitAndClickByXpath("//div[@id='collection4_disclosureContent']/div[@class='uif-stackedCollectionLayout']/div[@class='uif-group uif-gridGroup uif-collectionItem uif-gridCollectionItem']/table/tbody/tr[5]/td/div/fieldset/div/div[@class='uif-disclosureContent']/div[@class='dataTables_wrapper']/table/tbody/tr[2]/td[6]/div/fieldset/div/div[@class='uif-boxLayout uif-horizontalBoxLayout clearfix']/button");
927    //        Thread.sleep(2000);
928    //
929    //        // confirm that the input box containing the modified value is not present
930    //        for (int second = 0;; second++) {
931    //            if (second >= waitSeconds)
932    //                failableFail(TIMEOUT_MESSAGE);
933    //            try {
934    //                if (!"selenium".equals(getAttributeByName("list4[0].subList[0].field1", "value")))
935    //                    break;
936    //            } catch (Exception e) {}
937    //            Thread.sleep(1000);
938    //        }
939    //
940    //        // verify that the value has changed for the input box in the line that has replaced the deleted one
941    //        assertNotSame("selenium", getAttributeByName("list4[0].subList[0].field1", "value"));
942    //    }
943    
944        protected void expandColapseByXpath(String clickLocator, String visibleLocator) throws InterruptedException {
945            waitAndClickByXpath(clickLocator);
946            waitIsVisibleByXpath(visibleLocator);
947            waitAndClickByXpath(clickLocator);
948            waitNotVisibleByXpath(visibleLocator);
949        }
950    
951    
952        /**
953         * {@link org.openqa.selenium.WebDriver#getWindowHandles()}
954         * @return
955         */
956        public String[] getAllWindowTitles() {
957            return (String[]) driver.getWindowHandles().toArray();
958        }
959    
960        protected String getAttribute(By by, String attribute) throws InterruptedException {
961            jiraAwareWaitFor(by, "");
962            
963            return driver.findElement(by).getAttribute(attribute);
964        }
965    
966        /**
967         * Get value of any attribute by using element name
968         *
969         * @param name name of an element
970         * @param attribute the name of an attribute whose value is to be retrieved
971         */
972        protected String getAttributeByName(String name, String attribute) throws InterruptedException {
973            return getAttribute(By.name(name), attribute);
974        }
975    
976        /**
977         * Get value of any attribute by using element xpath
978         *
979         * @param locator locating mechanism of an element
980         * @param attribute the name of an attribute whose value is to be retrieved
981         */
982        protected String getAttributeByXpath(String locator, String attribute) throws InterruptedException {
983            return getAttribute(By.xpath(locator), attribute);
984        }
985    
986        protected String getBaseUrlString() {
987            return ITUtil.getBaseUrlString();
988        }
989    
990        protected int getCssCount(String selector) {
991            return getCssCount(By.cssSelector(selector));
992        }
993    
994        /**
995         * Uses Selenium's findElements method which does not throw a test exception if not found.
996         * @param by
997         * @return
998         */
999        protected int getCssCount(By by) {
1000            return (driver.findElements(by)).size();
1001        }
1002    
1003        protected String getDocStatus() {
1004            return driver.findElement(By.xpath(DOC_STATUS_XPATH_2)).getText();
1005        }
1006    
1007        /**
1008         * Uses Selenium's findElements method which does not throw a test exception if not found.
1009         * @param by
1010         * @return
1011         * @throws InterruptedException
1012         */
1013        protected String[] getSelectOptions(By by) throws InterruptedException {
1014            WebElement select1 = driver.findElement(by);
1015            List<WebElement> options = select1.findElements(By.tagName("option"));
1016            String[] optionValues = new String[options.size()];
1017            int counter = 0;
1018    
1019            for (WebElement option : options) {
1020                optionValues[counter] = option.getAttribute("value");
1021                counter++;
1022            }
1023    
1024            return optionValues;
1025        }
1026    
1027        protected String[] getSelectOptionsByName(String name) throws InterruptedException {
1028            return getSelectOptions(By.name(name));
1029        }
1030    
1031        protected String[] getSelectOptionsByXpath(String locator) throws InterruptedException {
1032            return getSelectOptions(By.xpath(locator));
1033        }
1034    
1035        /**
1036         *
1037         * @return sessionId
1038         */
1039        public String getSessionId() {
1040            return sessionId;
1041        }
1042    
1043        protected String getText(By by) throws InterruptedException {
1044            return driver.findElement(by).getText();
1045        }
1046    
1047        protected String getTextByClassName(String className) throws InterruptedException {
1048            return getText(By.className(className));
1049        }
1050    
1051        protected String getTextById(String id) throws InterruptedException {
1052            return getText(By.id(id));
1053        }
1054    
1055        protected String getTextByName(String name) throws InterruptedException {
1056            return getText(By.name(name));
1057        }
1058    
1059        protected String getText(String locator) throws InterruptedException {
1060            return getText(By.cssSelector(locator));
1061        }
1062    
1063        protected String getTextByXpath(String locator) throws InterruptedException {
1064            return getText(By.xpath(locator));
1065        }
1066    
1067        protected String getTitle() {
1068            return driver.getTitle();
1069        }
1070    
1071        /**
1072         * "admin" by default.  Can be overridden using {@link WebDriverLegacyITBase#REMOTE_PUBLIC_USER_PROPERTY}
1073         * @return string
1074         */
1075        public String getUserName() {
1076            return user;
1077        }
1078    
1079        /**
1080         * Handles simple nested frame content; validates that a frame and nested frame exists before
1081         * switching to it
1082         * Uses Selenium's findElements method which does not throw a test exception if not found.
1083         */
1084        protected void gotoNestedFrame() {
1085            driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
1086            driver.switchTo().defaultContent();
1087           
1088            if (driver.findElements(By.xpath("//iframe")).size() > 0) {
1089                WebElement containerFrame = driver.findElement(By.xpath("//iframe"));
1090                driver.switchTo().frame(containerFrame);
1091            }
1092            
1093            if (driver.findElements(By.xpath("//iframe")).size() > 0) {
1094                WebElement contentFrame = driver.findElement(By.xpath("//iframe"));
1095                driver.switchTo().frame(contentFrame);
1096            }
1097            
1098            driver.manage().timeouts().implicitlyWait(waitSeconds, TimeUnit.SECONDS);
1099        }
1100    
1101        /**
1102         * Fail using the Failable fail method.  Calls jGrowlSticky then fail.
1103         * @param message to display with failure
1104         */
1105        public void failableFail(String message) {
1106            jGrowlSticky(message);
1107            fail(message); // Failable.fail
1108        }
1109    
1110        protected List<WebElement> findVisibleElements(By by) {
1111            List<WebElement> webElements = driver.findElements(by);
1112            List<WebElement> visibleWebElements = new LinkedList<WebElement>();
1113            for (WebElement webElement: webElements) {
1114                if (webElement.isDisplayed()) {
1115                    visibleWebElements.add(webElement);
1116                }
1117            }
1118    
1119            return visibleWebElements;
1120        }
1121    
1122        protected void fireEvent(String name, String event) {
1123            ((JavascriptExecutor) driver).executeScript("var elements=document.getElementsByName(\"" + name + "\");" +
1124                    "for (var i = 0; i < elements.length; i++){" +
1125                    "elements[i]." + event + "();}");
1126        }
1127    
1128        protected void fireEvent(String name, String value, String event) {
1129            ((JavascriptExecutor) driver).executeScript("var elements=document.getElementsByName(\"" + name + "\");" +
1130                    "for (var i = 0; i < elements.length; i++){" +
1131                    "if(elements[i].value=='" + value + "')" +
1132                    "elements[i]." + event + "();}");
1133        }
1134    
1135        /**
1136         * {@link Actions#moveToElement(org.openqa.selenium.WebElement)}
1137         * @param name
1138         */
1139        public void fireMouseOverEventByName(String name) {
1140            this.fireMouseOverEvent(By.name(name));
1141        }
1142    
1143        /**
1144         * {@link Actions#moveToElement(org.openqa.selenium.WebElement)}
1145         * @param locator
1146         */
1147        public void fireMouseOverEventByXpath(String locator) {
1148            this.fireMouseOverEvent(By.xpath(locator));
1149        }
1150    
1151        /**
1152         * {@link Actions#moveToElement(org.openqa.selenium.WebElement)}
1153         * @param by
1154         */
1155        public void fireMouseOverEvent(By by) {
1156            Actions builder = new Actions(driver);
1157            Actions hover = builder.moveToElement(driver.findElement(by));
1158            hover.perform();
1159        }
1160    
1161        protected int howManyAreVisible(By by) throws InterruptedException {
1162            int count = 0;
1163            if (by == null) {
1164    
1165                return count;
1166            }
1167    
1168            List<WebElement> webElementsFound = driver.findElements(by);
1169            for (WebElement webElement: webElementsFound) {
1170                if (webElement.isDisplayed()) {
1171                    count++;
1172                }
1173            }
1174    
1175            return count;
1176        }
1177    
1178        /**
1179         * Uses Selenium's findElements method which does not throw a test exception if not found.
1180         * @param by
1181         * @return
1182         */
1183        protected boolean isElementPresent(By by) {
1184            return (driver.findElements(by)).size() > 0;
1185        }
1186    
1187        /**
1188         * Uses Selenium's findElements method which does not throw a test exception if not found.
1189         * @param locator
1190         * @return
1191         */
1192        protected boolean isElementPresent(String locator) {
1193            return (driver.findElements(By.cssSelector(locator))).size() > 0;
1194        }
1195    
1196        protected boolean isElementPresentByName(String name) {
1197            return isElementPresent(By.name(name));
1198        }
1199    
1200        protected boolean isElementPresentByXpath(String locator) {
1201            return isElementPresent(By.xpath(locator));
1202        }
1203    
1204        protected boolean isElementPresentByLinkText(String locator) {
1205            return isElementPresent(By.linkText(locator));
1206        }
1207    
1208        protected boolean isElementPresentByDataAttributeValue(String dataAttributeName, String dataAttributeValue) {
1209            return isElementPresent(By.cssSelector("[data-" + dataAttributeName +"='"+ dataAttributeValue +"']"));
1210        }
1211    
1212        protected Boolean isTextPresent(String text) {
1213            if (driver.getPageSource().contains(text)) {
1214                return Boolean.TRUE;
1215            }
1216    
1217            return Boolean.FALSE;
1218        }
1219    
1220        protected boolean isVisible(String locator) {
1221            return driver.findElement(By.cssSelector(locator)).isDisplayed();
1222        }
1223    
1224        protected boolean isVisible(By by) {
1225            return driver.findElement(by).isDisplayed();
1226        }
1227    
1228        protected boolean isVisibleById(String id) {
1229            return isVisible(By.id(id));
1230        }
1231    
1232        protected boolean isVisibleByXpath(String locator) {
1233            return isVisible(By.xpath(locator));
1234        }
1235    
1236        protected void jGrowl(String message) {
1237            WebDriverUtil.jGrowl(driver, jGrowlHeader, false, message);
1238        }
1239    
1240        /**
1241         * Sticky is used on fail, making a call to jGrowl(String) from this method will result
1242         * in an infinite loop if JGROWL_ERROR_FAILURE is true so please don't.
1243         */
1244        protected void jGrowlSticky(String message) {
1245            WebDriverUtil.jGrowl(driver, jGrowlHeader, true, message);
1246        }
1247    
1248        private void jiraAwareFail(By by, String message, Throwable t) {
1249            JiraAwareFailureUtil.failOnMatchedJira(by.toString(), message, this);
1250            // if there isn't a matched jira to fail on, then fail
1251            checkForIncidentReport(by.toString(), message);
1252            failableFail(t.getMessage() + " " + by.toString() + " " + message + " " + driver.getCurrentUrl());
1253        }
1254    
1255        protected void jiraAwareWaitAndClick(By by, String message) throws InterruptedException {
1256            try {
1257                jiraAwareWaitFor(by, message);
1258                (driver.findElement(by)).click();
1259            } catch (Exception e) {
1260                jiraAwareFail(by, message, e);
1261            }
1262        }
1263    
1264        protected void jiraAwareWaitAndClick(By by, String message, Failable failable) throws InterruptedException {
1265            try {
1266                jiraAwareWaitFor(by, message, failable);
1267                (driver.findElement(by)).click();
1268            } catch (Exception e) {
1269                jiraAwareFail(by, message, e);
1270            }
1271        }
1272    
1273        protected void jiraAwareWaitFor(By by, String message) throws InterruptedException {
1274            try {
1275                WebDriverUtil.waitFor(this.driver, this.waitSeconds, by, message);
1276            } catch (Throwable t) {
1277                jiraAwareFail(by, message, t);
1278            }
1279        }
1280    
1281        protected void jiraAwareWaitFor(By by, String message, Failable failable) throws InterruptedException {
1282            try {
1283                WebDriverUtil.waitFor(this.driver, this.waitSeconds, by, message);
1284            } catch (Throwable t) {
1285                jiraAwareFail(by, message, t);
1286            }
1287        }
1288    
1289        protected void open(String url) {
1290            driver.get(url);
1291        }
1292    
1293        protected void selectFrameIframePortlet() {
1294            selectFrame(IFRAMEPORTLET_NAME);
1295        }
1296    
1297        protected void selectFrame(String locator) {
1298            
1299            if (IFRAMEPORTLET_NAME.equals(locator)) {
1300                gotoNestedFrame();
1301            } else {
1302               WebDriverUtil.selectFrameSafe(driver, locator);
1303            }
1304        }
1305    
1306        protected void selectTopFrame() {
1307            driver.switchTo().defaultContent();
1308        }
1309    
1310        protected void selectWindow(String locator) {
1311            driver.switchTo().window(locator);
1312        }
1313    
1314        protected void selectByXpath(String locator, String selectText) throws InterruptedException {
1315            select(By.xpath(locator), selectText);
1316        }
1317    
1318        protected void selectByName(String name, String selectText) throws InterruptedException {
1319            select(By.name(name), selectText);
1320        }
1321    
1322        /**
1323         * Uses Selenium's findElements method which does not throw a test exception if not found.
1324         * @param by
1325         * @param selectText
1326         * @throws InterruptedException
1327         */
1328        protected void select(By by, String selectText) throws InterruptedException {
1329            WebElement select1 = driver.findElement(by);
1330            List<WebElement> options = select1.findElements(By.tagName("option"));
1331    
1332            for (WebElement option : options) {
1333                if (option.getText().equals(selectText)) {
1334                    option.click();
1335                    break;
1336                }
1337            }
1338        }
1339    
1340        protected void selectOptionByName(String name, String optionValue) throws InterruptedException {
1341            selectOption(By.name(name), optionValue);
1342        }
1343    
1344        protected void selectOptionByXpath(String locator, String optionValue) throws InterruptedException {
1345            selectOption(By.name(locator), optionValue);
1346        }
1347    
1348        /**
1349         * Uses Selenium's findElements method which does not throw a test exception if not found.
1350         * @param by
1351         * @param optionValue
1352         * @throws InterruptedException
1353         */
1354        protected void selectOption(By by, String optionValue) throws InterruptedException {
1355            WebElement select1 = driver.findElement(by);
1356            List<WebElement> options = select1.findElements(By.tagName("option"));
1357    
1358            if (options == null || options.size() == 0) {
1359                failableFail("No options for select " + select1.toString() + " was looking for value " + optionValue + " using " + by.toString());
1360            }
1361    
1362            for (WebElement option : options) {
1363                if (option.getAttribute("value").equals(optionValue)) {
1364                    option.click();
1365                    break;
1366                }
1367            }
1368        }
1369    
1370        /**
1371         * If a window contains the given title switchTo it.
1372         * @param title
1373         */
1374        public void switchToWindow(String title) {
1375            Set<String> windows = driver.getWindowHandles();
1376    
1377            for (String window : windows) {
1378                driver.switchTo().window(window);            
1379                if (driver.getTitle().contains(title)) {
1380                    return;
1381                }
1382            }
1383        }
1384    
1385        // TODO delete after AddingNameSpaceAbstractSmokeTestBase migration
1386        protected void testAddingNamespace() throws Exception {
1387            testAddingNamespace(this);
1388        }
1389    
1390        // TODO move method to AddingNameSpaceAbstractSmokeTestBase after locators are extracted
1391        protected void testAddingNamespace(Failable failable) throws Exception {
1392            selectFrameIframePortlet();
1393            waitAndCreateNew();
1394            waitForPageToLoad();
1395            assertElementPresentByXpath(SAVE_XPATH_2, "save button does not exist on the page");
1396    
1397            //Enter details for Namespace.
1398            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Adding PEANUTS");
1399            waitAndTypeByXpath("//*[@id='document.documentHeader.explanation']", "I want to add PEANUTS to test KIM");
1400            waitAndTypeByXpath(DOC_CODE_XPATH, "PEANUTS");
1401            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", "The Peanuts Gang");
1402            checkByXpath("//input[@id='document.newMaintainableObject.active']");
1403            waitAndClickByXpath(SAVE_XPATH_2);
1404            waitForPageToLoad();
1405            checkForIncidentReport();
1406            assertDocumentStatusSaved();
1407    
1408            //checks it is saved and initiator is admin.
1409            SeleneseTestBase.assertEquals(DOC_STATUS_SAVED, driver.findElement(By.xpath(
1410                    "//table[@class='headerinfo']/tbody/tr[1]/td[2]")).getText());
1411            SeleneseTestBase.assertEquals("admin", driver.findElement(By.xpath(
1412                    "//table[@class='headerinfo']/tbody/tr[2]/td[1]/a")).getText());
1413        }
1414    
1415        protected void assertDocumentStatusSaved() {
1416            assertElementPresentByXpath(SAVE_SUCCESSFUL_XPATH,
1417                    "Document is not saved successfully");
1418        }
1419    
1420        protected void testAddingBrownGroup() throws Exception {
1421            selectFrameIframePortlet();
1422            waitAndCreateNew();
1423            waitForPageToLoad();
1424            String docId = waitForDocId();
1425    
1426            //Enter details for BrownGroup.
1427            waitAndTypeByName("document.documentHeader.documentDescription", "Adding Brown Group");
1428            waitAndTypeByName("document.documentHeader.explanation", "I want to add Brown Group to test KIM");
1429            selectOptionByName("document.groupNamespace", "KR-IDM");
1430            waitForPageToLoad();
1431            String groupName = "BrownGroup " + ITUtil.createUniqueDtsPlusTwoRandomChars();
1432            waitAndTypeByName("document.groupName", groupName);
1433            checkByName("document.active");
1434            waitAndClickByXpath(SAVE_XPATH_2);
1435            waitForPageToLoad();
1436            assertElementPresentByXpath(SAVE_SUCCESSFUL_XPATH,"Document is not saved successfully");
1437            checkForIncidentReport();
1438    
1439            //checks it is saved and initiator is admin.
1440            SeleneseTestBase.assertEquals(DOC_STATUS_SAVED, driver.findElement(By.xpath("//table[@class='headerinfo']/tbody/tr[1]/td[2]")).getText());
1441            SeleneseTestBase.assertEquals("admin", driver.findElement(By.xpath("//table[@class='headerinfo']/tbody/tr[2]/td[1]/a")).getText());
1442            waitAndClickByName("methodToCall.performLookup.(!!org.kuali.rice.kim.impl.identity.PersonImpl!!).(((principalId:member.memberId,principalName:member.memberName))).((``)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;;::::).anchorAssignees");
1443            waitForPageToLoad();
1444            waitAndClickSearch();
1445            waitForPageToLoad();
1446            waitAndClickReturnValue();
1447            waitForPageToLoad();
1448            waitAndClickByName("methodToCall.addMember.anchorAssignees");
1449            waitForPageToLoad();
1450            waitAndClickSave();
1451            waitAndClickSubmit();
1452            waitForPageToLoad();
1453            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH,"Document is not submitted successfully");
1454            selectTopFrame();
1455            waitAndClickByLinkText("Administration");
1456            waitForPageToLoad();
1457            waitAndClickByLinkText("Group");
1458            waitForPageToLoad();
1459            selectFrameIframePortlet();
1460            waitAndTypeByName("name", groupName);
1461            waitAndClickSearch();
1462            isElementPresentByLinkText(groupName);
1463        }
1464    
1465        protected void testAgendaEditRuleRefreshIT() throws Exception {
1466            selectFrameIframePortlet();
1467            waitAndClickByXpath("//div[@class='uif-boxLayout uif-horizontalBoxLayout clearfix']/button[1]"); //  jiraAwareWaitAndClick("id=32");
1468            Thread.sleep(3000);
1469            waitAndClickByXpath("//a[@title='edit Agenda Definition with Agenda Id=T1000']",
1470                    "Does user have edit permissions?"); // jiraAwareWaitAndClick("id=194_line0");
1471            checkForIncidentReport("");
1472            Thread.sleep(3000);
1473            waitAndClickByXpath("//li/a[@class='agendaNode ruleNode']"); // jiraAwareWaitAndClick("//li[@id='473_node_0_parent_root']/a");
1474            waitAndClickByXpath("//li/a[@class='agendaNode logicNode whenTrueNode']");
1475            waitAndClickByLinkText("[-] collapse all");
1476    
1477            // click refresh  several times
1478            for (int i = 0; i < 6; i++) {
1479                for (int second = 0;; second++) {
1480                    if (second >= waitSeconds)
1481                        failableFail(TIMEOUT_MESSAGE);
1482                    try {
1483                        if (isElementPresent(".kr-refresh-button"))
1484                            break;
1485                    } catch (Exception e) {}
1486                    Thread.sleep(1000);
1487                }
1488                waitAndClick("button.kr-refresh-button");
1489            }
1490        }
1491    
1492        protected void testAttributeDefinitionLookUp() throws Exception {
1493            waitForPageToLoad();
1494            selectFrameIframePortlet();
1495            checkForIncidentReport("testAttributeDefinitionLookUp");
1496            waitAndClickByXpath("//button[contains(.,'earch')]");
1497            Thread.sleep(3000);
1498            waitForPageToLoad();
1499            driver.findElement(By.tagName("body")).getText().contains("Actions"); // there are no actions, but the header is the only unique text from searching
1500            waitAndClickByLinkText("1000");
1501            waitForPageToLoad();
1502            driver.findElement(By.tagName("body")).getText().contains("Attribute Inquiry");
1503            driver.findElement(By.tagName("body")).getText().contains("KRMS Attributes");
1504            driver.findElement(By.tagName("body")).getText().contains("Attribute Label");
1505            driver.findElement(By.tagName("body")).getText().contains("1000");
1506            driver.findElement(By.tagName("body")).getText().contains("peopleFlowId");
1507            driver.findElement(By.tagName("body")).getText().contains("KR-RULE");
1508            driver.findElement(By.tagName("body")).getText().contains("PeopleFlow");
1509    
1510            // selectFrame("name=fancybox-frame1343151577256"); // TODO parse source to get name
1511            // jiraAwareWaitAndClick("css=button:contains(Close)"); // looks lower case, but is upper
1512            // Thread.sleep(500);
1513            // jiraAwareWaitAndClick("css=button:contains(cancel)");
1514            // AttributeDefinition's don't have actions (yet)
1515            // jiraAwareWaitAndClick("id=u80");
1516            // waitForPageToLoad();
1517            // jiraAwareWaitAndClick("id=u86");
1518            // waitForPageToLoad();
1519            // selectWindow("null");
1520            // jiraAwareWaitAndClick("xpath=(//input[@name='imageField'])[2]");
1521            // waitForPageToLoad();
1522            passed();
1523        }
1524    
1525        protected void testCancelConfirmation() throws InterruptedException {
1526            waitAndCancelConfirmation();
1527            passed();
1528        }
1529    
1530        protected void testConfigParamaterBlanketApprove() throws Exception {
1531            selectFrameIframePortlet();
1532            waitAndCreateNew();
1533            String docId = waitForDocId();
1534            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Parameter ");
1535            assertBlanketApproveButtonsPresent();
1536            SeleneseTestBase.assertEquals("", getTextByName(CANCEL_NAME));
1537            selectByXpath("//select[@id='document.newMaintainableObject.namespaceCode']", "KR-NS - Kuali Nervous System");
1538            String componentLookUp = "//input[@name='methodToCall.performLookup.(!!org.kuali.rice.coreservice.impl.component.ComponentBo!!).(((code:document.newMaintainableObject.componentCode,namespaceCode:document.newMaintainableObject.namespaceCode,))).((`document.newMaintainableObject.componentCode:code,document.newMaintainableObject.namespaceCode:namespaceCode,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;"
1539                    + getBaseUrlString() + "/kr/lookup.do;::::).anchor4']";
1540            waitAndClickByXpath(componentLookUp);
1541            waitAndClickSearch();
1542            waitAndClickReturnValue();
1543            String dtsTwo = ITUtil.createUniqueDtsPlusTwoRandomChars();
1544            String parameterName = "ValidationTestParameter" + dtsTwo;
1545            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", parameterName);
1546            waitAndTypeByXpath("//textarea[@id='document.newMaintainableObject.description']",
1547                    "Validation Test Parameter Description" + dtsTwo);
1548            selectByXpath("//select[@id='document.newMaintainableObject.parameterTypeCode']", "Document Validation");
1549            waitAndClickByXpath("//input[@id='document.newMaintainableObject.evaluationOperatorCodeAllowed']");
1550            waitForPageToLoad();
1551            blanketApproveTest();
1552            assertDocFinal(docId);
1553        }
1554    
1555        protected void testCreateNewAgenda() throws Exception {
1556            selectFrameIframePortlet();
1557            selectByName("document.newMaintainableObject.dataObject.namespace", "Kuali Rules Test");
1558            String agendaName = "Agenda Date :" + Calendar.getInstance().getTime().toString();
1559            waitAndTypeByName("document.newMaintainableObject.dataObject.agenda.name", "Agenda " + agendaName);
1560            waitAndTypeByName("document.newMaintainableObject.dataObject.contextName", "Context1");
1561            fireEvent("document.newMaintainableObject.dataObject.contextName", "blur");
1562            fireEvent("document.newMaintainableObject.dataObject.contextName", "focus");
1563            waitForElementPresentByName("document.newMaintainableObject.dataObject.agenda.typeId");
1564            selectByName("document.newMaintainableObject.dataObject.agenda.typeId", "Campus Agenda");
1565            waitForElementPresentByName("document.newMaintainableObject.dataObject.customAttributesMap[Campus]");
1566            waitAndTypeByName("document.newMaintainableObject.dataObject.customAttributesMap[Campus]", "BL");
1567            waitAndClickByXpath("//div[2]/button");
1568            waitForPageToLoad();
1569            waitAndClickByXpath("//div[2]/button[3]");
1570            waitForPageToLoad();
1571            selectTopFrame();
1572            waitAndClickByXpath("(//input[@name='imageField'])[2]");
1573            passed();
1574        }
1575    
1576        protected void testCreateDocType() throws Exception {
1577            selectFrameIframePortlet();
1578            waitAndCreateNew();
1579            assertElementPresentByXpath("//*[@name='methodToCall.route' and @alt='submit']","save button does not exist on the page");
1580            
1581            //waitForElementPresentByXpath(DOC_ID_XPATH);
1582            //String docId = driver.findElement(By.xpath(DOC_ID_XPATH)).getText();
1583            String docId = waitForDocId();
1584            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Creating new Document Type");
1585            String parentDocType = "//input[@name='methodToCall.performLookup.(!!org.kuali.rice.kew.doctype.bo.DocumentType!!).(((name:document.newMaintainableObject.parentDocType.name,documentTypeId:document.newMaintainableObject.docTypeParentId,))).((`document.newMaintainableObject.parentDocType.name:name,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;"
1586                    + getBaseUrlString() + "/kr/lookup.do;::::).anchor4']";
1587            waitAndClickByXpath(parentDocType);
1588            waitForPageToLoad();
1589            Thread.sleep(2000);
1590            waitAndClickSearch();
1591            waitForPageToLoad();
1592            waitAndClickReturnValue();
1593            String docTypeName = "TestDocType" + ITUtil.createUniqueDtsPlusTwoRandomChars();
1594            waitForElementPresentByXpath("//input[@id='document.newMaintainableObject.name']");
1595            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", docTypeName);
1596            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.unresolvedDocHandlerUrl']","${kr.url}/maintenance.do?methodToCall=docHandler");
1597            
1598            //waitAndTypeByXpath("//input[@id='document.newMaintainableObject.actualNotificationFromAddress']", "NFA");
1599            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.label']", "TestDocument Label");
1600            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.unresolvedHelpDefinitionUrl']","default.htm?turl=WordDocuments%2Fdocumenttype.htm");
1601            waitAndClickByXpath("//*[@name='methodToCall.route' and @alt='submit']");
1602            checkForIncidentReport();
1603            waitForPageToLoad();
1604            driver.switchTo().defaultContent();
1605            waitAndClickDocSearchTitle();
1606            waitForPageToLoad();
1607            selectFrameIframePortlet();
1608            waitAndClickSearch();
1609            Thread.sleep(2000);
1610            SeleneseTestBase.assertEquals(docId, driver.findElement(By.xpath(DOC_ID_XPATH_2)).getText());
1611        }
1612    
1613        protected void testCreateNewCancel() throws Exception {
1614            selectFrameIframePortlet();
1615            waitAndCreateNew();
1616            testCancelConfirmation();
1617        }
1618    
1619        protected List<String> testCreateNewParameter(String docId, String parameterName) throws Exception {
1620            waitForPageToLoad();
1621            docId = waitForDocId();
1622            //Enter details for Parameter.
1623            waitAndTypeByName("document.documentHeader.documentDescription", "Adding Test Parameter");
1624            selectOptionByName("document.newMaintainableObject.namespaceCode", "KR-WKFLW");
1625            waitAndTypeByName("document.newMaintainableObject.componentCode", "ActionList");
1626            waitAndTypeByName("document.newMaintainableObject.applicationId", "KUALI");
1627            parameterName = "TestIndicator" + ITUtil.createUniqueDtsPlusTwoRandomChars();
1628            waitAndTypeByName("document.newMaintainableObject.name", parameterName);
1629            waitAndTypeByName("document.newMaintainableObject.value", "Y");
1630            waitAndTypeByName("document.newMaintainableObject.description", "for testing");
1631            selectOptionByName("document.newMaintainableObject.parameterTypeCode", "HELP");
1632            waitAndClickByXpath("//input[@name='document.newMaintainableObject.evaluationOperatorCode' and @value='A']");
1633            waitAndClickSave();
1634            waitAndClickSubmit();
1635            waitForPageToLoad();
1636            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH,"Document is not submitted successfully");
1637            selectTopFrame();
1638            waitAndClickDocSearchTitle();
1639            waitForPageToLoad();
1640            selectFrameIframePortlet();
1641            waitAndClickSearch();
1642            Thread.sleep(2000);
1643            SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3));
1644            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
1645            selectTopFrame();
1646            List<String> params = new ArrayList<String>();
1647            params.add(docId);
1648            params.add(parameterName);
1649    
1650            return params;
1651        }
1652    
1653        protected List<String> testCreateNewParameterType(String docId, String parameterType, String parameterCode)throws Exception {
1654            waitForPageToLoad();
1655            docId = waitForDocId();
1656    
1657            //Enter details for Parameter.
1658            waitAndTypeByName("document.documentHeader.documentDescription", "Adding Test Parameter Type");
1659            parameterCode = RandomStringUtils.randomAlphabetic(4).toLowerCase();
1660            waitAndTypeByName("document.newMaintainableObject.code", parameterCode);
1661            parameterType = "testing " + ITUtil.createUniqueDtsPlusTwoRandomChars();
1662            waitAndTypeByName("document.newMaintainableObject.name", parameterType);
1663            waitAndClickSave();
1664            waitAndClickSubmit();
1665            waitForPageToLoad();
1666            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully");
1667            selectTopFrame();
1668            waitAndClickDocSearchTitle();
1669            waitForPageToLoad();
1670            selectFrameIframePortlet();
1671            waitAndClickSearch();
1672            Thread.sleep(2000);
1673            SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3));
1674            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
1675            selectTopFrame();
1676            List<String> params = new ArrayList<String>();
1677            params.add(docId);
1678            params.add(parameterType);
1679            params.add(parameterCode);
1680    
1681            return params;
1682        }
1683    
1684        protected void testCreateNewSearchReturnValueCancelConfirmation() throws InterruptedException, Exception {
1685            selectFrameIframePortlet();
1686            waitAndCreateNew();
1687            waitAndClickSearch2();
1688            waitAndClickReturnValue();
1689            waitAndCancelConfirmation();
1690            passed();
1691        }
1692    
1693        protected List<String> testCopyParameter(String docId, String parameterName) throws Exception {
1694            selectFrameIframePortlet();
1695            waitAndClickCopy();
1696            waitForPageToLoad();
1697            docId = waitForDocId();
1698            waitAndTypeByName("document.documentHeader.documentDescription", "Copying Test Parameter");
1699            selectOptionByName("document.newMaintainableObject.namespaceCode", "KR-WKFLW");
1700            waitAndTypeByName("document.newMaintainableObject.componentCode", "ActionList");
1701            waitAndTypeByName("document.newMaintainableObject.applicationId", "KUALI");
1702            parameterName = "TestIndicator" + ITUtil.createUniqueDtsPlusTwoRandomChars();
1703            waitAndTypeByName("document.newMaintainableObject.name", parameterName);
1704            waitAndClickSave();
1705            waitAndClickSubmit();
1706            waitForPageToLoad();
1707            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH,"Document is not submitted successfully");
1708            selectTopFrame();
1709            waitAndClickDocSearchTitle();
1710            waitForPageToLoad();
1711            selectFrameIframePortlet();
1712            waitAndClickSearch();
1713            Thread.sleep(2000);
1714            SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3));
1715            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
1716            selectTopFrame();
1717            List<String> params = new ArrayList<String>();
1718            params.add(docId);
1719            params.add(parameterName);
1720    
1721            return params;
1722        }
1723    
1724        protected List<String> testCopyParameterType(String docId, String parameterType, String parameterCode) throws Exception {
1725            selectFrameIframePortlet();
1726            waitAndClickCopy();
1727            waitForPageToLoad();
1728            docId = waitForDocId();
1729            waitAndTypeByName("document.documentHeader.documentDescription", "Copying Test Parameter");
1730            parameterCode = RandomStringUtils.randomAlphabetic(4).toLowerCase();
1731            waitAndTypeByName("document.newMaintainableObject.code", parameterCode);
1732            clearTextByName("document.newMaintainableObject.name");
1733            parameterType = "testing " + ITUtil.createUniqueDtsPlusTwoRandomChars();
1734            waitAndTypeByName("document.newMaintainableObject.name", parameterType);
1735            waitAndClickSave();
1736            waitAndClickSubmit();
1737            waitForPageToLoad();
1738            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully");
1739            selectTopFrame();
1740            waitAndClickDocSearchTitle();
1741            waitForPageToLoad();
1742            selectFrameIframePortlet();
1743            waitAndClickSearch();
1744            Thread.sleep(2000);
1745            SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3));
1746            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
1747            selectTopFrame();
1748            List<String> params = new ArrayList<String>();
1749            params.add(docId);
1750            params.add(parameterType);
1751            params.add(parameterCode);
1752    
1753            return params;
1754        }
1755    
1756    
1757        protected void testDocTypeLookup() throws Exception {
1758            selectFrameIframePortlet();
1759            waitAndClickByXpath("//input[@title='Search Parent Name']");
1760            waitForPageToLoad();
1761            waitAndClickByXpath(SAVE_XPATH_3);
1762            waitAndClickByXpath("//table[@id='row']/tbody/tr[contains(td[3],'RiceDocument')]/td[1]/a");
1763            waitForPageToLoad();
1764            waitAndClickByXpath(SAVE_XPATH_3);
1765            SeleneseTestBase.assertEquals("RiceDocument", getTextByXpath("//table[@id='row']/tbody/tr/td[4]/a"));
1766            waitAndClickByName("methodToCall.clearValues");
1767            waitAndTypeByName("name", "Kuali*D");
1768            waitAndClickByXpath(SAVE_XPATH_3);
1769            assertElementPresentByXpath("//table[@id='row']/tbody/tr[contains(td[3], 'KualiDocument')]");
1770            String docIdOld = getTextByXpath("//table[@id='row']/tbody/tr[contains(td[3], 'KualiDocument')]/td[2]/a");
1771            waitAndClickByName("methodToCall.clearValues");
1772            waitAndTypeByName("label", "KualiDocument");
1773            waitAndClickByXpath(SAVE_XPATH_3);
1774            assertElementPresentByXpath("//table[@id='row']/tbody/tr[contains(td[5], 'KualiDocument')]");
1775            waitAndClickByName("methodToCall.clearValues");
1776            waitAndTypeByName("documentTypeId", docIdOld);
1777            waitAndClickByXpath(SAVE_XPATH_3);
1778            assertElementPresentByXpath("//table[@id='row']/tbody/tr[contains(td[2], '" + docIdOld + "')]");
1779        }
1780    
1781    
1782        protected List<String> testEditParameterType(String docId, String parameterType, String parameterCode) throws Exception {
1783            selectFrameIframePortlet();
1784            waitAndClickEdit();
1785            waitForPageToLoad();
1786            docId = waitForDocId();
1787            waitAndTypeByName("document.documentHeader.documentDescription", "Editing Test Parameter");
1788            clearTextByName("document.newMaintainableObject.name");
1789            parameterType = "testing " + ITUtil.createUniqueDtsPlusTwoRandomChars();
1790            waitAndTypeByName("document.newMaintainableObject.name", parameterType);
1791            waitAndClickSave();
1792            waitAndClickSubmit();
1793            waitForPageToLoad();
1794            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully");
1795            selectTopFrame();
1796            waitAndClickDocSearchTitle();
1797            waitForPageToLoad();
1798            selectFrameIframePortlet();
1799            waitAndClickSearch();
1800            Thread.sleep(2000);
1801            SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3));
1802            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
1803            selectTopFrame();
1804            List<String> params = new ArrayList<String>();
1805            params.add(docId);
1806            params.add(parameterType);
1807            params.add(parameterCode);
1808    
1809            return params;
1810        }
1811    
1812        protected List<String> testEditParameter(String docId, String parameterName) throws Exception
1813        {
1814            selectFrameIframePortlet();
1815            waitAndClickEdit();
1816            waitForPageToLoad();
1817            docId = waitForDocId();
1818            waitAndTypeByName("document.documentHeader.documentDescription", "Editing Test Parameter");
1819            clearTextByName("document.newMaintainableObject.value");
1820            waitAndTypeByName("document.newMaintainableObject.value", "N");
1821            waitAndClickSave();
1822            waitAndClickSubmit();
1823            waitForPageToLoad();
1824            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully");
1825            selectTopFrame();
1826            waitAndClickDocSearchTitle();
1827            waitForPageToLoad();
1828            selectFrameIframePortlet();
1829            waitAndClickSearch();
1830            Thread.sleep(2000);
1831            SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3));
1832            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
1833            selectTopFrame();
1834            List<String> params = new ArrayList<String>();
1835            params.add(docId);
1836            params.add(parameterName);
1837            return params;
1838        }
1839    
1840        protected void testEditRouteRulesDelegation() throws Exception {
1841            waitForPageToLoad();
1842            Thread.sleep(3000);
1843            SeleneseTestBase.assertEquals("Kuali Portal Index", getTitle());
1844            selectFrameIframePortlet();
1845            waitAndClickSearch();
1846            waitForPageToLoad();
1847            Thread.sleep(3000);
1848            waitAndClickEdit();
1849            waitForPageToLoad();
1850            Thread.sleep(3000);
1851            SeleneseTestBase.assertTrue(isElementPresentByName(CANCEL_NAME));
1852            waitAndClickCancel();
1853            waitForPageToLoad();
1854            Thread.sleep(3000);
1855            waitAndClickByName("methodToCall.processAnswer.button0");
1856            waitForPageToLoad();
1857            passed();
1858        }
1859    
1860        protected void testFiscalOfficerInfoMaintenanceNew() throws Exception {
1861            selectFrameIframePortlet();
1862            checkForIncidentReport("", "https://jira.kuali.org/browse/KULRICE-7723 FiscalOfficerInfoMaintenanceNewIT.testUntitled need a better name and user permission error");
1863            String docId = getTextByXpath("//*[@id='u13_control']");
1864            waitAndTypeByXpath("//input[@name='document.documentHeader.documentDescription']", "New FO Doc");
1865            waitAndTypeByXpath("//input[@name='document.newMaintainableObject.dataObject.id']", "5");
1866            waitAndTypeByXpath("//input[@name='document.newMaintainableObject.dataObject.userName']", "Jigar");
1867            waitAndClickByXpath("//button[@id='usave']");
1868            Integer docIdInt = Integer.valueOf(docId).intValue();
1869            selectTopFrame();
1870            waitAndClickByXpath("//img[@alt='action list']");
1871            selectFrameIframePortlet();
1872    
1873            if(isElementPresentByLinkText("Last")){
1874                waitAndClickByLinkText("Last");
1875                waitAndClickByLinkText(docIdInt.toString());
1876            } else {
1877                waitAndClickByLinkText(docIdInt.toString());
1878            }
1879    
1880            //      ------------------------------- Not working in code when click docId link in list--------------------------
1881            //Thread.sleep(5000);
1882            //String[] windowTitles = getAllWindowTitles();
1883            //selectWindow(windowTitles[1]);
1884            //windowFocus();
1885            //assertEquals(windowTitles[1], getTitle());
1886            //checkForIncidentReport("Action List Id link opened window.", "https://jira.kuali.org/browse/KULRICE-9062 Action list id links result in 404 or NPE");
1887    
1888            //------submit-----//
1889            //selectFrame("relative=up");
1890            //waitAndClick("//button[@value='submit']");
1891            //waitForPageToLoad50000();
1892            //close();
1893            //------submit over---//
1894    
1895            //----step 2----//
1896            //selectWindow("null");
1897            //windowFocus();
1898            //waitAndClick("//img[@alt='doc search']");
1899            //waitForPageToLoad50000();
1900            //assertEquals(windowTitles[0], getTitle());
1901            //selectFrame("iframeportlet");
1902            //waitAndClick(SEARCH_XPATH);
1903            //waitForPageToLoad50000();
1904            //----step 2 over ----//
1905    
1906            //-----Step 3 verifies that doc is final-------//
1907            //assertEquals("FINAL", getText("//table[@id='row']/tbody/tr[1]/td[4]"));
1908            //selectFrame("relative=up");
1909            //waitAndClick("link=Main Menu");
1910            //waitForPageToLoad50000();
1911            //assertEquals(windowTitles[0], getTitle());
1912            //-----Step 3 verified that doc is final -------
1913        }
1914    
1915        protected void testIdentityGroupBlanketApprove() throws Exception {
1916            selectFrameIframePortlet();
1917            waitAndCreateNew();                
1918            String docId = waitForDocId();
1919            String dtsTwo = ITUtil.createUniqueDtsPlusTwoRandomChars();
1920            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Group " + dtsTwo);
1921            assertBlanketApproveButtonsPresent();
1922            selectByXpath("//select[@id='document.groupNamespace']", AdminTmplMthdSTNavBase.LABEL_KUALI_KUALI_SYSTEMS);
1923            waitAndTypeByXpath("//input[@id='document.groupName']", "Validation Test Group1 " + dtsTwo);
1924            waitAndClickByName(
1925                    "methodToCall.performLookup.(!!org.kuali.rice.kim.impl.identity.PersonImpl!!).(((principalId:member.memberId,principalName:member.memberName))).((``)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;;::::).anchorAssignees");
1926            waitAndClickSearch();
1927            waitAndClickReturnValue();
1928            waitAndClickByName("methodToCall.addMember.anchorAssignees");
1929            waitForPageToLoad();
1930            blanketApproveTest();
1931            assertDocFinal(docId);
1932        }
1933    
1934        protected void testIdentityPermissionBlanketApprove() throws Exception {
1935            selectFrameIframePortlet();
1936            waitAndCreateNew();        
1937            String docId = waitForDocId();
1938            String dtsTwo = ITUtil.createUniqueDtsPlusTwoRandomChars();
1939            waitAndTypeByXpath("//input[@name='document.documentHeader.documentDescription']",
1940                    "Validation Test Permission " + dtsTwo);
1941            assertBlanketApproveButtonsPresent();
1942            waitAndTypeByXpath("//input[@name='document.documentHeader.organizationDocumentNumber']", "10012");
1943            selectByXpath("//select[@name='document.newMaintainableObject.namespaceCode']",
1944                    AdminTmplMthdSTNavBase.LABEL_KUALI_KUALI_SYSTEMS);
1945            selectByXpath("//select[@name='document.newMaintainableObject.templateId']",
1946                    AdminTmplMthdSTNavBase.LABEL_KUALI_DEFAULT);
1947            waitAndTypeByXpath("//input[@name='document.newMaintainableObject.name']",
1948                    "ValidationTestPermission" + dtsTwo);
1949            blanketApproveTest();
1950            assertDocFinal(docId);
1951        }
1952    
1953        protected void testIdentityPersonBlanketApprove() throws Exception {
1954            selectFrameIframePortlet();
1955            waitAndCreateNew();        
1956            String docId = waitForDocId();
1957            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Person");
1958            assertBlanketApproveButtonsPresent();
1959            waitAndTypeByXpath("//input[@id='document.principalName']", "principal" + RandomStringUtils.randomAlphabetic(3).toLowerCase());
1960            selectByName("newAffln.affiliationTypeCode", "Affiliate");
1961            selectByName("newAffln.campusCode", "BX - BLGTN OFF CAMPUS");
1962            selectByName("newAffln.campusCode", "BL - BLOOMINGTON");
1963            assertElementPresentByName("newAffln.dflt");
1964            waitAndClickByName("newAffln.dflt");
1965            waitAndClickByName("methodToCall.addAffln.anchor");
1966            waitAndClickByName("methodToCall.toggleTab.tabContact");
1967            selectByName("newName.namePrefix", "Mr");
1968            waitAndTypeByName("newName.firstName", "First");
1969            waitAndTypeByName("newName.lastName", "Last");
1970            selectByName("newName.nameSuffix", "Mr");
1971            waitAndClickByName("newName.dflt");
1972            waitAndClickByName("methodToCall.addName.anchor");
1973            waitForPageToLoad();
1974            blanketApproveTest();
1975            assertDocFinal(docId);
1976        }
1977    
1978        protected void testIdentityResponsibilityBlanketApprove() throws Exception {
1979            selectFrameIframePortlet();
1980            waitAndCreateNew();        
1981            String docId = waitForDocId();
1982            String dtsTwo = ITUtil.createUniqueDtsPlusTwoRandomChars();
1983            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Responsibility " + dtsTwo);
1984            assertBlanketApproveButtonsPresent();
1985            selectByXpath("//select[@id='document.newMaintainableObject.namespaceCode']",
1986                    AdminTmplMthdSTNavBase.LABEL_KUALI_KUALI_SYSTEMS);
1987            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']",
1988                    "Validation Test Responsibility " + dtsTwo);
1989            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.documentTypeName']", "Test " + dtsTwo);
1990            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.routeNodeName']", "Test " + dtsTwo);
1991            waitAndClickByXpath("//input[@id='document.newMaintainableObject.actionDetailsAtRoleMemberLevel']");
1992            waitAndClickByXpath("//input[@id='document.newMaintainableObject.required']");
1993            blanketApproveTest();
1994            assertDocFinal(docId);
1995        }
1996    
1997        protected void testIdentityRoleBlanketApprove() throws Exception {
1998            selectFrameIframePortlet();
1999            waitAndCreateNew();
2000            waitAndClickByXpath(SEARCH_XPATH, "No search button to click.");
2001            waitAndClickByLinkText(RETURN_VALUE_LINK_TEXT, "No return value link");        
2002            String docId = waitForDocId();
2003            String dtsTwo = ITUtil.createUniqueDtsPlusTwoRandomChars();
2004            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Role " + dtsTwo);
2005            assertBlanketApproveButtonsPresent();
2006            selectByXpath("//select[@id='document.roleNamespace']", AdminTmplMthdSTNavBase.LABEL_KUALI_KUALI_SYSTEMS);
2007            waitAndTypeByXpath("//input[@id='document.roleName']", "Validation Test Role " + dtsTwo,
2008                    "No Role Name input to type in.");
2009            waitAndClickByName(
2010                    "methodToCall.performLookup.(!!org.kuali.rice.kim.impl.identity.PersonImpl!!).(((principalId:member.memberId,principalName:member.memberName))).((``)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;;::::).anchorAssignees");
2011            waitAndClickByXpath(SEARCH_XPATH, "No search button to click.");
2012            waitAndClickByLinkText(RETURN_VALUE_LINK_TEXT, "No return value link");
2013            waitAndClickByName("methodToCall.addMember.anchorAssignees");
2014            waitForPageToLoad();
2015            blanketApproveTest();
2016            assertDocFinal(docId);
2017        }
2018    
2019        protected void testLocationCampusBlanketApprove() throws Exception {
2020            selectFrameIframePortlet();
2021            waitAndCreateNew();        
2022            String docId = waitForDocId();
2023            String twoLetters = RandomStringUtils.randomAlphabetic(2);
2024            waitAndTypeByName("document.documentHeader.documentDescription", "Validation Test Campus " + twoLetters);
2025            assertBlanketApproveButtonsPresent();
2026            waitAndTypeByName("document.newMaintainableObject.code", RandomStringUtils.randomAlphabetic(2));
2027            waitAndTypeByName("document.newMaintainableObject.name", "Validation Test Campus" + ITUtil.createUniqueDtsPlusTwoRandomChars());
2028            waitAndTypeByName("document.newMaintainableObject.shortName", "VTC " + twoLetters);
2029            selectByName("document.newMaintainableObject.campusTypeCode", "B - BOTH");
2030            blanketApproveTest();
2031            assertDocFinal(docId);
2032        }
2033    
2034        protected void testLocationCountryBlanketApprove() throws InterruptedException {
2035            selectFrameIframePortlet();
2036            waitAndCreateNew();        
2037            String docId = waitForDocId();
2038            assertBlanketApproveButtonsPresent();
2039            String twoUpperCaseLetters = RandomStringUtils.randomAlphabetic(2).toUpperCase();
2040            String countryName = "Validation Test Country " + ITUtil.DTS + " " + twoUpperCaseLetters;
2041            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, countryName);
2042            waitAndTypeByXpath(DOC_CODE_XPATH, twoUpperCaseLetters);
2043            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", countryName);
2044            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.alternateCode']", "V" + twoUpperCaseLetters);
2045            blanketApproveTest();
2046            assertDocFinal(docId);
2047        }
2048    
2049        protected void testLocationCountyBlanketApprove() throws Exception {
2050            selectFrameIframePortlet();
2051            waitAndCreateNew();        
2052            String docId = waitForDocId();
2053            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test County");
2054            assertBlanketApproveButtonsPresent();
2055            String countryLookUp = "//input[@name='methodToCall.performLookup.(!!org.kuali.rice.location.impl.country.CountryBo!!).(((code:document.newMaintainableObject.countryCode,))).((`document.newMaintainableObject.countryCode:code,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;"
2056                    + getBaseUrlString() + "/kr/lookup.do;::::).anchor4']";
2057            waitAndClickByXpath(countryLookUp);
2058            waitAndTypeByName("code", "US");
2059            waitAndClickSearch();
2060            waitAndClickReturnValue();
2061            waitAndTypeByXpath(DOC_CODE_XPATH, RandomStringUtils.randomAlphabetic(2).toUpperCase());
2062            String stateLookUp = "//input[@name='methodToCall.performLookup.(!!org.kuali.rice.location.impl.state.StateBo!!).(((countryCode:document.newMaintainableObject.countryCode,code:document.newMaintainableObject.stateCode,))).((`document.newMaintainableObject.countryCode:countryCode,document.newMaintainableObject.stateCode:code,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;"
2063                    + getBaseUrlString() + "/kr/lookup.do;::::).anchor4']";
2064            waitAndClickByXpath(stateLookUp);
2065            waitAndTypeByName("code", RandomStringUtils.randomAlphabetic(2));
2066            waitAndClickSearch();
2067            waitAndClickReturnValue();
2068            String countyName = "Validation Test County" + ITUtil.createUniqueDtsPlusTwoRandomChars();
2069            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", countyName);
2070            waitAndClickByXpath("//input[@id='document.newMaintainableObject.active']");
2071            blanketApproveTest();
2072            assertDocFinal(docId);
2073        }
2074    
2075        protected void testLocationPostBlanketApprove() throws Exception {
2076            selectFrameIframePortlet();
2077            waitAndCreateNew();        
2078            String docId = waitForDocId();
2079            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Postal Code");
2080            assertBlanketApproveButtonsPresent();
2081            String countryLookUp = "//input[@name='methodToCall.performLookup.(!!org.kuali.rice.location.impl.country.CountryBo!!).(((code:document.newMaintainableObject.countryCode,))).((`document.newMaintainableObject.countryCode:code,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;"
2082                    + getBaseUrlString() + "/kr/lookup.do;::::).anchor4']";
2083            waitAndClickByXpath(countryLookUp);
2084            waitAndTypeByName("code", "US");
2085            waitAndClickSearch();
2086            waitAndClickReturnValue();
2087            String code = RandomStringUtils.randomNumeric(5);
2088            waitAndTypeByXpath(DOC_CODE_XPATH, code);
2089            String stateLookUp = "//input[@name='methodToCall.performLookup.(!!org.kuali.rice.location.impl.state.StateBo!!).(((countryCode:document.newMaintainableObject.countryCode,code:document.newMaintainableObject.stateCode,))).((`document.newMaintainableObject.countryCode:countryCode,document.newMaintainableObject.stateCode:code,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;"
2090                    + getBaseUrlString() + "/kr/lookup.do;::::).anchor4']";
2091            waitAndClickByXpath(stateLookUp);
2092            waitAndClickSearch();
2093            waitAndClickByXpath("//table[@id='row']/tbody/tr[4]/td[1]/a");
2094            String cityName = "Validation Test Postal Code " + code;
2095            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.cityName']", cityName);
2096            blanketApproveTest();
2097            assertDocFinal(docId);
2098        }
2099    
2100        protected void testLocationStateBlanketApprove() throws Exception {
2101            selectFrameIframePortlet();
2102            waitAndCreateNew();
2103            String docId = waitForDocId();
2104            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test State");
2105            assertBlanketApproveButtonsPresent();
2106            
2107            //jiraAwareWaitAndClick("methodToCall.performLookup.(!!org.kuali.rice.location.impl.country.CountryBo!!).(((code:document.newMaintainableObject.countryCode,))).((`document.newMaintainableObject.countryCode:code,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;" + getBaseUrlString() + "/kr/lookup.do;::::).anchor4");
2108            String countryLookUp = "//input[@name='methodToCall.performLookup.(!!org.kuali.rice.location.impl.country.CountryBo!!).(((code:document.newMaintainableObject.countryCode,))).((`document.newMaintainableObject.countryCode:code,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;"
2109                    + getBaseUrlString() + "/kr/lookup.do;::::).anchor4']";
2110            waitAndClickByXpath(countryLookUp);
2111            waitAndClickSearch();
2112            waitAndClickReturnValue();
2113            String code = RandomStringUtils.randomAlphabetic(2).toUpperCase();
2114            waitAndTypeByXpath(DOC_CODE_XPATH, code);
2115            String state = "Validation Test State " + code;
2116            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", state);
2117            waitAndClickByXpath("//input[@id='document.newMaintainableObject.active']");
2118            blanketApproveTest();
2119            assertDocFinal(docId);
2120        }
2121    
2122        protected void testLookUp() throws Exception {
2123            waitForPageToLoad();
2124            selectFrameIframePortlet();
2125    
2126            // Mixed capitalization
2127            waitAndClick(By.xpath(SEARCH_XPATH_3));
2128            waitAndClickByLinkText(EDIT_LINK_TEXT, "edit button not present does user " + user + " have permission?");
2129            checkForIncidentReport("submit");
2130            assertTextPresent("ubmit");
2131            assertTextPresent("ave");
2132            assertTextPresent("pprove");
2133            assertTextPresent("lose");
2134            assertTextPresent("ancel");
2135        }
2136    
2137        protected void performParameterInquiry(String parameterField) throws Exception {
2138            waitAndTypeByName("name", parameterField);
2139            waitAndClickSearch();
2140            isElementPresentByLinkText(parameterField);
2141            waitAndClickByLinkText(parameterField);
2142            waitForPageToLoad();
2143            Thread.sleep(2000);
2144            switchToWindow("Kuali :: Inquiry");
2145            Thread.sleep(2000);
2146        }
2147    
2148        protected List<String> testLookUpParameterType(String docId, String parameterType, String parameterCode) throws Exception {
2149            performParameterInquiry(parameterType);
2150            SeleneseTestBase.assertEquals(parameterCode, getTextByXpath("//div[@class='tab-container']/table//span[@id='code.div']").trim().toLowerCase());
2151            SeleneseTestBase.assertEquals(parameterType, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim().toLowerCase());
2152            waitAndClickCloseWindow();
2153            switchToWindow("null");
2154            List<String> params = new ArrayList<String>();
2155            params.add(docId);
2156            params.add(parameterType);
2157            params.add(parameterCode);
2158    
2159            return params;
2160        }
2161    
2162        protected List<String> testLookUpParameter(String docId, String parameterName) throws Exception {
2163            performParameterInquiry(parameterName);
2164            SeleneseTestBase.assertEquals(parameterName, getTextByXpath(
2165                    "//div[@class='tab-container']/table//span[@id='name.div']").trim());
2166            SeleneseTestBase.assertEquals("Y", getTextByXpath("//div[@class='tab-container']/table//span[@id='value.div']")
2167                    .trim());
2168            waitAndClickCloseWindow();
2169            switchToWindow("null");
2170            List<String> params = new ArrayList<String>();
2171            params.add(docId);
2172            params.add(parameterName);
2173    
2174            return params;
2175        }
2176    
2177        protected void testPeopleFlow() throws Exception {
2178            selectFrameIframePortlet();
2179            
2180            //Click Main Menu and Create New
2181            // waitAndCreateNew();
2182            // waitForPageToLoad();
2183            jGrowl("Create New");
2184            waitAndClickByLinkText("Create New");
2185            
2186            //jiraAwareWaitAndClick(By.linkText("Create New"));
2187            //Save docId
2188            waitForElementPresent("div[data-header_for='PeopleFlow-MaintenanceView'] div[data-label='Document Number'] > span");
2189            String docId = getText("div[data-header_for='PeopleFlow-MaintenanceView'] div[data-label='Document Number'] > span");
2190            jGrowlSticky("Doc Id is " + docId);
2191            driver.findElement(By.name("document.documentHeader.documentDescription")).clear();
2192            driver.findElement(By.name("document.documentHeader.documentDescription")).sendKeys("Description for Document");
2193            new Select(driver.findElement(By.name("document.newMaintainableObject.dataObject.namespaceCode"))).selectByVisibleText("KUALI - Kuali Systems");
2194            driver.findElement(By.name("document.newMaintainableObject.dataObject.name")).clear();
2195            driver.findElement(By.name("document.newMaintainableObject.dataObject.name")).sendKeys("Document Name" + ITUtil.DTS);
2196    
2197            jGrowl("Add Member kr");
2198            driver.findElement(By.name("newCollectionLines['document.newMaintainableObject.dataObject.members'].memberName")).clear();
2199            driver.findElement(By.name("newCollectionLines['document.newMaintainableObject.dataObject.members'].memberName")).sendKeys("kr");
2200            driver.findElement(By.cssSelector("button[data-loadingmessage='Adding Line...']")).click();
2201            Thread.sleep(3000);
2202    
2203            jGrowl("Add Member admin");
2204            driver.findElement(By.name("newCollectionLines['document.newMaintainableObject.dataObject.members'].memberName")).clear();
2205            driver.findElement(By.name("newCollectionLines['document.newMaintainableObject.dataObject.members'].memberName")).sendKeys("admin");
2206            driver.findElement(By.cssSelector("button[data-loadingmessage='Adding Line...']")).click();
2207            Thread.sleep(3000);
2208    
2209            driver.findElement(By.cssSelector("div[data-parent='PeopleFlow-MaintenanceView'] > div.uif-footer button~button~button")).click();
2210            jGrowl("Blanket Approve");
2211            Thread.sleep(5000);
2212            
2213            //Close the Doc
2214            //driver.findElement(By.id("uif-close")).click();
2215            //Thread.sleep(3000);
2216            driver.switchTo().window(driver.getWindowHandles().toArray()[0].toString());
2217            driver.findElement(By.cssSelector("img[alt=\"doc search\"]")).click();
2218            Thread.sleep(5000);
2219            jGrowl("Document Search is " + docId + " present?");
2220            selectFrameIframePortlet();
2221            driver.findElement(By.cssSelector("td.infoline > input[name=\"methodToCall.search\"]")).click();
2222            Thread.sleep(5000);
2223            jGrowl("Is doc status final?");
2224            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, driver.findElement(By.xpath("//table[@id='row']/tbody/tr/td[4]")).getText());
2225            driver.switchTo().defaultContent();
2226            driver.findElement(By.name("imageField")).click();
2227            Thread.sleep(5000);
2228            // TODO open the document and verify data is as we expect.
2229        }
2230    
2231        protected void testTermLookupAssertions() throws Exception {
2232            testLookUp();
2233            assertTextPresent("Term Parameters");
2234            waitAndClick(By.xpath(CANCEL2_XPATH));
2235            passed();
2236        }
2237    
2238        protected void testTermSpecificationLookupAssertions() throws Exception {
2239            testLookUp();
2240            assertTextPresent("Context");
2241            waitAndClick(By.xpath(CANCEL2_XPATH));
2242            passed();
2243        }
2244    
2245        protected List<String> testVerifyModifiedParameter(String docId, String parameterName) throws Exception {
2246            performParameterInquiry(parameterName);
2247            SeleneseTestBase.assertEquals(parameterName, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim());
2248            SeleneseTestBase.assertEquals("N", getTextByXpath("//div[@class='tab-container']/table//span[@id='value.div']").trim());
2249            waitAndClickCloseWindow();
2250            switchToWindow("null");
2251            List<String> params = new ArrayList<String>();
2252            params.add(docId);
2253            params.add(parameterName);
2254    
2255            return params;
2256        }
2257    
2258        protected List<String> testVerifyCopyParameterType(String docId, String parameterType, String parameterCode) throws Exception
2259        {
2260            performParameterInquiry(parameterType);
2261            SeleneseTestBase.assertEquals(parameterType, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim().toLowerCase());
2262            waitAndClickCloseWindow();
2263            switchToWindow("null");
2264            List<String> params = new ArrayList<String>();
2265            params.add(docId);
2266            params.add(parameterType);
2267            params.add(parameterCode);
2268            
2269            return params;
2270        }
2271    
2272        protected List<String> testCreateNewPermission(String docId, String permissionName) throws Exception
2273        {
2274            waitForPageToLoad();
2275            Thread.sleep(2000);
2276            docId = waitForDocId();
2277            waitAndClickSave();
2278            waitForPageToLoad();
2279            assertElementPresentByXpath("//div[contains(.,'Document Description (Description) is a required field.')]/img[@alt='error']");
2280            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Adding Permission removeme");
2281            waitAndClickSubmit();
2282            waitForPageToLoad();
2283            assertElementPresentByXpath("//div[@class='error']");
2284            assertElementPresentByXpath("//div[contains(.,'Template (Template) is a required field.')]/img[@alt='error']");
2285            assertElementPresentByXpath("//div[contains(.,'Permission Namespace (Permission Namespace) is a required field.')]/img[@alt='error']");
2286            assertElementPresentByXpath("//div[contains(.,'Permission Name (Permission Name) is a required field.')]/img[@alt='error']");
2287            selectOptionByName("document.newMaintainableObject.templateId", "36");
2288            selectOptionByName("document.newMaintainableObject.namespaceCode", "KR-SYS");
2289            permissionName = "removeme" + ITUtil.createUniqueDtsPlusTwoRandomChars();
2290            waitAndTypeByName("document.newMaintainableObject.name", permissionName);
2291            waitAndTypeByName("document.newMaintainableObject.description", "namespaceCode=KR*");
2292            checkByName("document.newMaintainableObject.active");
2293            waitAndClickSave();
2294            waitForPageToLoad();
2295            assertElementPresentByXpath(SAVE_SUCCESSFUL_XPATH);
2296            SeleneseTestBase.assertEquals(DOC_STATUS_SAVED, getTextByXpath(DOC_STATUS_XPATH));
2297            waitAndClickSubmit();
2298            waitForPageToLoad();
2299            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH,"Document is not submitted successfully");
2300            SeleneseTestBase.assertEquals(DOC_STATUS_ENROUTE, getTextByXpath(DOC_STATUS_XPATH));
2301            List<String> params = new ArrayList<String>();
2302            params.add(docId);
2303            params.add(permissionName);
2304            
2305            return params;
2306        }
2307    
2308        protected List<String> testLookUpPermission(String docId, String permissionName) throws Exception
2309        {
2310            waitForPageToLoad();
2311            waitAndTypeByName("name", permissionName);
2312            waitAndClickSearch();
2313            isElementPresentByLinkText(permissionName);
2314            List<String> params = new ArrayList<String>();
2315            params.add(docId);
2316            params.add(permissionName);
2317            
2318            return params;
2319        }
2320    
2321        protected List<String> testEditPermission(String docId, String permissionName) throws Exception
2322        {
2323            waitAndClickEdit();
2324            waitForPageToLoad();
2325            Thread.sleep(2000);
2326            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Editing Permission removeme");
2327            uncheckByName("document.newMaintainableObject.active");
2328            waitAndClickSubmit();
2329            waitForPageToLoad();
2330            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully");
2331            List<String> params = new ArrayList<String>();
2332            params.add(docId);
2333            params.add(permissionName);
2334            
2335            return params;
2336        }
2337    
2338        protected List<String> testVerifyPermission(String docId, String permissionName) throws Exception
2339        {
2340            waitForPageToLoad();
2341            waitAndTypeByName("name", permissionName);
2342            waitAndClickByXpath("//input[@title='Active Indicator - No']");
2343            waitAndClickSearch();
2344            isElementPresentByLinkText(permissionName);
2345            List<String> params = new ArrayList<String>();
2346            params.add(docId);
2347            params.add(permissionName);
2348            
2349            return params;
2350        }
2351    
2352        protected List<String> testCreateNewPerson(String docId, String personName) throws Exception
2353        {
2354            waitForPageToLoad();
2355            docId = waitForDocId();
2356            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Adding Charlie Brown");
2357            waitAndTypeByName("document.documentHeader.explanation", "I want to add Charlie Brown to test KIM");
2358            
2359            //here You should also check for lower case validation for principalName, but it is skipped for now as there is an incident report error there.
2360            personName = "cbrown" + ITUtil.createUniqueDtsPlusTwoRandomChars();
2361            waitAndTypeByName("document.principalName", personName);
2362            waitAndClickSave();
2363            waitForPageToLoad();
2364            assertElementPresentByXpath(SAVE_SUCCESSFUL_XPATH);
2365            SeleneseTestBase.assertEquals(DOC_STATUS_SAVED, getTextByXpath(DOC_STATUS_XPATH));
2366            waitAndClickSubmit();
2367            waitForPageToLoad();
2368            assertElementPresentByXpath("//div[contains(.,'At least one affiliation must be entered.')]/img[@alt='error']");
2369            assertElementPresentByXpath("//div[contains(.,'At least one name must be entered.')]/img[@alt='error']");
2370            selectOptionByName("newAffln.affiliationTypeCode", "STDNT");
2371            selectOptionByName("newAffln.campusCode", "BL");
2372            checkByName("newAffln.dflt");
2373            waitAndClickByName("methodToCall.addAffln.anchor");
2374            waitForPageToLoad();
2375            Thread.sleep(3000);
2376            selectOptionByName("newName.nameCode", "PRM");
2377            selectOptionByName("newName.namePrefix", "Mr");
2378            waitAndTypeByName("newName.firstName", "Charlie");
2379            waitAndTypeByName("newName.lastName", "Brown");
2380            checkByName("newName.dflt");
2381            waitAndClickByName("methodToCall.addName.anchor");
2382            waitForPageToLoad();
2383            waitAndClickSubmit();
2384            waitForPageToLoad();
2385            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully");
2386            SeleneseTestBase.assertEquals(DOC_STATUS_ENROUTE, getTextByXpath(DOC_STATUS_XPATH));
2387            List<String> params = new ArrayList<String>();
2388            params.add(docId);
2389            params.add(personName);
2390            
2391            return params;
2392        }
2393    
2394        protected List<String> testLookUpPerson(String docId, String personName) throws Exception
2395        {
2396            waitForPageToLoad();
2397            waitAndTypeByName("principalName", personName);
2398            waitAndClickSearch();
2399            isElementPresentByLinkText(personName);
2400            waitAndClickByName("methodToCall.clearValues");
2401            waitAndTypeByName("firstName", "Charlie");
2402            waitAndClickSearch();
2403            isElementPresentByLinkText(personName);
2404            waitAndClickByName("methodToCall.clearValues");
2405            waitAndTypeByName("lastName", "Brown");
2406            waitAndClickSearch();
2407            isElementPresentByLinkText(personName);
2408            waitAndClickByName("methodToCall.clearValues");
2409            waitAndTypeByName("campusCode", "BL");
2410            waitAndClickSearch();
2411            isElementPresentByLinkText(personName);
2412            List<String> params = new ArrayList<String>();
2413            params.add(docId);
2414            params.add(personName);
2415            
2416            return params;
2417        }
2418    
2419        protected List<String> testVerifyPerson(String docId, String personName) throws Exception
2420        {
2421            waitAndClickByLinkText(personName);
2422            waitForPageToLoad();
2423            Thread.sleep(5000);
2424            switchToWindow("Kuali :: Person");
2425            Thread.sleep(2000);
2426            SeleneseTestBase.assertEquals(personName, getTextByXpath("//div[@class='tab-container']/table//tr[2]/td[1]/div").trim());
2427            SeleneseTestBase.assertEquals("BL - BLOOMINGTON", getTextByXpath("//div[@class='tab-container']/table[3]//tr[2]/td[2]/div").trim());
2428            SeleneseTestBase.assertEquals("Student", getTextByXpath("//select/option[@selected]").trim());
2429            assertElementPresentByXpath("//table[@class='tab']//input[@title='close Overview']");
2430            assertElementPresentByXpath("//table[@class='tab']//input[@title='open Contact']");
2431            assertElementPresentByXpath("//table[@class='tab']//input[@title='open Privacy Preferences']");
2432            assertElementPresentByXpath("//table[@class='tab']//input[@title='open Membership']");
2433            waitAndClickByName("methodToCall.showAllTabs");
2434            Thread.sleep(3000);
2435            assertElementPresentByXpath("//table[@class='tab']//input[@title='close Overview']");
2436            assertElementPresentByXpath("//table[@class='tab']//input[@title='close Contact']");
2437            assertElementPresentByXpath("//table[@class='tab']//input[@title='close Privacy Preferences']");
2438            assertElementPresentByXpath("//table[@class='tab']//input[@title='close Membership']");
2439            waitAndClickByName("methodToCall.hideAllTabs");
2440            Thread.sleep(3000);
2441            assertElementPresentByXpath("//table[@class='tab']//input[@title='open Overview']");
2442            assertElementPresentByXpath("//table[@class='tab']//input[@title='open Contact']");
2443            assertElementPresentByXpath("//table[@class='tab']//input[@title='open Privacy Preferences']");
2444            assertElementPresentByXpath("//table[@class='tab']//input[@title='open Membership']");
2445            waitAndClickCloseWindow();
2446            switchToWindow("null");
2447            List<String> params = new ArrayList<String>();
2448            params.add(docId);
2449            params.add(personName);
2450            
2451            return params;
2452        }
2453    
2454        protected void testUifTooltip(String NAME_FIELD_1, String NAME_FIELD_2) throws Exception {
2455            // check if tooltip opens on focus
2456            fireEvent(NAME_FIELD_1, "focus");
2457            fireMouseOverEventByName(NAME_FIELD_1);
2458            
2459            // SeleneseTestBase.assertTrue(isVisible("div.jquerybubblepopup.jquerybubblepopup-black") && isVisible("td.jquerybubblepopup-innerHtml"));
2460            SeleneseTestBase.assertEquals("This tooltip is triggered by focus or and mouse over.", getText(
2461                    "td.jquerybubblepopup-innerHtml"));
2462    
2463            // check if tooltip closed on blur
2464            fireEvent(NAME_FIELD_1, "blur");
2465            SeleneseTestBase.assertFalse(isVisible("div.jquerybubblepopup.jquerybubblepopup-black") && isVisible(
2466                    "td.jquerybubblepopup-innerHtml"));
2467            Thread.sleep(5000);
2468            fireEvent("field119", "focus");
2469            
2470            // check if tooltip opens on mouse over
2471            fireMouseOverEventByName(NAME_FIELD_2);        
2472            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(.,\"This is a tool-tip with different position and tail options\")]"));
2473    
2474            // check if tooltip closed on mouse out
2475            waitAndTypeByName(NAME_FIELD_2, "a");
2476            Thread.sleep(5000);
2477            SeleneseTestBase.assertFalse(isVisibleByXpath(
2478                    "//td[contains(.,\"This is a tool-tip with different position and tail options\")]"));
2479    
2480            // check that default tooltip does not display when there are an error message on the field
2481            waitAndTypeByName(NAME_FIELD_1, "1");
2482            fireEvent(NAME_FIELD_1, "blur");
2483            fireMouseOverEventByName(NAME_FIELD_1);
2484            Thread.sleep(10000);
2485            SeleneseTestBase.assertTrue("https://jira.kuali.org/browse/KULRICE-8141 Investigate why UifTooltipIT.testTooltip fails around jquerybubblepopup",
2486                            isVisibleByXpath("//div[@class='jquerybubblepopup jquerybubblepopup-kr-error-cs']") &&
2487                                    !(isVisibleByXpath("//div[@class='jquerybubblepopup jquerybubblepopup-black']")));
2488           
2489            // TODO figure out this last assert     
2490            passed();
2491        }
2492    
2493        protected void testValidCharsConstraintIT() throws Exception {
2494            assertFocusTypeBlurValidation("field50", new String[]{"12.333", "-123.33"}, new String[]{"123.33"});
2495            assertFocusTypeBlurValidation("field51", new String[]{"A"}, new String[]{"-123.33"});
2496    
2497            // TODO continue to convert to assertFocusTypeBlurValidation
2498            assertFocusTypeBlurValidation("field77", new String[]{"1.1"},new String[]{"12"});
2499            assertFocusTypeBlurValidation("field52", new String[]{"5551112222"},new String[]{"555-111-1111"});
2500            assertFocusTypeBlurValidation("field53", new String[]{"1ClassName.java"},new String[]{"ClassName.java"});
2501            assertFocusTypeBlurValidation("field54", new String[]{"aaaaa"},new String[]{"aaaaa@kuali.org"});
2502            assertFocusTypeBlurValidation("field84", new String[]{"aaaaa"},new String[]{"http://www.kuali.org"});       
2503            assertFocusTypeBlurValidation("field55", new String[]{"023512"},new String[]{"022812"});
2504            assertFocusTypeBlurValidation("field75", new String[]{"02/35/12"},new String[]{"02/28/12"});
2505            assertFocusTypeBlurValidation("field82", new String[]{"13:22"},new String[]{"02:33"});
2506            assertFocusTypeBlurValidation("field83", new String[]{"25:22"},new String[]{"14:33"});
2507            assertFocusTypeBlurValidation("field57", new String[]{"0"},new String[]{"2020"});      
2508            assertFocusTypeBlurValidation("field58", new String[]{"13"},new String[]{"12"});  
2509            assertFocusTypeBlurValidation("field61", new String[]{"5555-444"},new String[]{"55555-4444"});
2510            assertFocusTypeBlurValidation("field62", new String[]{"aa5bb6_a"},new String[]{"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"});       
2511            assertFocusTypeBlurValidation("field63", new String[]{"fff555"},new String[]{"aa22 _/"});       
2512            assertFocusTypeBlurValidation("field64", new String[]{"AABB55"},new String[]{"ABCDEFGHIJKLMNOPQRSTUVWXY,Z abcdefghijklmnopqrstuvwxy,z"});       
2513            assertFocusTypeBlurValidation("field76", new String[]{"AA~BB%"},new String[]{"abcABC %$#@&<>\\{}[]*-+!=.()/\"\"',:;?"});       
2514            assertFocusTypeBlurValidation("field65", new String[]{"sdfs$#$# dsffs"},new String[]{"sdfs$#$#sffs"});      
2515            assertFocusTypeBlurValidation("field66", new String[]{"abcABCD"},new String[]{"ABCabc"});
2516            assertFocusTypeBlurValidation("field67", new String[]{"(111)B-(222)A"},new String[]{"(12345)-(67890)"});  
2517            assertFocusTypeBlurValidation("field68", new String[]{"A.66"},new String[]{"a.4"});
2518            assertFocusTypeBlurValidation("field56", new String[]{"2020-06-02"},new String[]{"2020-06-02 03:30:30.22"});
2519        }
2520    
2521        protected void assertFocusTypeBlurValidation(String field, String[] errorInputs, String[] validInputs) throws InterruptedException {
2522            assertFocusTypeBlurError(field, errorInputs);
2523            clearTextByName(field);
2524            assertFocusTypeBlurValid(field, validInputs);
2525        }
2526    
2527        protected void testSubCollectionSize() throws Exception {
2528            checkForIncidentReport(COLLECTIONS_LINK_TEXT);
2529            
2530            // click on collections page link
2531            waitAndClickByLinkText(COLLECTIONS_LINK_TEXT);
2532            
2533            // wait for collections page to load by checking the presence of a sub collection line item
2534            for (int second = 0;; second++) {                   
2535                if (second >= waitSeconds)
2536                    failableFail(TIMEOUT_MESSAGE);
2537                try {                
2538                    if (getText(SUB_COLLECTION_UIF_DISCLOSURE_SPAN_UIF_HEADER_TEXT_SPAN_XPATH).equals("SubCollection - (3 lines)"))
2539                    {
2540                        break;
2541                    }
2542                } catch (Exception e) {}
2543                Thread.sleep(1000);
2544            }
2545            
2546            // verify that sub collection sizes are displayed as expected
2547            SeleneseTestBase.assertEquals("SubCollection - (3 lines)", getText(SUB_COLLECTION_UIF_DISCLOSURE_SPAN_UIF_HEADER_TEXT_SPAN_XPATH));
2548            SeleneseTestBase.assertEquals("SubCollection - (2 lines)", getTextByXpath(
2549                    "//a[@id='subCollection1_line1_toggle']/span"));
2550        }
2551    
2552        protected void testDefaultTestsTableLayout() throws Exception {
2553            assertTableLayout();
2554            waitAndTypeByName("newCollectionLines['list1'].field1", "asdf1");
2555            waitAndTypeByName("newCollectionLines['list1'].field2", "asdf2");
2556            waitAndTypeByName("newCollectionLines['list1'].field3", "asdf3");
2557            waitAndTypeByName("newCollectionLines['list1'].field4", "asdf4");
2558            waitAndClickByXpath("//button[contains(.,'add')]"); // the first button is the one we want
2559    
2560            for (int second = 0;; second++) {            
2561                if (second >= waitSeconds)
2562                    failableFail(TIMEOUT_MESSAGE);
2563                try {               
2564                    if (getAttributeByName("newCollectionLines['list1'].field1", "value").equals(""))
2565                        break;
2566                } catch (Exception e) {}
2567                Thread.sleep(1000);
2568            }
2569    
2570            SeleneseTestBase.assertEquals("", getAttributeByName("newCollectionLines['list1'].field1", "value"));
2571            SeleneseTestBase.assertEquals("", getAttributeByName("newCollectionLines['list1'].field2", "value"));
2572            SeleneseTestBase.assertEquals("", getAttributeByName("newCollectionLines['list1'].field3", "value"));
2573            SeleneseTestBase.assertEquals("", getAttributeByName("newCollectionLines['list1'].field4", "value"));
2574            SeleneseTestBase.assertEquals("asdf1", getAttributeByName("list1[0].field1", "value"));
2575            SeleneseTestBase.assertEquals("asdf2", getAttributeByName("list1[0].field2", "value"));
2576            SeleneseTestBase.assertEquals("asdf3", getAttributeByName("list1[0].field3", "value"));
2577            SeleneseTestBase.assertEquals("asdf4", getAttributeByName("list1[0].field4", "value"));
2578            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@id='Collections-Base-TableLayout_disclosureContent']/div/table/tbody/tr[2]/td[6]/div/fieldset/div/div[@class='uif-boxLayout uif-horizontalBoxLayout clearfix']/button"));
2579        }
2580        /**
2581         * Test adding a column of values to the Add Blank Line Tests Table Layout
2582         */
2583        protected void testAddBlankLine() throws Exception {
2584            waitAndClickByLinkText("Add Blank Line");
2585            waitAndClickByXpath("//button[contains(.,'Add Line')]");
2586            Thread.sleep(3000); //  TODO a wait until the loading.gif isn't visible woudl be better
2587            assertElementPresentByName("list1[0].field1");
2588            assertTableLayout();
2589            SeleneseTestBase.assertEquals("", getAttributeByName("list1[0].field1", "value"));
2590            SeleneseTestBase.assertEquals("", getAttributeByName("list1[0].field2", "value"));
2591            SeleneseTestBase.assertEquals("", getAttributeByName("list1[0].field3", "value"));
2592            SeleneseTestBase.assertEquals("", getAttributeByName("list1[0].field4", "value"));
2593            SeleneseTestBase.assertEquals("5", getAttributeByName("list1[1].field1", "value"));
2594            SeleneseTestBase.assertEquals("6", getAttributeByName("list1[1].field2", "value"));
2595            SeleneseTestBase.assertEquals("7", getAttributeByName("list1[1].field3", "value"));
2596            SeleneseTestBase.assertEquals("8", getAttributeByName("list1[1].field4", "value"));
2597            SeleneseTestBase.assertEquals("Total: 419", driver.findElement(By.xpath("//fieldset/div/div[2]/div[2]")).getText());
2598            waitAndTypeByName("list1[0].field1", "1");
2599            waitAndTypeByName("list1[0].field2", "1");
2600            waitAndTypeByName("list1[0].field3", "1");
2601            waitAndTypeByName("list1[0].field4", "1");
2602            SeleneseTestBase.assertEquals("Total: 420", driver.findElement(By.xpath("//fieldset/div/div[2]/div[2]")).getText());
2603        }
2604    
2605        /**
2606         * Test action column placement in table layout collections
2607         */
2608        protected void testActionColumnPlacement() throws Exception {
2609            //Lack of proper locators its not possible to uniquely identify/locate this elements without use of ID's.
2610            //This restricts us to use the XPath to locate elements from the dome. 
2611            //This test is prone to throw error in case of any changes in the dom Html graph.
2612            waitAndClickByLinkText("Column Sequence");
2613            Thread.sleep(2000);
2614            
2615            //jiraAwareWaitAndClick("css=div.jGrowl-close");
2616            // check if actions column RIGHT by default
2617            //SeleneseTestBase.assertTrue(isElementPresent("//div[@id='ConfigurationTestView-collection1']//tr[2]/td[6]//button[contains(.,\"delete\")]"));
2618            for (int second = 0;; second++) {            
2619                if (second >= waitSeconds)
2620                    failableFail(TIMEOUT_MESSAGE);
2621                try {                
2622                    if (isElementPresentByXpath("//tr[2]/td[6]/div/fieldset/div/div[2]/button"))
2623                        break;
2624                } catch (Exception e) {}
2625                Thread.sleep(1000);
2626            }
2627            SeleneseTestBase.assertTrue(isElementPresentByXpath("//tr[2]/td[6]/div/fieldset/div/div[2]/button"));
2628    
2629            // check if actions column is LEFT
2630            //SeleneseTestBase.assertTrue(isElementPresent("//div[@id='ConfigurationTestView-collection2']//tr[2]/td[1]//button[contains(.,\"delete\")]"));
2631            for (int second = 0;; second++) {           
2632                if (second >= waitSeconds)
2633                    failableFail(TIMEOUT_MESSAGE);
2634                try {                
2635                    if (isElementPresentByXpath("//div[2]/div[2]/div[2]/table/tbody/tr[2]/td/div/fieldset/div/div[2]/button"))
2636                        break;
2637                } catch (Exception e) {}
2638                Thread.sleep(1000);
2639            }
2640            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[2]/div[2]/div[2]/table/tbody/tr[2]/td/div/fieldset/div/div[2]/button"));
2641    
2642            // check if actions column is 3rd in a sub collection
2643            //SeleneseTestBase.assertTrue(isElementPresent("//div[@id='ConfigurationTestView-subCollection2_line0']//tr[2]/td[3]//button[contains(.,\"delete\")]"));
2644            for (int second = 0;; second++) {            
2645                if (second >= waitSeconds)
2646                    failableFail(TIMEOUT_MESSAGE);
2647                try {                
2648                    if (isElementPresentByXpath("//tr[2]/td[3]/div/fieldset/div/div[2]/button"))
2649                        break;
2650                } catch (Exception e) {}
2651                Thread.sleep(1000);
2652            }
2653            SeleneseTestBase.assertTrue(isElementPresentByXpath("//tr[2]/td[3]/div/fieldset/div/div[2]/button"));
2654        }
2655    
2656        protected void testAddViaLightbox() throws Exception {
2657            waitAndClickByLinkText("Add Via Lightbox");
2658            SeleneseTestBase.assertEquals("Total: 419", driver.findElement(By.xpath("//fieldset/div/div[2]/div[2]")).getText());
2659            waitAndClickByXpath("//button[contains(.,'Add Line')]");
2660            Thread.sleep(3000);
2661            waitAndTypeByXpath("//form/div/table/tbody/tr/td/div/input", "1");
2662            waitAndTypeByXpath("//form/div/table/tbody/tr[2]/td/div/input", "1");
2663            waitAndTypeByXpath("//form/div/table/tbody/tr[3]/td/div/input", "1");
2664            waitAndTypeByXpath("//form/div/table/tbody/tr[4]/td/div/input", "1");
2665            waitAndClickByXpath("//button[@id='Collections-AddViaLightbox-TableTop_add']");
2666            Thread.sleep(3000);
2667            SeleneseTestBase.assertEquals("Total: 420", driver.findElement(By.xpath("//fieldset/div/div[2]/div[2]")).getText());
2668        }
2669    
2670        protected void testColumnSequence() throws Exception {
2671            waitAndClickByLinkText("Column Sequence");
2672            Thread.sleep(3000);
2673            waitAndTypeByName("newCollectionLines['list1'].field1", "1");
2674            waitAndTypeByName("newCollectionLines['list1'].field2", "1");
2675            waitAndTypeByName("newCollectionLines['list1'].field3", "1");
2676            waitAndTypeByName("newCollectionLines['list1'].field4", "1");
2677            waitAndClick(By.id("Collections-ColumnSequence-TableDefault_add"));
2678            Thread.sleep(3000);
2679    
2680            //Check if row has been added really or not
2681            testIfRowHasBeenAdded();
2682    
2683            //Check for the added if delete is present or not
2684            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@id='Collections-ColumnSequence-TableDefault_disclosureContent']/div[@class='dataTables_wrapper']/table/tbody/tr[2]/td[6]/div/fieldset/div/div[@class='uif-boxLayout uif-horizontalBoxLayout clearfix']/button"));
2685        }
2686    
2687        protected void testSequencerow() throws Exception {
2688            waitAndClickByLinkText("Save Row");
2689            Thread.sleep(3000);
2690            waitAndTypeByName("newCollectionLines['list1'].field1", "1");
2691            waitAndTypeByName("newCollectionLines['list1'].field2", "1");
2692            waitAndTypeByName("newCollectionLines['list1'].field3", "1");
2693            waitAndTypeByName("newCollectionLines['list1'].field4", "1");
2694            waitAndClickByXpath("//button[contains(.,'add')]");
2695            Thread.sleep(3000);
2696            
2697            //Check if row has been added really or not
2698            testIfRowHasBeenAdded();
2699    
2700            //Check for the added if delete is present or not
2701            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@id='Collections-SaveRow-Table_disclosureContent']/div[@class='dataTables_wrapper']/table/tbody/tr[2]/td[6]/div/fieldset/div/div[@class='uif-boxLayout uif-horizontalBoxLayout clearfix']/button"));
2702            //        SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@id='Collections-SaveRow-Table_disclosureContent']/div[@class='dataTables_wrapper']/table/tbody/tr[2]/td[6]/div/fieldset/div/div[@class='uif-boxLayout uif-horizontalBoxLayout clearfix']/button[@class='uif-action uif-secondaryActionButton uif-smallActionButton uif-saveLineAction']"));
2703        }
2704    
2705        protected void testIfRowHasBeenAdded() throws Exception {
2706            //Check if row has been added really or not
2707            SeleneseTestBase.assertEquals("", getAttributeByName("newCollectionLines['list1'].field1", "value"));
2708            SeleneseTestBase.assertEquals("", getAttributeByName("newCollectionLines['list1'].field2", "value"));
2709            SeleneseTestBase.assertEquals("", getAttributeByName("newCollectionLines['list1'].field3", "value"));
2710            SeleneseTestBase.assertEquals("", getAttributeByName("newCollectionLines['list1'].field4", "value"));
2711            SeleneseTestBase.assertEquals("1", getAttributeByName("list1[0].field1", "value"));
2712            SeleneseTestBase.assertEquals("1", getAttributeByName("list1[0].field2", "value"));
2713            SeleneseTestBase.assertEquals("1", getAttributeByName("list1[0].field3", "value"));
2714            SeleneseTestBase.assertEquals("1", getAttributeByName("list1[0].field4", "value"));
2715        }
2716    
2717        //Code for KRAD Test Package.
2718        protected void testCollectionTotalling() throws Exception {
2719            //Scenario Asserts Changes in Total at client side        
2720            waitForElementPresent("div#Demo-CollectionTotaling-Section1 div[role='grid'] div[data-label='Total']");
2721            SeleneseTestBase.assertEquals("Total: 419", getText(
2722                    "div#Demo-CollectionTotaling-Section1 div[role='grid'] div[data-label='Total']"));
2723            clearText("div#Demo-CollectionTotaling-Section1 > div[role='grid'] > table > tbody div[data-parent=Demo-CollectionTotaling-Section1]  input[name='list1[0].field1']");
2724            waitAndType("div#Demo-CollectionTotaling-Section1 > div[role='grid'] > table > tbody div[data-parent=Demo-CollectionTotaling-Section1]  input[name='list1[0].field1']","10");
2725            waitAndClick("div#Demo-CollectionTotaling-Section1 div[role='grid'] div[data-label='Total']");
2726            Thread.sleep(5000);
2727            SeleneseTestBase.assertEquals("Total: 424", getText(
2728                    "div#Demo-CollectionTotaling-Section1 div[role='grid'] div[data-label='Total']"));
2729            
2730            //Scenario Asserts Changes in Total at client side on keyUp
2731            SeleneseTestBase.assertEquals("Total: 419", getText(
2732                    "div#Demo-CollectionTotaling-Section2 div[role='grid'] div[data-label='Total']"));
2733            clearText("div#Demo-CollectionTotaling-Section2 > div[role='grid'] > table > tbody div[data-parent=Demo-CollectionTotaling-Section2] input[name='list1[0].field1']");
2734            waitAndType("div#Demo-CollectionTotaling-Section2 > div[role='grid'] > table > tbody div[data-parent=Demo-CollectionTotaling-Section2] input[name='list1[0].field1']","9");
2735            waitAndClick("div#Demo-CollectionTotaling-Section2 div[role='grid'] div[data-label='Total']");
2736            Thread.sleep(5000);
2737            SeleneseTestBase.assertEquals("Total: 423", getText(
2738                    "div#Demo-CollectionTotaling-Section2 div[role='grid'] div[data-label='Total']"));
2739    
2740            //Asserts absence of Total in 2nd column at the footer for Demonstrating totaling on only some columns 
2741            SeleneseTestBase.assertEquals("", getTextByXpath("//div[3]/div[3]/table/tfoot/tr/th[2]"));
2742            
2743            //Asserts Presence of Total in 2nd column at the footer for Demonstrating totaling on only some columns 
2744            SeleneseTestBase.assertEquals("Total: 369", getTextByXpath(
2745                    "//div[3]/div[3]/table/tfoot/tr/th[3]/div/fieldset/div/div[2]/div[2]"));
2746    
2747            //Asserts Presence of Total in left most column only being one with no totaling itself 
2748            SeleneseTestBase.assertEquals("Total:", getTextByXpath("//*[@id='u100213_span']"));
2749            SeleneseTestBase.assertEquals("419", getTextByXpath(
2750                    "//div[4]/div[3]/table/tfoot/tr/th[2]/div/fieldset/div/div[2]/div[2]"));
2751    
2752            //Asserts changes in value in Total and Decimal for Demonstrating multiple types of calculations for a single column (also setting average to 3 decimal places to demonstrate passing data to calculation function) 
2753            SeleneseTestBase.assertEquals("Total: 382", getTextByXpath("//div[2]/div/fieldset/div/div[2]/div[2]"));
2754            clearText("div#Demo-CollectionTotaling-Section6 > div[role='grid'] > table > tbody div[data-parent=Demo-CollectionTotaling-Section6] input[name='list1[0].field4']");
2755            waitAndType("div#Demo-CollectionTotaling-Section6 > div[role='grid'] > table > tbody div[data-parent=Demo-CollectionTotaling-Section6] input[name='list1[0].field4']","11");
2756            waitAndClick("div#Demo-CollectionTotaling-Section2 div[role='grid'] div[data-label='Total']");
2757            Thread.sleep(5000);
2758            SeleneseTestBase.assertEquals("Total: 385", getTextByXpath("//div[2]/div/fieldset/div/div[2]/div[2]"));
2759    
2760            // Assert changes in Decimal..
2761            clearText("div#Demo-CollectionTotaling-Section6 > div[role='grid'] > table > tbody div[data-parent=Demo-CollectionTotaling-Section6] input[name='list1[0].field4']");
2762            waitAndType("div#Demo-CollectionTotaling-Section6 > div[role='grid'] > table > tbody div[data-parent=Demo-CollectionTotaling-Section6] input[name='list1[0].field4']","15.25");
2763            waitAndClick("div#Demo-CollectionTotaling-Section2 div[role='grid'] div[data-label='Total']");
2764            Thread.sleep(5000);
2765            SeleneseTestBase.assertEquals("Page Average: 11.917", getTextByXpath("//div[2]/fieldset/div/div[2]/div"));
2766        }
2767    
2768        protected void testConfigurationTestView(String idPrefix) throws Exception {
2769            waitForElementPresentByXpath("//span[@id='" + idPrefix + "TextInputField_label_span']");
2770            
2771            // testing for https://groups.google.com/a/kuali.org/group/rice.usergroup.krad/browse_thread/thread/1e501d07c1141aad#
2772            String styleValue = getAttributeByXpath("//span[@id='" + idPrefix + "TextInputField_label_span']", "style");
2773            
2774            // log.info("styleValue is " + styleValue);
2775            SeleneseTestBase.assertTrue(idPrefix + "textInputField label does not contain expected style", styleValue.replace(" ", "").contains("color:red"));
2776            
2777            // get current list of options
2778            String refreshTextSelectLocator = "//select[@id='" + idPrefix + "RefreshTextField_control']";
2779            String[] options1 = getSelectOptionsByXpath(refreshTextSelectLocator);
2780            String dropDownSelectLocator = "//select[@id='" + idPrefix + "DropDown_control']";
2781            selectByXpath(dropDownSelectLocator, "Vegetables");
2782            Thread.sleep(3000);
2783            
2784            //get list of options after change
2785            String[] options2 = getSelectOptionsByXpath(refreshTextSelectLocator);
2786            
2787            //verify that the change has occurred
2788            SeleneseTestBase.assertFalse(
2789                    "Field 1 selection did not change Field 2 options https://jira.kuali.org/browse/KULRICE-8163 Configuration Test View Conditional Options doesn't change Field 2 options based on Field 1 selection",
2790                    options1[options1.length - 1].equalsIgnoreCase(options2[options2.length - 1]));
2791            
2792            //confirm that control gets disabled
2793            selectByXpath(dropDownSelectLocator, "None");
2794            Thread.sleep(3000);
2795            SeleneseTestBase.assertEquals("true", getAttributeByXpath(refreshTextSelectLocator, "disabled"));
2796        }
2797    
2798        /**
2799         * verify that add line controls are present
2800         */
2801        protected void confirmAddLineControlsPresent(String idPrefix, String addLineIdSuffix) {
2802            String[] addLineIds = {"StartTime", "StartTimeAmPm", "AllDay"};
2803    
2804            for (String id : addLineIds) {
2805                String tagId = "//*[@id='" + idPrefix + id + addLineIdSuffix + "']";
2806                SeleneseTestBase.assertTrue("Did not find id " + tagId, isElementPresentByXpath(tagId));
2807            }
2808        }
2809    
2810        protected void testAddLineWithSpecificTime(String idPrefix, String addLineIdSuffix) throws Exception {
2811            waitForElementPresentByXpath("//span[@id='" + idPrefix + "TextInputField_label_span']");
2812            confirmAddLineControlsPresent(idPrefix, addLineIdSuffix);
2813            String startTimeId = "//*[@id='" + idPrefix + "StartTime" + addLineIdSuffix + "']";
2814            String inputTime = "7:06";
2815            waitAndTypeByXpath(startTimeId, inputTime);
2816            String amPmSelectLocator = "//*[@id='" + idPrefix + "StartTimeAmPm" + addLineIdSuffix + "']";
2817            selectByXpath(amPmSelectLocator, "PM");
2818            SeleneseTestBase.assertEquals("PM", getAttributeByXpath(amPmSelectLocator, "value"));
2819            Thread.sleep(5000); //allow for ajax refresh        
2820            waitAndClickByXpath("//button");
2821            Thread.sleep(5000); //allow for line to be added
2822            
2823            //confirm that line has been added
2824            SeleneseTestBase.assertTrue("line (//input[@value='7:06'])is not present https://jira.kuali.org/browse/KULRICE-8162 Configuration Test View Time Info add line button doesn't addline",
2825                            isElementPresentByXpath("//input[@value='7:06']"));
2826        }
2827    
2828        protected void testAddLineWithAllDay(String idPrefix, String addLineIdSuffix) throws Exception {
2829            waitForElementPresentByXpath("//span[@id='" + idPrefix + "TextInputField_label_span']");
2830            confirmAddLineControlsPresent(idPrefix, addLineIdSuffix);
2831            String startTimeId = "//*[@id='" + idPrefix + "StartTime" + addLineIdSuffix + "']";
2832            String inputTime = "5:20";
2833            waitAndTypeByXpath(startTimeId, inputTime);
2834            String allDaySelector = "//*[@id='" + idPrefix + "AllDay" + addLineIdSuffix + "']";
2835            Thread.sleep(5000); //allow for ajax refresh
2836            waitAndClickByXpath(allDaySelector);
2837            Thread.sleep(5000); //allow for ajax refresh
2838            waitAndClick("div#ConfigurationTestView-ProgressiveRender-TimeInfoSection button");
2839            Thread.sleep(5000); //allow for line to be added           
2840        }
2841    
2842        protected void testAddLineAllDay(String idPrefix, String addLineIdSuffix) throws Exception {
2843            waitForElementPresentByXpath("//span[@id='" + idPrefix + "TextInputField_label_span']");
2844            confirmAddLineControlsPresent(idPrefix, addLineIdSuffix);
2845            
2846            //store number of rows before adding the lines
2847            String cssCountRows = "div#ConfigurationTestView-ProgressiveRender-TimeInfoSection.uif-group div#ConfigurationTestView-ProgressiveRender-TimeInfoSection_disclosureContent.uif-disclosureContent table tbody tr";
2848            int rowCount = (getCssCount(cssCountRows));
2849            String allDayId = "//*[@id='" + idPrefix + "AllDay" + addLineIdSuffix + "']";
2850            Thread.sleep(5000); //allow for ajax refresh
2851            waitAndClickByXpath(allDayId);
2852            waitAndClick("div#ConfigurationTestView-ProgressiveRender-TimeInfoSection button");
2853            Thread.sleep(5000); //allow for line to be added
2854            
2855            //confirm that line has been added (by checking for the new delete button)
2856            assertEquals("line was not added", rowCount + 1, (getCssCount(cssCountRows)));
2857        }
2858    
2859    //    protected void testTravelAccountTypeLookup() throws Exception {
2860    //        selectFrameIframePortlet();
2861    //
2862    //        //Blank Search
2863    //        waitAndClickByXpath("//*[contains(button,\"earch\")]/button[1]");
2864    //        Thread.sleep(4000);
2865    //        assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'CAT')]");
2866    //        assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'EAT')]");
2867    //        assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'IAT')]");
2868    //
2869    //        //search with each field
2870    //        waitAndTypeByName("lookupCriteria[accountTypeCode]", "CAT");
2871    //        waitAndClickByXpath("//*[contains(button,\"earch\")]/button[1]");
2872    //        Thread.sleep(2000);
2873    //        assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'CAT')]");
2874    //        waitAndClickByXpath("//*[contains(button,\"earch\")]/button[2]");
2875    //        Thread.sleep(2000);
2876    //        waitAndTypeByName("lookupCriteria[name]", "Expense Account Type");
2877    //        waitAndClickByXpath("//*[contains(button,\"earch\")]/button[1]");
2878    //        Thread.sleep(4000);
2879    //        assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'EAT')]");
2880    //
2881    //        //Currently No links available for Travel Account Type Inquiry so cant verify heading and values.
2882    //    }
2883    
2884        protected void testCategoryLookUp() throws Exception {
2885            waitForPageToLoad();
2886            selectFrameIframePortlet();
2887            waitAndClickByXpath("//button[contains(.,'earch')]");
2888            Thread.sleep(3000);
2889            waitForPageToLoad();
2890            driver.findElement(By.tagName("body")).getText().contains("Actions"); // there are no actions, but the header is the only unique text from searching
2891            
2892            // Category's don't have actions (yet)
2893            //waitAndClick("id=u80");
2894            //waitForPageToLoad();
2895            //waitAndClick("id=u86");
2896            //waitForPageToLoad();
2897            //selectWindow("null");
2898            //waitAndClick("xpath=(//input[@name='imageField'])[2]");
2899            //waitForPageToLoad();
2900            //passed();
2901        }
2902    
2903        protected void testCreateSampleEDocLite() throws Exception {
2904            waitForPageToLoad();
2905            Thread.sleep(3000);
2906            SeleneseTestBase.assertEquals("Kuali Portal Index", getTitle());
2907            selectFrameIframePortlet();
2908            waitAndClickByXpath("//input[@name='methodToCall.search' and @alt='search']");
2909            waitForPageToLoad();
2910            
2911            // click on the create new.
2912            waitAndClickByLinkText("Create Document");
2913            waitForPageToLoad();
2914            Thread.sleep(3000);
2915            String docId = getTextByXpath("//table/tbody/tr[4]/td[@class='datacell1']");
2916            waitAndTypeByName("userName", "Viral Chauhan");
2917            waitAndTypeByName("rqstDate", "12/03/2020");
2918            checkByName("fundedBy");
2919            waitAndTypeByName("addText", "Note Added.");
2920            waitAndClickByXpath("//td[@class='datacell']/div/img");
2921            waitForPageToLoad();
2922            waitAndClickByXpath("//input[@value='submit']");
2923            SeleneseTestBase.assertEquals(Boolean.FALSE,(Boolean) isElementPresentByXpath("//input[@value='submit']"));
2924            SeleneseTestBase.assertEquals(Boolean.FALSE, (Boolean) isElementPresentByXpath("//input[@value='save']"));
2925            SeleneseTestBase.assertEquals(Boolean.FALSE,(Boolean) isElementPresentByXpath("//input[@value='cancel']"));
2926            waitForPageToLoad();
2927            selectTopFrame();
2928            waitAndClickDocSearch();
2929            waitForPageToLoad();
2930            selectFrameIframePortlet();
2931            waitAndClickByXpath("//input[@name='methodToCall.search' and @alt='search']");
2932            waitForPageToLoad();
2933            isElementPresent(By.linkText(docId));
2934        }
2935    
2936        protected void testTermLookUp() throws Exception {
2937            testLookUp();
2938            assertTextPresent("Term Parameters");
2939            waitAndClick(By.xpath(CANCEL2_XPATH));
2940            passed();
2941        }
2942    
2943        protected void testWorkFlowRouteRulesBlanketApp() throws Exception {
2944            waitForPageToLoad();
2945            Thread.sleep(3000);
2946            SeleneseTestBase.assertEquals("Kuali Portal Index", getTitle());
2947            selectFrameIframePortlet();
2948            
2949            // click on the create new button
2950            waitAndClickCreateNew();
2951            waitForPageToLoad();
2952            
2953            // lookup on the Document Type Name
2954            waitAndClickByName("methodToCall.performLookup.(!!org.kuali.rice.kew.doctype.bo.DocumentType!!).(((name:documentTypeName))).((``)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;;::::).anchor");
2955            waitForPageToLoad();
2956            
2957            // type in the name field the text RoutingRuleDocument
2958            waitAndTypeByName("name", "RoutingRuleDocument");
2959            
2960            // click the search button
2961            waitAndClickSearch();
2962            waitForPageToLoad();
2963            
2964            // click the return value link
2965            waitAndClickReturnValue();
2966            waitForPageToLoad();
2967            
2968            // lookup on the Rule Template Name
2969            waitAndClickByName("methodToCall.performLookup.(!!org.kuali.rice.kew.rule.bo.RuleTemplateBo!!).(((name:ruleTemplateName))).((``)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;;::::).anchor");
2970            waitForPageToLoad();
2971            
2972            // type in the name field the text RuleRoutingTemplate
2973            waitAndTypeByName("name", "RuleRoutingTemplate");
2974            
2975            // click the search button
2976            waitAndClickSearch();
2977            waitForPageToLoad();
2978            
2979            // click the return value link
2980            waitAndClickReturnValue();
2981            waitForPageToLoad();
2982            
2983            // click the create new button
2984            waitAndClickByName("methodToCall.createRule");
2985            waitForPageToLoad();
2986            String docId = waitForDocId();
2987            SeleneseTestBase.assertTrue(isElementPresentByName(CANCEL_NAME));
2988           
2989            // type in the Document Overview Description the text Test Routing Rule
2990            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Test Routing Rule");
2991           
2992            // click the Force Action checkbox
2993            waitAndClickByXpath("//input[@id='document.newMaintainableObject.forceAction']");
2994           
2995            // type in the Description text area the text Test Routing Rule1
2996            waitAndTypeByXpath("//textarea[@id='document.newMaintainableObject.description']", "Test Routing Rule1");
2997           
2998            // type in the Document type name field the text DocumentTypeDocument
2999            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.fieldValues(1321~docTypeFullName)']",
3000                    "DocumentTypeDocument");
3001            
3002            // lookup on Person
3003            waitAndClickByName("methodToCall.performLookup.(!!org.kuali.rice.kim.impl.identity.PersonImpl!!).(((principalName:document.newMaintainableObject.add.personResponsibilities.principalName,))).((`document.newMaintainableObject.add.personResponsibilities.principalName:principalName,`)).((<>)).(([])).((**)).((^^)).((&&)).((/personImpl/)).((~~)).(::::;"
3004                    + getBaseUrlString() + "/kr/lookup.do;::::).anchor15");
3005            waitForPageToLoad();
3006           
3007            // click the search button
3008            waitAndClickSearch();
3009            waitForPageToLoad();
3010            
3011            // click the return value
3012            waitAndClickReturnValue();
3013            waitForPageToLoad();
3014            
3015            // select from the Action Request ACKNOWLEDGE
3016            selectByXpath("//select[@id='document.newMaintainableObject.add.personResponsibilities.actionRequestedCd']",
3017                    "ACKNOWLEDGE");
3018            
3019            // type in the Priority field the text 1
3020            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.add.personResponsibilities.priority']", "1");
3021           
3022            // click the add button
3023            waitAndClickByName("methodToCall.addLine.personResponsibilities.(!!org.kuali.rice.kew.rule.PersonRuleResponsibility!!).(:::;15;:::).anchor15");
3024            waitForPageToLoad();
3025            checkForIncidentReport(BLANKET_APPROVE_NAME);
3026            waitAndClickByName(BLANKET_APPROVE_NAME);
3027            waitForPageToLoad();
3028            driver.switchTo().defaultContent(); //selectWindow("null");
3029            Thread.sleep(2000);
3030            waitAndClickDocSearch();
3031            waitForPageToLoad();
3032            SeleneseTestBase.assertEquals("Kuali Portal Index", getTitle());
3033            selectFrameIframePortlet();
3034            waitAndClickSearch();
3035            waitForPageToLoad();
3036            SeleneseTestBase.assertTrue(isElementPresent(By.linkText(docId)));
3037            
3038            if (isElementPresent(By.linkText(docId))) {
3039                assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2), "https://jira.kuali.org/browse/KULRICE-9051 WorkFlow Route Rules Blanket Approval submit status results in Enroute, not Final");
3040            } else {
3041                SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_2));
3042                SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
3043            }
3044        }
3045    
3046        protected void testCreateNewRRDTravelRequestDestRouting() throws Exception {
3047            selectFrameIframePortlet();
3048            waitAndClick("img[alt=\"create new\"]");
3049            waitForPageToLoad();
3050            waitAndClickByName("methodToCall.performLookup.(!!org.kuali.rice.kew.rule.RuleBaseValues!!).(((id:parentRuleId))).((``)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;;::::).anchor");
3051            waitForPageToLoad();
3052            waitAndClickByXpath("//td[@class='infoline']/input[@name='methodToCall.search']");
3053            waitForPageToLoad();
3054            waitAndClick("a[title=\"return valueRule Id=1046 \"]");
3055            waitForPageToLoad();
3056            waitAndClickByName("parentResponsibilityId");
3057            waitAndClickByName("methodToCall.createDelegateRule");
3058            waitForPageToLoad();
3059            Thread.sleep(3000);
3060            waitAndClickCancel();
3061            waitForPageToLoad();
3062            waitAndClickByName("methodToCall.processAnswer.button0");
3063            waitForPageToLoad();
3064            driver.switchTo().defaultContent();
3065            waitAndClickByXpath("(//input[@name='imageField'])[2]");
3066            waitForPageToLoad();
3067            passed();
3068        }
3069    
3070        protected void testWorkFlowRouteRulesCreateNew() throws Exception {
3071            waitForPageToLoad();
3072            Thread.sleep(5000);
3073            SeleneseTestBase.assertEquals("Kuali Portal Index", getTitle());
3074            selectFrameIframePortlet();
3075            waitAndClickCreateNew();
3076            waitForPageToLoad();
3077            Thread.sleep(3000);
3078            waitAndClickByName(CANCEL_NAME,"https://jira.kuali.org/browse/KULRICE-8161 Work Flow Route Rules cancel new yields 404 not found");
3079       
3080            // KULRICE-7753 : WorkFlowRouteRulesIT cancel confirmation missing from create new Route Rules.
3081            waitForPageToLoad();
3082            Thread.sleep(3000);
3083            waitAndClickByName("methodToCall.processAnswer.button0",
3084                    "https://jira.kuali.org/browse/KULRICE-7753 : WorkFlowRouteRulesIT cancel confirmation missing from create new Route Rules.");
3085            passed();
3086        }
3087    
3088        /**
3089         * tests that a Routing Rule maintenance document is created for an edit operation originating
3090         * from a lookup screen
3091         */
3092        protected void testWorkFlowRouteRulesEditRouteRules() throws Exception {
3093            waitForPageToLoad();
3094            SeleneseTestBase.assertEquals("Kuali Portal Index", getTitle());
3095            selectFrameIframePortlet();
3096            waitAndClickSearch();
3097            waitAndClickEdit();
3098            waitForPageToLoad();
3099            selectFrameIframePortlet();
3100            Thread.sleep(3000);
3101            waitAndClickCancel();
3102            waitForPageToLoad();
3103            Thread.sleep(3000);
3104            waitAndClickByName("methodToCall.processAnswer.button0");
3105            passed();
3106        }
3107    
3108        protected String testCreateNewComponent(String componentName, String componentCode) throws Exception {
3109            return testCreateNewComponent(componentName, componentCode, "");
3110        }
3111    
3112        protected String testCreateNewComponent(String componentName, String componentCode, String message) throws Exception {
3113            waitForPageToLoad();
3114            String docId = waitForDocId();
3115            
3116            //Enter details for Parameter.
3117            waitAndTypeByName("document.documentHeader.documentDescription", "Adding Test Component");
3118            selectOptionByName("document.newMaintainableObject.namespaceCode", "KR-IDM");
3119            waitAndTypeByName("document.newMaintainableObject.code", componentCode);
3120            waitAndTypeByName("document.newMaintainableObject.name", componentName);
3121            checkByName("document.newMaintainableObject.active");
3122            waitAndClickSave();
3123            waitAndClickSubmit();
3124            waitForPageToLoad();
3125            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, CREATE_NEW_DOCUMENT_NOT_SUBMITTED_SUCCESSFULLY_MESSAGE_TEXT  + message);
3126            selectTopFrame();
3127            waitAndClickDocSearchTitle();
3128            waitForPageToLoad();
3129            selectFrameIframePortlet();
3130            waitAndClickSearch();
3131            Thread.sleep(2000);
3132            SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3));
3133            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
3134            selectTopFrame();
3135            return docId;
3136        }
3137        
3138        
3139        protected void testLookUpComponent(String docId, String componentName, String componentCode) throws Exception {
3140            selectFrameIframePortlet();
3141            //Lookup
3142            waitAndTypeByName("name", componentName);
3143            waitAndClickSearch();
3144            isElementPresentByLinkText(componentName);
3145            waitAndClickByLinkText(componentName);
3146            waitForPageToLoad();
3147            Thread.sleep(2000);
3148            switchToWindow("Kuali :: Inquiry");
3149            Thread.sleep(2000);
3150            SeleneseTestBase.assertEquals(componentName, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim());
3151            SeleneseTestBase.assertEquals(componentCode, getTextByXpath("//div[@class='tab-container']/table//span[@id='code.div']").trim());
3152            waitAndClickCloseWindow();
3153            switchToWindow("null");
3154        }
3155        
3156        protected void testEditComponent(String docId, String componentName, String componentCode) throws Exception {
3157            selectFrameIframePortlet();
3158            waitAndClickEdit();
3159            waitForPageToLoad();
3160            docId = waitForDocId();
3161            waitAndTypeByName("document.documentHeader.documentDescription", "Editing Test Component");
3162            clearTextByName("document.newMaintainableObject.name");
3163            waitAndTypeByName("document.newMaintainableObject.name", componentName);
3164            waitAndClickSave();
3165            waitAndClickSubmit();
3166            waitForPageToLoad();
3167            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH,"Document is not submitted successfully");
3168            selectTopFrame();
3169            waitAndClickDocSearchTitle();
3170            waitForPageToLoad();
3171            selectFrameIframePortlet();
3172            waitAndClickSearch();
3173            Thread.sleep(2000);
3174            SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3));
3175            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
3176            selectTopFrame();
3177        }
3178        
3179        protected void testCopyComponent(String docId, String componentName, String componentCode) throws Exception {
3180            selectFrameIframePortlet();
3181            waitAndClickCopy();
3182            waitForPageToLoad();
3183            docId = waitForDocId();
3184            waitAndTypeByName("document.documentHeader.documentDescription", "Copying Test Component");
3185            selectOptionByName("document.newMaintainableObject.namespaceCode", "KR-IDM");
3186            waitAndTypeByName("document.newMaintainableObject.code", componentCode);
3187            clearTextByName("document.newMaintainableObject.name");
3188            waitAndTypeByName("document.newMaintainableObject.name", componentName);
3189            waitAndClickSave();
3190            waitAndClickSubmit();
3191            waitForPageToLoad();
3192            checkForDocError();
3193            assertElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH,"Document is not submitted successfully");
3194            selectTopFrame();
3195            waitAndClickDocSearchTitle();
3196            waitForPageToLoad();
3197            selectFrameIframePortlet();
3198            waitAndClickSearch();
3199            Thread.sleep(2000);
3200            SeleneseTestBase.assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3));
3201            SeleneseTestBase.assertEquals(DOC_STATUS_FINAL, getTextByXpath(DOC_STATUS_XPATH_2));
3202            selectTopFrame();
3203        }
3204    
3205        protected void testVerifyCopyComponent(String docId, String componentName, String componentCode) throws Exception {
3206            selectFrameIframePortlet();
3207            waitAndTypeByName("name", componentName);
3208            waitAndClickSearch();
3209            isElementPresentByLinkText(componentName);
3210            waitAndClickByLinkText(componentName);
3211            waitForPageToLoad();
3212            Thread.sleep(2000);
3213            switchToWindow("Kuali :: Inquiry");
3214            Thread.sleep(2000);
3215            SeleneseTestBase.assertEquals(componentName, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim());
3216            SeleneseTestBase.assertEquals(componentCode, getTextByXpath("//div[@class='tab-container']/table//span[@id='code.div']").trim());
3217            waitAndClickCloseWindow();
3218            switchToWindow("null");
3219        }
3220        
3221        /**
3222         * Test the tooltip and external help on the page
3223         */
3224        protected void testPageHelp() throws Exception {
3225            // test tooltip help
3226            fireMouseOverEventByXpath("//h2/span[@class='uif-headerText-span']");
3227            SeleneseTestBase.assertEquals("Sample text for page help", getText("td.jquerybubblepopup-innerHtml"));
3228    
3229            // test external help
3230            waitAndClickByXpath("//input[@alt='Help for Help Page']");
3231            Thread.sleep(5000);
3232            switchToWindow("Kuali Foundation");
3233            Thread.sleep(5000);      
3234            switchToWindow(CONFIGURATION_VIEW_WINDOW_TITLE);
3235        }
3236    
3237        /**
3238         * Test the tooltip help on the section and fields
3239         */
3240        protected void testTooltipHelp() throws Exception {
3241            // verify that no tooltips are displayed initially
3242            if (isElementPresentByXpath("//td[contains(text(),'Sample text for section help - tooltip help')]")) {
3243                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for section help - tooltip help')]"));
3244            }
3245            
3246            if (isElementPresentByXpath("//td[contains(text(),'Sample text for field help - label left')]")) {
3247                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - label left')]"));
3248            }
3249            
3250            if (isElementPresentByXpath("//td[contains(text(),'Sample text for field help - label right')]")) {
3251                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - label right')]"));
3252            }
3253            
3254            if (isElementPresentByXpath("//td[contains(text(),'Sample text for field help - label top')]")) {
3255                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - label top')]"));
3256            }
3257            
3258            if (isElementPresentByXpath("//td[contains(text(),'Sample text for standalone help widget tooltip which will never be rendered')]")) {
3259                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for standalone help widget tooltip which will never be rendered')]"));
3260            }
3261            
3262            if (isElementPresentByXpath("//td[contains(text(),'Sample text for field help - there is also a tooltip on the label but it is overridden by the help tooltip')]")) {
3263                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - there is also a tooltip on the label but it is overridden by the help tooltip')]"));
3264            }
3265            
3266            if (isElementPresentByXpath("//td[contains(text(),'Sample text for label tooltip - this will not be rendered as it is overridden by the help tooltip')]")) {
3267                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for label tooltip - this will not be rendered as it is overridden by the help tooltip')]"));
3268            }
3269            
3270            if (isElementPresentByXpath("//td[contains(text(),'Sample text for field help - there is also an on-focus tooltip')]")) {
3271                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - there is also an on-focus tooltip')]"));
3272            }
3273            
3274            if (isElementPresentByXpath("//td[contains(text(),'Sample text for on-focus event tooltip')]")) {
3275                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for on-focus event tooltip')]"));
3276            }
3277            
3278            if (isElementPresentByXpath("//td[contains(text(),'Sample text for check box help')]")) {
3279                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for check box help')]"));
3280            }
3281           
3282            // test tooltip help of section header
3283            fireMouseOverEventByXpath("//div[@id='ConfigurationTestView-Help-Section1']/div/h3[@class='uif-headerText']");
3284            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for section help - tooltip help')]"));
3285            String javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" + "element[0].style.display='none'"; 
3286            ((JavascriptExecutor) driver).executeScript(javascript);
3287            Thread.sleep(3000);
3288            SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for section help - tooltip help')]"));
3289            
3290            // verify that no external help exist
3291            SeleneseTestBase.assertFalse(isElementPresent("#ConfigurationTestView-Help-Section1 input.uif-helpImage"));
3292        
3293            // test tooltip help of field with label to the left
3294            fireMouseOverEventByXpath("//label[@id='field-label-left_label']");
3295            Thread.sleep(3000);
3296            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for field help - label left')]"));
3297            javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" +
3298                    "element[1].style.display='none'"; 
3299            Thread.sleep(3000);
3300            ((JavascriptExecutor) driver).executeScript(javascript);
3301            SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - label left')]"));
3302            
3303            // test tooltip help of field with label to the right
3304            fireMouseOverEventByXpath("//label[@id='field-label-right_label']");
3305            Thread.sleep(3000);
3306            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for field help - label righ')]"));
3307            javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" +"element[2].style.display='none'"; 
3308            ((JavascriptExecutor) driver).executeScript(javascript);
3309            Thread.sleep(3000);
3310            SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - label righ')]"));
3311    
3312            // test tooltip help of field with label to the top
3313            fireMouseOverEventByXpath("//label[@id='field-label-top_label']");
3314            Thread.sleep(3000);
3315            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for field help - label top')]"));
3316            javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" + "element[3].style.display='none'"; 
3317            ((JavascriptExecutor) driver).executeScript(javascript);
3318            Thread.sleep(3000);
3319            SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - label top')]"));
3320    
3321            // verify that standalone help with tooltip is not rendered
3322            SeleneseTestBase.assertFalse(isElementPresentByXpath("//*[@id='standalone-help-not-rendered']"));
3323    
3324            // test tooltip help when it overrides a tooltip
3325            fireMouseOverEventByXpath("//label[@id='override-tooltip_label']");
3326            Thread.sleep(3000);
3327            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for field help - there is also a tooltip on the label but it is overridden by the help tooltip')]"));
3328            if (isElementPresentByXpath("//td[contains(text(),'Sample text for label tooltip - this will not be rendered as it is overridden by the help tooltip')]")) {
3329                SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for label tooltip - this will not be rendered as it is overridden by the help tooltip')]"));
3330            }        
3331            javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" + "element[4].style.display='none'"; 
3332            ((JavascriptExecutor) driver).executeScript(javascript);
3333            Thread.sleep(3000);
3334            SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - there is also a tooltip on the label but it is overridden by the help tooltip')]"));
3335    
3336            // test tooltip help in conjunction with a focus event tooltip
3337            fireMouseOverEventByXpath("//input[@id='on-focus-tooltip_control']");
3338            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for on-focus event tooltip')]"));
3339            fireMouseOverEventByXpath("//label[@id='on-focus-tooltip_label']");
3340            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for field help - there is also an on-focus tooltip')]"));
3341            javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" +"element[5].style.display='none'"; 
3342            ((JavascriptExecutor) driver).executeScript(javascript);
3343            Thread.sleep(3000);                
3344            javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" + "element[6].style.display='none'"; 
3345            ((JavascriptExecutor) driver).executeScript(javascript);
3346            Thread.sleep(3000);    
3347            SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for field help - there is also an on-focus tooltip')]"));
3348            SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for on-focus event tooltip')]"));
3349    
3350            // test tooltip help against a check box - help contains html
3351            fireMouseOverEventByXpath("//label[@id='checkbox_label']");
3352            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for check box help')]"));
3353            javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" + "element[7].style.display='none'"; 
3354            ((JavascriptExecutor) driver).executeScript(javascript);
3355            Thread.sleep(3000);
3356            SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for check box help')]"));
3357        }
3358    
3359        /**
3360         * Test the tooltip help on the sub-section and fields that are display only
3361         */
3362         protected void testDisplayOnlyTooltipHelp() throws Exception {
3363            // verify that no tooltips are displayed initially
3364            if (isElementPresentByXpath("//td[contains(text(),'Sample text for sub-section help')]")) {
3365                SeleneseTestBase.assertFalse(isVisible("//td[contains(text(),'Sample text for sub-section help')]"));
3366            }
3367            
3368            if (isElementPresentByXpath("//td[contains(text(),'Sample text for read only field help')]")) {
3369                SeleneseTestBase.assertFalse(isVisible("//td[contains(text(),'Sample text for read only field help')]"));
3370            }
3371    
3372            // test tooltip help of sub-section header
3373            fireMouseOverEventByXpath("//span[contains(text(),'Display only fields')]");
3374            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for sub-section help')]"));
3375            String javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" +
3376                    "element[0].style.display='none'"; 
3377            ((JavascriptExecutor) driver).executeScript(javascript);
3378            SeleneseTestBase.assertFalse(isVisibleByXpath("//td[contains(text(),'Sample text for sub-section help')]"));
3379    
3380            // test tooltip help of display only data field
3381            fireMouseOverEventByXpath("//label[@for='display-field_control']");
3382            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'Sample text for read only field help')]"));
3383            javascript="var element = document.getElementsByClassName('jquerybubblepopup jquerybubblepopup-black');" +
3384                    "element[0].style.display='none'"; 
3385            ((JavascriptExecutor) driver).executeScript(javascript);
3386        }
3387    
3388        /**
3389         * Test the tooltip help on the section and fields with no content
3390         */
3391        protected void testMissingTooltipHelp() throws Exception {
3392            // verify that no tooltips are displayed initially
3393            SeleneseTestBase.assertFalse(isElementPresentByXpath("//*[@class='jquerybubblepopup jquerybubblepopup-black']"));
3394    
3395            // verify that no external help exist
3396            SeleneseTestBase.assertFalse(isElementPresent("#ConfigurationTestView-Help-Section2 input.uif-helpImage"));
3397           
3398            // test tooltip help of section header
3399            fireMouseOverEventByXpath("//div[@id='ConfigurationTestView-Help-Section2']/div");
3400            SeleneseTestBase.assertFalse(isElementPresentByXpath("//*[@class='jquerybubblepopup jquerybubblepopup-black']"));
3401            SeleneseTestBase.assertFalse(isElementPresentByXpath("//*[@class='jquerybubblepopup jquerybubblepopup-black']"));
3402    
3403            // test tooltip help of field
3404            fireMouseOverEventByXpath("//label[@id='missing-tooltip-help_label']");
3405            SeleneseTestBase.assertFalse(isElementPresentByXpath("//*[@class='jquerybubblepopup jquerybubblepopup-black']"));
3406            SeleneseTestBase.assertFalse(isElementPresentByXpath("//*[@class='jquerybubblepopup jquerybubblepopup-black']"));
3407        }
3408    
3409        /**
3410         * Test the external help on the section and fields
3411         */
3412    
3413        protected void testExternalHelp2() throws Exception {
3414            // test external help of section
3415            assertPopUpWindowUrl(By.cssSelector("input[title=\"Help for External Help\"]"), "HelpWindow", "http://www.kuali.org/?section");
3416    
3417            // test external help of field with label left
3418            assertPopUpWindowUrl(By.xpath("//div[@id='field-label-left-external-help']/fieldset/input[@title='Help for Field Label']"), "HelpWindow",
3419                    "http://www.kuali.org/?label_left");
3420    
3421            // test external help of field with label right
3422            assertPopUpWindowUrl(By.xpath("//div[@id='field-label-right-external-help']/fieldset/input[@title='Help for Field Label']"), "HelpWindow",
3423                    "http://www.kuali.org/?label_right");
3424    
3425            // test external help of field with label top and help URL from system parameters
3426            assertPopUpWindowUrl(By.xpath("//div[@id='field-label-top-external-help']/fieldset/input[@title='Help for Field Label']"), "HelpWindow",
3427                    "http://www.kuali.org/?system_parm");
3428    
3429            // test external help of standalone help widget
3430            assertPopUpWindowUrl(By.id("standalone-external-help"), "HelpWindow", "http://www.kuali.org/?widget_only");
3431        }
3432    
3433        /**
3434         * Test the external help on the sub-section and display only fields
3435         */
3436    
3437        protected void testDisplayOnlyExternalHelp2() throws Exception {
3438            // test external help of sub-section
3439            assertPopUpWindowUrl(By.cssSelector("input[title=\"Help for Display only fields\"]"), "HelpWindow", "http://www.kuali.org/?sub_section");
3440    
3441            // test external help of display only data field
3442            assertPopUpWindowUrl(By.xpath("//div[@id='display-field-external-help']/fieldset/input[@title='Help for Field Label']"), "HelpWindow",
3443                    "http://www.kuali.org/?display_field");
3444        }
3445    
3446        /**
3447         * Test the external help on the section and fields with missing help URL
3448         */
3449    
3450        protected void testMissingExternalHelp2() throws Exception {
3451            // test external help of section is not rendered
3452            SeleneseTestBase.assertFalse(isElementPresent(By.cssSelector("input[title=\"Help for Missing External Help\"]")));
3453    
3454            // test external help of field with blank externalHelpURL is not rendered
3455            SeleneseTestBase.assertFalse(isElementPresentByXpath("//div[@id='external-help-externalHelpUrl-empty']/*[@class='uif-helpImage']"));
3456    
3457            // test external help of field with empty helpDefinition is not rendered
3458            SeleneseTestBase.assertFalse(isElementPresentByXpath("//div[@id='external-help-helpdefinition-empty']/*[@class='uif-helpImage']"));
3459    
3460            // test external help of field with missing system parameter is not rendered
3461            SeleneseTestBase.assertFalse(isElementPresentByXpath("//div[@id='external-help-system-parm-missing']/*[@class='uif-helpImage']"));
3462    
3463            // test external help of standalone help widget is not rendered
3464            SeleneseTestBase.assertFalse(isElementPresentByXpath("//div[@id='standalone-external-help-missing']"));
3465        }
3466        
3467        protected void testReferenceCampusTypeBlanketApprove() throws Exception {
3468            selectFrameIframePortlet();
3469            waitAndCreateNew();
3470            String docId = waitForDocId();
3471            assertBlanketApproveButtonsPresent();
3472            String dtsTwo = ITUtil.createUniqueDtsPlusTwoRandomCharsNot9Digits();
3473            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Campus Type " + dtsTwo);
3474            waitAndTypeByXpath(DOC_CODE_XPATH, RandomStringUtils.randomAlphabetic(1));
3475            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", "Indianapolis" + dtsTwo);
3476            int attemptCount = 1;
3477            while (hasDocError("same primary key already exists") && attemptCount < 25) {
3478                clearTextByXpath(DOC_CODE_XPATH);
3479                waitAndTypeByXpath(DOC_CODE_XPATH, Character.toString((char) ('A' + attemptCount++)));
3480            }
3481            blanketApproveTest();
3482            assertDocFinal(docId);
3483        }
3484    
3485        protected void testSearchEditCancel() throws InterruptedException {
3486            selectFrameIframePortlet();
3487            waitAndClickSearch2();
3488            waitAndClickEdit();
3489            testCancelConfirmation();
3490        }
3491    
3492        protected void testServerErrorsIT() throws Exception {
3493            waitAndClickByXpath("//button[contains(.,'Get Error Messages')]");
3494            waitForPageToLoad();
3495            Thread.sleep(5000);
3496            assertElementPresent("div[data-messagesfor=\"Demo-ValidationLayout-SectionsPage\"] .uif-errorMessageItem");
3497            waitIsVisibleByXpath("//div[@data-header_for='Demo-ValidationLayout-Section1']");
3498            assertElementPresentByXpath("//*[@data-messageitemfor='Demo-ValidationLayout-Section1' and @class='uif-errorMessageItem']");
3499            assertElementPresent("div[data-role=\"InputField\"] img[alt=\"Error\"]");
3500            assertElementPresentByXpath("//a[contains(.,'Section 1 Title')]");
3501            fireMouseOverEventByXpath("//a[contains(.,'Field 1')]");
3502            assertElementPresent(".uif-errorMessageItem-field");
3503            waitAndClickByXpath("//a[contains(.,'Field 1')]");
3504            Thread.sleep(2000);
3505            waitIsVisible(".jquerybubblepopup-innerHtml");
3506            waitIsVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems");
3507            waitIsVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-errorMessageItem-field");
3508            waitAndTypeByName("field1", "");
3509            fireEvent("field1", "blur");
3510            fireEvent("field1", "focus");
3511            waitIsVisible(".jquerybubblepopup-innerHtml");
3512            waitIsVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-errorMessageItem-field");
3513            waitIsVisible(".jquerybubblepopup-innerHtml > .uif-clientMessageItems");
3514            waitIsVisible(".jquerybubblepopup-innerHtml > .uif-clientMessageItems  .uif-errorMessageItem-field");
3515            waitAndTypeByName("field1", "t");
3516    
3517            for (int second = 0;; second++) {
3518                if (second >= waitSeconds) {
3519                    failableFail(TIMEOUT_MESSAGE);
3520                }
3521                try {
3522                    if (!isElementPresent(".jquerybubblepopup-innerHtml > .uif-clientMessageItems")) {
3523                        break;
3524                    }
3525                } catch (Exception e) {}
3526                Thread.sleep(1000);
3527            }
3528    
3529            waitIsVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-errorMessageItem-field");
3530            SeleneseTestBase.assertFalse(isElementPresent(".jquerybubblepopup-innerHtml > .uif-clientMessageItems"));
3531        }
3532    
3533        protected void testServerInfoIT() throws Exception {
3534            waitAndClickByXpath("//button[contains(.,'Get Info Messages')]");
3535            waitIsVisibleByXpath("//div[@data-messagesfor='Demo-ValidationLayout-SectionsPage']");
3536            SeleneseTestBase.assertTrue(isVisibleByXpath("//div[@data-messagesfor='Demo-ValidationLayout-SectionsPage']"));
3537            SeleneseTestBase.assertTrue(isElementPresent("div[data-messagesfor=\"Demo-ValidationLayout-SectionsPage\"] .uif-infoMessageItem"));
3538            SeleneseTestBase.assertTrue(isVisible("div[data-messagesfor=\"Demo-ValidationLayout-Section1\"]"));
3539            SeleneseTestBase.assertTrue(isElementPresent("div[data-messagesfor=\"Demo-ValidationLayout-Section1\"] .uif-infoMessageItem"));
3540            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@data-role='InputField']//img[@alt='Information']"));
3541            fireMouseOverEventByXpath("//a[contains(.,'Field 1')]");
3542            SeleneseTestBase.assertTrue(isElementPresent(".uif-infoHighlight"));
3543            waitAndClickByXpath("//a[contains(.,'Field 1')]");
3544    
3545            for (int second = 0;; second++) {
3546                if (second >= waitSeconds)
3547                    failableFail(TIMEOUT_MESSAGE);
3548                try {
3549                    if (isVisible(".jquerybubblepopup-innerHtml"))
3550                        break;
3551                } catch (Exception e) {}
3552                Thread.sleep(1000);
3553            }
3554    
3555            SeleneseTestBase.assertTrue(isVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems"));
3556            SeleneseTestBase.assertTrue(isVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-infoMessageItem-field"));
3557            waitAndTypeByName("field1", "");
3558            fireEvent("field1", "blur");
3559            fireEvent("field1", "focus");
3560    
3561            for (int second = 0;; second++) {
3562                if (second >= waitSeconds)
3563                    failableFail(TIMEOUT_MESSAGE);
3564                try {
3565                    if (isVisible(".jquerybubblepopup-innerHtml"))
3566                        break;
3567                } catch (Exception e) {}
3568                Thread.sleep(1000);
3569            }
3570    
3571            SeleneseTestBase.assertTrue(isVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-infoMessageItem-field"));
3572            for (int second = 0;; second++) {
3573                if (second >= waitSeconds)
3574                    failableFail(TIMEOUT_MESSAGE);
3575                try {
3576                    if (isVisible(".jquerybubblepopup-innerHtml > .uif-clientMessageItems"))
3577                        break;
3578                } catch (Exception e) {}
3579                Thread.sleep(1000);
3580            }
3581    
3582            SeleneseTestBase.assertTrue(isVisible(".jquerybubblepopup-innerHtml > .uif-clientMessageItems  .uif-errorMessageItem-field"));
3583            waitAndTypeByName("field1", "b");
3584            fireEvent("field1", "blur");
3585            fireEvent("field1", "focus");
3586    
3587            for (int second = 0;; second++) {
3588                if (second >= waitSeconds)
3589                    failableFail(TIMEOUT_MESSAGE);
3590                try {
3591                    if (!isElementPresent(".jquerybubblepopup-innerHtml > .uif-clientMessageItems"))
3592                        break;
3593                } catch (Exception e) {}
3594                Thread.sleep(1000);
3595            }
3596    
3597            fireEvent("field1", "blur");
3598            Thread.sleep(3000);
3599            SeleneseTestBase.assertTrue(!isVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-infoMessageItem-field"));
3600            SeleneseTestBase.assertFalse(isElementPresent(".jquerybubblepopup-innerHtml > .uif-clientMessageItems"));
3601            fireEvent("field1", "focus");
3602            clearTextByName("field1");
3603            fireEvent("field1", "blur");
3604            SeleneseTestBase.assertTrue(isElementPresent("div.uif-hasError"));
3605            SeleneseTestBase.assertTrue(isElementPresent("img[src*=\"error.png\"]"));
3606        }
3607    
3608        protected void testServerWarningsIT() throws Exception {
3609            waitAndClickByXpath("//button[contains(.,'Get Warning Messages')]");
3610            waitForPageToLoad();
3611            Thread.sleep(3000);
3612            com.thoughtworks.selenium.SeleneseTestBase.assertTrue("div[data-messagesfor=\"Demo-ValidationLayout-SectionsPage\"] not visible",
3613                    isVisible("div[data-messagesfor=\"Demo-ValidationLayout-SectionsPage\"]"));
3614            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3615                    "div[data-messagesfor=\"Demo-ValidationLayout-SectionsPage\"] .uif-warningMessageItem not present",
3616                    isElementPresent("div[data-messagesfor=\"Demo-ValidationLayout-SectionsPage\"] .uif-warningMessageItem"));
3617            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3618                    "div[data-messagesfor=\"Demo-ValidationLayout-Section1\"] not visible", isVisible(
3619                    "div[data-messagesfor=\"Demo-ValidationLayout-Section1\"]"));
3620            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3621                    "div[data-messagesfor=\"Demo-ValidationLayout-Section1\"] .uif-warningMessageItem not present",
3622                    isElementPresent("div[data-messagesfor=\"Demo-ValidationLayout-Section1\"] .uif-warningMessageItem"));
3623            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3624                    "div[data-role=\"InputField\"] img[alt=\"Warning\"] not present", isElementPresent(
3625                    "div[data-role=\"InputField\"] img[alt=\"Warning\"]"));
3626            fireMouseOverEvent(By.xpath("//a[contains(.,'Field 1')]"));
3627            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3628                    ".uif-warningHighlight no present when //a[contains(.,'Field 1')] is moused over",
3629                    isElementPresent(".uif-warningHighlight"));
3630            waitAndClickByXpath("//a[contains(.,'Field 1')]");
3631            waitForElementVisible(".jquerybubblepopup-innerHtml", " after click on //a[contains(.,'Field 1')]");
3632            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3633                    ".jquerybubblepopup-innerHtml > .uif-serverMessageItems not visible", isVisible(
3634                    ".jquerybubblepopup-innerHtml > .uif-serverMessageItems"));
3635            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3636                    ".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-warningMessageItem-field not visible",
3637                    isVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-warningMessageItem-field"));
3638            waitAndTypeByName("field1", "");
3639            fireEvent("field1", "blur");
3640            fireMouseOverEventByName("field1");
3641            waitForElementVisible(".jquerybubblepopup-innerHtml",
3642                    " not visible after typing nothing in name=field1 then firing blur and focus events");
3643            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3644                    ".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-warningMessageItem-field not visible after typing nothing in name=field1 then firing blur and focus events",
3645                    isVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-warningMessageItem-field"));
3646            waitForElementVisible(".jquerybubblepopup-innerHtml> .uif-clientMessageItems",
3647                    " not visible after typing nothing in name=field1 then firing blur and focus events");
3648            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3649                    ".jquerybubblepopup-innerHtml > .uif-clientMessageItems  .uif-errorMessageItem-field not visible after typing nothing in name=field1 then firing blur and focus events",
3650                    isVisible(".jquerybubblepopup-innerHtml > .uif-clientMessageItems  .uif-errorMessageItem-field"));
3651            waitAndTypeByName("field1", "b");
3652            fireEvent("field1", "blur");
3653            fireMouseOverEventByName("field1");
3654            waitForElementVisible(".jquerybubblepopup-innerHtml> .uif-serverMessageItems", "");
3655            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3656                    ".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-warningMessageItem-field not visible after typing b in name=field1 then firing blur and focus events",
3657                    isVisible(".jquerybubblepopup-innerHtml > .uif-serverMessageItems .uif-warningMessageItem-field"));
3658            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(".jquerybubblepopup-innerHtml > .uif-clientMessageItems",
3659                    !isElementPresent(
3660                            ".jquerybubblepopup-innerHtml > .uif-clientMessageItems"));
3661            clearTextByName("field1");
3662            fireEvent("field1", "blur");
3663            fireMouseOverEventByName("field1");
3664            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3665                    ".uif-hasError is not present after typing nothing in name=field1 and then firing focus and blur events",
3666                    isElementPresent(".uif-hasError"));
3667            com.thoughtworks.selenium.SeleneseTestBase.assertTrue(
3668                    "img[src*=\"error.png\"] is not present after typing nothing in name=field1 and then firing focus and blur events",
3669                    isElementPresent("img[src*=\"error.png\"]"));
3670            passed();
3671        }
3672    
3673        /**
3674         * Test the tooltip and external help on the view
3675         */
3676        protected void testViewHelp() throws Exception {
3677            // test tooltip help
3678            fireMouseOverEventByXpath("//h1/span[@class='uif-headerText-span']");
3679            SeleneseTestBase.assertEquals("Sample text for view help", getText("td.jquerybubblepopup-innerHtml"));
3680    
3681            // test external help
3682            waitAndClickByXpath("//input[@alt='Help for Configuration Test View - Help']");
3683            Thread.sleep(5000);
3684            switchToWindow("Kuali Foundation");
3685            Thread.sleep(5000);
3686            switchToWindow(CONFIGURATION_VIEW_WINDOW_TITLE);
3687        }
3688    
3689        /**
3690         * Test the tooltip and external help on the view
3691         */
3692        protected void testViewHelp2() throws Exception {
3693            // test tooltip help
3694            if (isElementPresentByXpath("//td[@class='jquerybubblepopup-innerHtml']")) {
3695                SeleneseTestBase.assertFalse(driver.findElement(By.cssSelector("td.jquerybubblepopup-innerHtml")).isDisplayed());
3696            }
3697    
3698            // test tooltip help
3699            fireMouseOverEventByXpath("//h1/span[@class='uif-headerText-span']");
3700            Thread.sleep(2000);
3701            SeleneseTestBase.assertTrue(isVisibleByXpath("//td[contains(text(),'View help')]"));
3702            assertPopUpWindowUrl(By.cssSelector("input[title=\"Help for Configuration Test View\"]"), "HelpWindow", "http://www.kuali.org/");
3703        }
3704    
3705        protected void testVerifyAddDeleteFiscalOfficerLegacy() throws Exception {
3706            selectFrameIframePortlet();
3707            checkForIncidentReport("testVerifyAddDeleteFiscalOfficerLegacy");
3708            waitAndTypeByName("document.documentHeader.documentDescription", ITUtil.createUniqueDtsPlusTwoRandomChars());
3709            waitAndTypeByName("newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].number","1234567890");
3710            waitAndTypeByName("newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].foId", "2");
3711            waitAndClickByXpath("//button[@data-loadingmessage='Adding Line...']");
3712            waitForElementPresentByName("document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].number");
3713            SeleneseTestBase.assertEquals("1234567890", getAttributeByName(
3714                    "document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].number", "value"));
3715            SeleneseTestBase.assertEquals("2", getAttributeByName(
3716                    "document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].foId", "value"));
3717            waitAndClickByXpath("//button[@data-loadingmessage='Deleting Line...']");
3718            Thread.sleep(3000);
3719            SeleneseTestBase.assertEquals(Boolean.FALSE, (Boolean) isElementPresentByName(
3720                    "document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].number"));
3721            passed();
3722        }
3723    
3724        protected void testVerifyAddDeleteNoteLegacy() throws Exception {
3725            selectFrameIframePortlet();
3726            waitAndClick("div.tableborders.wrap.uif-boxLayoutVerticalItem.clearfix  span.uif-headerText-span > img.uif-disclosure-image");
3727            waitForElementPresent("button[title='Add a Note'].uif-action.uif-primaryActionButton.uif-smallActionButton");
3728            waitAndClickByName("newCollectionLines['document.notes'].noteText");
3729            waitAndTypeByName("newCollectionLines['document.notes'].noteText", "Test note");
3730            waitAndClick("button[title='Add a Note'].uif-action.uif-primaryActionButton.uif-smallActionButton");
3731    //        waitForElementPresentByName("document.notes[0].noteText");
3732            SeleneseTestBase.assertEquals("Test note", getTextByXpath("//pre"));
3733            waitAndClick("button[title='Delete a Note'].uif-action.uif-primaryActionButton.uif-smallActionButton");
3734            SeleneseTestBase.assertEquals(Boolean.FALSE, (Boolean) isElementPresentByName("document.notes[0].noteText"));
3735            passed();
3736        }
3737    
3738        protected void testVerifyAdHocRecipientsLegacy() throws Exception {
3739            selectFrameIframePortlet();
3740            waitAndClickByLinkText("Fiscal Officer Accounts");
3741            assertElementPresentByXpath(
3742                    "//select[@name=\"newCollectionLines['document.adHocRoutePersons'].actionRequested\"]");
3743            assertElementPresentByXpath(
3744                    "//input[@name=\"newCollectionLines['document.adHocRoutePersons'].name\" and @type=\"text\"]");
3745            assertElementPresentByXpath(
3746                    "//select[@name=\"newCollectionLines['document.adHocRouteWorkgroups'].actionRequested\"]");
3747            assertElementPresentByXpath(
3748                    "//input[@name=\"newCollectionLines['document.adHocRouteWorkgroups'].recipientNamespaceCode\" and @type='text']");
3749            assertElementPresentByXpath(
3750                    "//input[@name=\"newCollectionLines['document.adHocRouteWorkgroups'].recipientName\" and @type='text']");
3751            passed();
3752        }
3753    
3754        protected void testVerifyButtonsLegacy() throws Exception {
3755            selectFrameIframePortlet();
3756            assertElementPresentByXpath("//button[contains(.,'ubmit')]");
3757            assertElementPresentByXpath("//button[contains(.,'ave')]");
3758            assertElementPresentByXpath("//button[contains(.,'lanket approve')]");
3759            assertElementPresentByXpath("//button[contains(.,'lose')]");
3760            assertElementPresentByXpath("//a[contains(.,'ancel')]");
3761            passed();
3762        }
3763    
3764        protected void testVerifyConstraintText() throws Exception {
3765            selectFrameIframePortlet();
3766            SeleneseTestBase.assertEquals("* indicates required field", getText(
3767                    "div.uif-boxLayout.uif-horizontalBoxLayout.clearfix > span.uif-message.uif-requiredInstructionsMessage.uif-boxLayoutHorizontalItem"));
3768            SeleneseTestBase.assertEquals("Must not be more than 10 characters", getText(
3769                    "div.uif-group.uif-gridGroup.uif-gridSection.uif-disclosure.uif-boxLayoutVerticalItem.clearfix div[data-label='Travel Account Number'].uif-field.uif-inputField span.uif-message.uif-constraintMessage"));
3770            SeleneseTestBase.assertEquals("Must not be more than 10 characters", getText(
3771                    "div.uif-group.uif-gridGroup.uif-gridSection.uif-disclosure.uif-boxLayoutVerticalItem.clearfix div[data-label='Travel Sub Account Number'].uif-field.uif-inputField span.uif-message.uif-constraintMessage"));
3772            SeleneseTestBase.assertEquals("Must not be more than 10 characters", getText(
3773                    "div.uif-group.uif-gridGroup.uif-collectionItem.uif-gridCollectionItem.uif-collectionAddItem div[data-label='Travel Account Number'].uif-field.uif-inputField span.uif-message.uif-constraintMessage"));
3774            passed();
3775        }
3776    
3777        protected void testVerifyEditedComponent(String docId, String componentName, String componentCode) throws Exception {
3778            selectFrameIframePortlet();
3779            waitAndTypeByName("name", componentName);
3780            waitAndClickSearch();
3781            isElementPresentByLinkText(componentName);
3782            waitAndClickByLinkText(componentName);
3783            waitForPageToLoad();
3784            Thread.sleep(2000);
3785            switchToWindow("Kuali :: Inquiry");
3786            Thread.sleep(2000);
3787            SeleneseTestBase.assertEquals(componentName, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim());
3788            SeleneseTestBase.assertEquals(componentCode, getTextByXpath("//div[@class='tab-container']/table//span[@id='code.div']").trim());
3789            waitAndClickCloseWindow();
3790            switchToWindow("null");
3791            List<String> parameterList=new ArrayList<String>();
3792        }
3793    
3794        protected void testVerifyDisclosures() throws Exception {
3795            selectFrameIframePortlet();
3796            assertElementPresentByXpath("//span[contains(text(),'Document Overview')]");
3797            assertElementPresentByXpath("//span[contains(text(),'Document Overview')]");
3798            assertElementPresentByXpath("//span[contains(text(),'Account Information')]");
3799            assertElementPresentByXpath("//span[contains(text(),'Fiscal Officer Accounts')]");
3800            assertElementPresentByXpath("//span[contains(text(),'Notes and Attachments')]");
3801            assertElementPresentByXpath("//span[contains(text(),'Ad Hoc Recipients')]");
3802            assertElementPresentByXpath("//span[contains(text(),'Route Log')]");
3803            colapseExpandByXpath("//span[contains(text(),'Document Overview')]//img", "//label[contains(text(),'Organization Document Number')]");
3804            colapseExpandByXpath("//span[contains(text(),'Account Information')]//img","//label[contains(text(),'Travel Account Type Code')]");
3805            colapseExpandByXpath("//span[contains(text(),'Fiscal Officer Accounts')]//img","//a[contains(text(),'Lookup/Add Multiple Lines')]");
3806            expandColapseByXpath("//span[contains(text(),'Notes and Attachments')]//img","//label[contains(text(),'Note Text')]");
3807            expandColapseByXpath("//span[contains(text(),'Ad Hoc Recipients')]","//span[contains(text(),'Ad Hoc Group Requests')]");
3808    
3809            // Handle frames
3810            waitAndClickByXpath("//span[contains(text(),'Route Log')]//img");
3811            selectFrame("routeLogIFrame");
3812            waitIsVisibleByXpath("//img[@alt='refresh']");
3813    
3814            // relative=top iframeportlet might look weird but either alone results in something not found.
3815            selectTopFrame();
3816            selectFrameIframePortlet();
3817            waitAndClickByXpath("//span[contains(text(),'Route Log')]//img");
3818            selectFrame("routeLogIFrame");
3819            waitNotVisibleByXpath("//img[@alt='refresh']");
3820            passed();
3821        }
3822    
3823        protected void testVerifyDocumentOverviewLegacy() throws Exception {
3824            selectFrameIframePortlet();
3825            assertTextPresent("Document Overview");
3826            assertElementPresentByXpath("//input[@name='document.documentHeader.documentDescription']");
3827            assertElementPresentByXpath("//input[@name='document.documentHeader.organizationDocumentNumber']");
3828            assertElementPresentByXpath("//textarea[@name='document.documentHeader.explanation']");
3829            passed();
3830        }
3831    
3832        protected void testVerifyExpandCollapse() throws Exception {
3833            selectFrameIframePortlet();
3834            assertElementPresentByXpath("//button[contains(@class, 'uif-expandDisclosuresButton')]");
3835            assertElementPresentByXpath("//button[contains(@class, 'uif-collapseDisclosuresButton')]");
3836            passed();
3837        }
3838    
3839        protected void testVerifyFieldsLegacy() throws Exception {
3840            selectFrameIframePortlet();
3841            assertElementPresentByXpath("//input[@name='document.newMaintainableObject.dataObject.number' and @type='text' and @size=10 and @maxlength=10]");
3842            assertElementPresentByXpath("//input[@name='document.newMaintainableObject.dataObject.extension.accountTypeCode' and @type='text' and @size=2 and @maxlength=3]");
3843            assertElementPresentByXpath(
3844                    "//input[@name='document.newMaintainableObject.dataObject.subAccount' and @type='text' and @size=10 and @maxlength=10]");
3845            assertElementPresentByXpath("//input[@name='document.newMaintainableObject.dataObject.subsidizedPercent' and @type='text' and @size=6 and @maxlength=20]");
3846            assertElementPresentByXpath(
3847                    "//input[@name='document.newMaintainableObject.dataObject.foId' and @type='text' and @size=5 and @maxlength=10]");
3848            assertElementPresentByXpath(
3849                    "//input[@name=\"newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].number\" and @type='text' and @size=10 and @maxlength=10]");
3850            assertElementPresentByXpath(
3851                    "//input[@name=\"newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].foId\" and @type='text' and @size=5 and @maxlength=10]");
3852            passed();
3853        }
3854    
3855        protected void testVerifyHeaderFieldsLegacy() throws Exception {
3856            selectFrameIframePortlet();
3857            assertElementPresentByXpath("//div[contains(@class, 'uif-documentNumber')]");
3858            assertElementPresentByXpath("//div[contains(@class, 'uif-documentInitiatorNetworkId')]");
3859            assertElementPresentByXpath("//div[contains(@class, 'uif-documentStatus')]");
3860            assertElementPresentByXpath("//div[contains(@class, 'uif-documentCreateDate')]");
3861            passed();
3862        }
3863    
3864        protected void testVerifyLookupAddMultipleLinesLegacy() throws Exception {
3865            selectFrameIframePortlet();
3866            assertElementPresentByXpath("//a[contains(text(),'Lookup/Add Multiple Lines')]");
3867            passed();
3868        }
3869    
3870        protected void testVerifyNotesAndAttachments() throws Exception {
3871            selectFrameIframePortlet();
3872            waitAndClickByXpath("//span[contains(text(),'Notes and Attachments')]");
3873            waitForElementPresentByXpath("//button[@title='Add a Note']");
3874            assertElementPresentByXpath("//span[contains(text(),'Notes and Attachments')]");
3875            assertElementPresentByXpath("//textarea[@name=\"newCollectionLines['document.notes'].noteText\"]");
3876            assertElementPresentByXpath("//input[@name='attachmentFile']");
3877    
3878            //assertElementPresentByXpath("//input[@name=\"newCollectionLines['document.notes'].attachment.attachmentTypeCode\"]");
3879            passed();
3880        }
3881    
3882        protected void testVerifyQuickfinderIconsLegacy() throws Exception {
3883            selectFrameIframePortlet();
3884            assertTextPresent("Document Overview");
3885            assertElementPresentByXpath("//*[@id='quickfinder1']");
3886            assertElementPresentByXpath("//*[@id='quickfinder2']");
3887            assertElementPresentByXpath("//*[@id='quickfinder3']");
3888            assertElementPresentByXpath("//*[@id='quickfinder4_add']");
3889    
3890            // TODO it would be better to test that the image isn't 404
3891            passed();
3892        }
3893    
3894        protected void testVerifyRouteLog() throws Exception {
3895            selectFrameIframePortlet();
3896            waitAndClickByLinkText("Route Log");
3897            waitForElementPresent("//iframe[contains(@src,'RouteLog.do')]");
3898            passed();
3899        }
3900    
3901        protected void testVerifySave() throws Exception {
3902            selectFrameIframePortlet();
3903            waitAndTypeByName("document.documentHeader.documentDescription", "Test Document " + ITUtil.DTS);
3904            waitAndClickByName("document.newMaintainableObject.dataObject.number");
3905            waitAndTypeByName("document.newMaintainableObject.dataObject.number", "1234567890");
3906            waitAndTypeByName("document.newMaintainableObject.dataObject.extension.accountTypeCode", "EAT");
3907            waitAndTypeByName("document.newMaintainableObject.dataObject.subAccount", "a1");
3908            waitAndClick(
3909                    "button[data-loadingmessage='Saving...'].uif-action.uif-primaryActionButton.uif-boxLayoutHorizontalItem");
3910            Thread.sleep(2000);
3911    
3912            // checkErrorMessageItem(" also digit validation jira https://jira.kuali.org/browse/KULRICE-8038");
3913            passed();
3914        }
3915    
3916        protected void testVerifySubsidizedPercentWatermarkLegacy() throws Exception {
3917            selectFrameIframePortlet();
3918    
3919            // May be blowing up due to multiple locators
3920            //assertTrue(isElementPresent("//input[@name='document.newMaintainableObject.dataObject.subsidizedPercent' and @type='text' and @placeholder='##.##   ']"));
3921            assertElementPresentByXpath("//input[@name='document.newMaintainableObject.dataObject.subsidizedPercent']");
3922            passed();
3923        }
3924    
3925        protected void testWorkFlowDocTypeBlanketApprove() throws Exception {
3926            selectFrameIframePortlet();
3927            waitAndCreateNew();
3928            String docId = waitForDocId();
3929            assertBlanketApproveButtonsPresent();
3930            waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Document Type " + ITUtil.DTS);
3931            String parentDocType = "//input[@name='methodToCall.performLookup.(!!org.kuali.rice.kew.doctype.bo.DocumentType!!).(((name:document.newMaintainableObject.parentDocType.name,documentTypeId:document.newMaintainableObject.docTypeParentId,))).((`document.newMaintainableObject.parentDocType.name:name,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;"
3932                    + getBaseUrlString() + "/kr/lookup.do;::::).anchor4']";
3933            waitAndClickByXpath(parentDocType);
3934            waitAndClickSearch();
3935            waitAndClickReturnValue();
3936            String docTypeName = "DocType" + ITUtil.DTS;
3937            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", docTypeName);
3938            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.unresolvedDocHandlerUrl']",
3939                    "${kr.url}/maintenance.do?methodToCall=docHandler");
3940            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.label']",
3941                    "Workflow Maintenance Document Type Document");
3942            waitAndTypeByXpath("//input[@id='document.newMaintainableObject.unresolvedHelpDefinitionUrl']",
3943                    "default.htm?turl=WordDocuments%2Fdocumenttype.htm");
3944            blanketApproveTest();
3945            assertDocFinal(docId);
3946        }
3947    
3948        protected void uncheck(By by) throws InterruptedException {
3949            WebElement element = driver.findElement(by);
3950            if (element.isSelected()) {
3951                element.click();
3952            }
3953        }
3954    
3955        protected void uncheckByName(String name) throws InterruptedException {
3956            uncheck(By.name(name));
3957        }
3958    
3959        protected void uncheckByXpath(String locator) throws InterruptedException {
3960            uncheck(By.xpath(locator));
3961        }
3962    
3963        protected boolean validateErrorImage(boolean validateVisible) throws Exception {
3964            Thread.sleep(500);
3965            boolean valid = false;
3966    
3967            for (int second = 0; second < 5; second++) {
3968                if ((valid = validateErrorImage(validateVisible, second, ARIA_INVALID_XPATH)) == true) {
3969                    break;
3970                }
3971            }
3972    
3973            if (validateVisible) {
3974                SeleneseTestBase.assertTrue("valid = " + valid + " when validateVisible is " + validateVisible, valid);
3975            } else {
3976                SeleneseTestBase.assertFalse("valid = " + valid + " when validateVisible is " + validateVisible, valid);
3977            }
3978    
3979            return valid;
3980        }
3981    
3982        private boolean validateErrorImage(boolean validateVisible, int second, String xpath) throws InterruptedException {
3983            try {
3984                if (validateVisible) {
3985                    if (isElementPresentByXpath(xpath) && isVisibleByXpath(xpath)) {
3986                        return true;
3987                    }
3988                } else {
3989                    if (!isElementPresentByXpath(xpath) || !isVisibleByXpath(xpath)) {
3990                        return true;
3991                    }
3992                }
3993            } catch (Exception e) {
3994                // don't fail here, we're in a loop let the caller decide when to fail
3995            }
3996            Thread.sleep(1000);
3997            return false;
3998        }
3999    
4000        protected void verifyRichMessagesValidationBasicFunctionality() throws Exception
4001        {
4002            SeleneseTestBase.assertTrue(isElementPresentByXpath("//input[@type='text' and @name='field1']"));
4003            SeleneseTestBase.assertTrue(isElementPresentByXpath("//a[contains(text(), 'Kuali')]"));
4004            SeleneseTestBase.assertTrue(isElementPresentByXpath("//input[@type='checkbox' and @name='field2']"));
4005            Thread.sleep(3000);
4006        }
4007    
4008        protected void verifyRichMessagesValidationAdvancedFunctionality() throws Exception
4009        {
4010            //Color Options
4011            SeleneseTestBase.assertTrue(isElementPresentByXpath("//span[@style='color: green;']"));
4012            SeleneseTestBase.assertTrue(isElementPresentByXpath("//span[@style='color: blue;']"));
4013    
4014            //Css class
4015            SeleneseTestBase.assertTrue(isElementPresentByXpath("//span[@class='fl-text-underline fl-text-larger']"));
4016    
4017            //Combinations
4018            SeleneseTestBase.assertTrue(isElementPresentByXpath("//input[@type='text' and @name='field3']"));
4019            SeleneseTestBase.assertTrue(isElementPresentByXpath("//select[@name='field4']"));
4020            SeleneseTestBase.assertTrue(isElementPresentByXpath("//button[contains(text(), 'Action Button')]"));
4021    
4022            //Rich Message Field
4023            SeleneseTestBase.assertTrue(isElementPresentByXpath("//label[contains(., 'Label With')]/span[contains(., 'Color')]"));
4024            SeleneseTestBase.assertTrue(isElementPresentByXpath("//label[contains(., 'Label With')]/i/b[contains(., 'Html')]"));
4025            SeleneseTestBase.assertTrue(isElementPresentByXpath("//label[contains(., 'Label With')]/img[@class='uif-image inlineBlock']"));
4026            Thread.sleep(3000);
4027        }
4028    
4029        protected void verifyRichMessagesValidationLettersNumbersValidation() throws Exception
4030        {
4031            //For letters only Validation
4032            SeleneseTestBase.assertTrue(isElementPresentByXpath("//input[@type='text' and @name='field5']"));
4033            waitAndTypeByXpath(
4034                    "//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock']/input[@name= 'field5']",
4035                    "abc");
4036            SeleneseTestBase.assertFalse(isElementPresentByXpath("//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock uif-hasError']"));
4037            clearTextByXpath(
4038                    "//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock']/input[@name= 'field5']");
4039            waitAndTypeByXpath("//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock']/input[@name= 'field5']","abc12");
4040            waitAndTypeByXpath("//input[@name= 'field6']", "");
4041            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock uif-hasError']"));
4042            Thread.sleep(3000);
4043            clearTextByXpath("//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock uif-hasError']/input[@name= 'field5']");
4044            waitAndTypeByXpath("//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock uif-hasError']/input[@name= 'field5']","abc");
4045            waitAndTypeByXpath("//input[@name= 'field6']", "");
4046    
4047            //For numbers only validation
4048            waitAndTypeByXpath("//input[@name= 'field6']", "123");
4049            SeleneseTestBase.assertFalse(isElementPresentByXpath("//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock uif-hasError']"));
4050            clearTextByXpath("//input[@name= 'field6']");
4051            waitAndTypeByXpath("//input[@name= 'field6']", "123ab");
4052            fireEvent("field6", "blur");
4053            Thread.sleep(5000);
4054            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock uif-hasError']"));
4055            Thread.sleep(3000);
4056        }
4057    
4058        protected void verifyRichMessagesValidationRadioAndCheckBoxGroupFunctionality() throws Exception
4059        {
4060            //Radio Group
4061            SeleneseTestBase.assertTrue(isElementPresentByXpath("//fieldset[@class='uif-verticalRadioFieldset']/span/input[@type='radio' and @name='field24' and @value='1']"));
4062            SeleneseTestBase.assertTrue(isElementPresentByXpath(
4063                    "//fieldset[@class='uif-verticalRadioFieldset']/span/input[@type='radio' and @name='field24' and @value='2']"));
4064            SeleneseTestBase.assertTrue(isElementPresentByXpath(
4065                    "//fieldset[@class='uif-verticalRadioFieldset']/span/input[@type='radio' and @name='field24' and @value='3']"));
4066            SeleneseTestBase.assertTrue(isElementPresentByXpath(
4067                    "//fieldset[@class='uif-verticalRadioFieldset']/span/input[@type='radio' and @name='field24' and @value='4']"));
4068    
4069            //Checkbox Group
4070            SeleneseTestBase.assertTrue(isElementPresentByXpath(
4071                    "//fieldset[@class='uif-verticalCheckboxesFieldset']/span/input[@type='checkbox' and @name='field115' and @value='1']"));
4072            SeleneseTestBase.assertTrue(isElementPresentByXpath("//fieldset[@class='uif-verticalCheckboxesFieldset']/span/input[@type='checkbox' and @name='field115' and @value='2']"));
4073            SeleneseTestBase.assertTrue(isElementPresentByXpath(
4074                    "//fieldset[@class='uif-verticalCheckboxesFieldset']/span/input[@type='checkbox' and @name='field115' and @value='3']"));
4075            SeleneseTestBase.assertTrue(isElementPresentByXpath(
4076                    "//fieldset[@class='uif-verticalCheckboxesFieldset']/span/label/div/select[@name='field4']"));
4077    
4078            //Checkbox Control
4079            SeleneseTestBase.assertTrue(isElementPresentByXpath("//input[@type='checkbox' and @name='bField1']"));
4080            SeleneseTestBase.assertTrue(isElementPresentByXpath("//input[@type='text' and @name='field103']"));
4081        }
4082    
4083        protected void verifyRichMessagesValidationLinkDeclarationsFunctionality() throws Exception
4084        {
4085            //Testing link tag
4086            waitAndClickByXpath("//div[contains(., 'Testing link tag')]/a");
4087            Thread.sleep(9000);
4088            switchToWindow("Open Source Software | www.kuali.org");
4089            switchToWindow(RICH_MESSAGES_WINDOW_TITLE);
4090    
4091            //Testing methodToCall Action
4092            waitAndClickByXpath("//div[contains(., 'Testing methodToCall action')]/a");
4093            Thread.sleep(3000);
4094            SeleneseTestBase.assertTrue(isElementPresentByXpath(
4095                    "//div[@class='uif-validationMessages uif-groupValidationMessages uif-pageValidationMessages uif-pageValidationMessages-error']"));
4096            SeleneseTestBase.assertTrue(isElementPresentByXpath(
4097                    "//div[@id='Demo-AdvancedMessagesSection']/div[@class='uif-validationMessages uif-groupValidationMessages uif-pageValidationMessages-error']"));
4098            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@id='Demo-RadioCheckboxMessageSection']/div[@class='uif-validationMessages uif-groupValidationMessages uif-pageValidationMessages-error']"));
4099    
4100            //Testing methodToCall action (no client validation check)
4101            waitAndClickByXpath("//div[contains(., 'Testing methodToCall action (no client validation check)')]/a");
4102            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@class='uif-validationMessages uif-groupValidationMessages uif-pageValidationMessages uif-pageValidationMessages-error']"));
4103            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@class='uif-validationMessages uif-groupValidationMessages']"));
4104            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@class='uif-validationMessages uif-groupValidationMessages uif-pageValidationMessages uif-pageValidationMessages-error']"));
4105            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@id='Demo-AdvancedMessagesSection']/div[@class='uif-validationMessages uif-groupValidationMessages uif-pageValidationMessages-error']"));
4106            SeleneseTestBase.assertTrue(isElementPresentByXpath("//div[@id='Demo-RadioCheckboxMessageSection']/div[@class='uif-validationMessages uif-groupValidationMessages uif-pageValidationMessages-error']"));
4107            Thread.sleep(3000);
4108        }
4109    
4110        /**
4111         * {@link #ADMINISTRATION_LINK_TEXT}
4112         * @param failable
4113         * @throws InterruptedException
4114         */
4115        protected void waitAndClickAdministration(Failable failable) throws InterruptedException {
4116            waitAndClickByLinkText(ADMINISTRATION_LINK_TEXT, failable);
4117        }
4118    
4119        protected void waitAndCancelConfirmation() throws InterruptedException {
4120            waitAndClickCancel();
4121            waitAndClickByName("methodToCall.processAnswer.button0");
4122        }
4123    
4124        protected void waitAndClick(By by) throws InterruptedException {
4125            jiraAwareWaitAndClick(by, "");
4126        }
4127    
4128        protected void waitAndClick(By by, Failable failable) throws InterruptedException {
4129            jiraAwareWaitAndClick(by, "", failable);
4130        }
4131    
4132        protected void waitAndClick(String locator, String message) throws InterruptedException {
4133            jiraAwareWaitAndClick(By.cssSelector(locator), message);
4134        }
4135    
4136        protected void waitAndClickById(String id) throws InterruptedException {
4137            jiraAwareWaitAndClick(By.id(id), "");
4138        }
4139        protected void waitAndClickById(String id, String message) throws InterruptedException {
4140            jiraAwareWaitAndClick(By.id(id), message);
4141        }
4142    
4143        protected void waitAndClickButtonByText(String buttonText) throws InterruptedException {
4144            waitAndClickByXpath("//button[contains(text(), '" + buttonText + "')]");
4145        }
4146    
4147        protected void waitAndClickByLinkText(String text) throws InterruptedException {
4148            jiraAwareWaitAndClick(By.linkText(text), "");
4149        }
4150    
4151        protected void waitAndClickByLinkText(String text, String message) throws InterruptedException {
4152            jiraAwareWaitAndClick(By.linkText(text), message);
4153        }
4154    
4155        protected void waitAndClickByLinkText(String text, Failable failable) throws InterruptedException {
4156            jiraAwareWaitAndClick(By.linkText(text), "", failable);
4157        }
4158    
4159        protected void waitAndClickByLinkText(String text, String message, Failable failable) throws InterruptedException {
4160            jiraAwareWaitAndClick(By.linkText(text), message, failable);
4161        }
4162    
4163        protected void waitAndClickByName(String name) throws InterruptedException {
4164            jiraAwareWaitAndClick(By.name(name), "");
4165        }
4166    
4167        protected void waitAndClickByXpath(String xpath) throws InterruptedException {
4168            waitAndClick(By.xpath(xpath));
4169        }
4170    
4171        protected void waitAndClickByXpath(String xpath, Failable failable) throws InterruptedException {
4172            waitAndClick(By.xpath(xpath), failable);
4173        }
4174    
4175        protected void waitAndClickByName(String name, String message) throws InterruptedException {
4176            jiraAwareWaitAndClick(By.name(name), message);
4177        }
4178    
4179        protected void waitAndClickByXpath(String xpath, String message) throws InterruptedException {
4180            jiraAwareWaitAndClick(By.xpath(xpath), message);
4181        }
4182    
4183        /**
4184         * {@link #CANCEL_NAME}
4185         * @throws InterruptedException
4186         */
4187        protected void waitAndClickCancel() throws InterruptedException {
4188            waitAndClickByName(CANCEL_NAME);
4189        }
4190    
4191        /**
4192         * {@link #CLOSE_WINDOW_XPATH_TITLE}
4193         * @throws InterruptedException
4194         */
4195        protected void waitAndClickCloseWindow() throws InterruptedException {
4196            waitAndClickByXpath(CLOSE_WINDOW_XPATH_TITLE);
4197        }
4198    
4199        /**
4200         * {@link #COPY_LINK_TEXT}
4201         * @throws InterruptedException
4202         */
4203        protected void waitAndClickCopy() throws InterruptedException {
4204            waitAndClickByLinkText(COPY_LINK_TEXT);
4205        }
4206    
4207        /**
4208         * {}@link #DOC_SEARCH_XPATH}
4209         * @throws InterruptedException
4210         */
4211        protected void waitAndClickDocSearch() throws InterruptedException {
4212            waitAndClickByXpath(DOC_SEARCH_XPATH);
4213        }
4214    
4215        /**
4216         * {@link #DOC_SEARCH_XPATH_TITLE}
4217         * @throws InterruptedException
4218         */
4219        protected void waitAndClickDocSearchTitle() throws InterruptedException {
4220            waitAndClickByXpath(DOC_SEARCH_XPATH_TITLE);
4221        }
4222    
4223        /**
4224         * {@link #LOGOUT_XPATH}
4225         * @throws InterruptedException
4226         */
4227        protected void waitAndClickLogout() throws InterruptedException {
4228            waitAndClickByXpath(LOGOUT_XPATH, this);
4229        }
4230    
4231        /**
4232         * {@link #LOGOUT_XPATH}
4233         * @param failable
4234         * @throws InterruptedException
4235         */
4236        protected void waitAndClickLogout(Failable failable) throws InterruptedException {
4237            waitAndClickByXpath(LOGOUT_XPATH, failable);
4238        }
4239    
4240        /**
4241         * {}@link #MAIN_MENU_LINK_TEXT}
4242         * @param failable
4243         * @throws InterruptedException
4244         */
4245        protected void waitAndClickMainMenu(Failable failable) throws InterruptedException {
4246            waitAndClickByLinkText(MAIN_MENU_LINK_TEXT, failable);
4247        }
4248    
4249        /**
4250         * {@link #SAVE_XPATH}
4251         * @throws InterruptedException
4252         */
4253        protected void waitAndClickSave() throws InterruptedException {
4254            waitAndClickByXpath(SAVE_XPATH);
4255        }
4256    
4257        /**
4258         * {@link #SEARCH_XPATH}
4259         * @throws InterruptedException
4260         */
4261        private void waitAndClickSearch() throws InterruptedException {
4262            waitAndClickByXpath(SEARCH_XPATH);
4263        }
4264    
4265        /**
4266         * {@link #SUBMIT_XPATH}
4267         * @throws InterruptedException
4268         */
4269        protected void waitAndClickSubmit() throws InterruptedException {
4270            waitAndClickByXpath(SUBMIT_XPATH);
4271        }
4272    
4273    
4274        /**
4275         * {@link #XML_INGESTER_LINK_TEXT}
4276         * @param failable
4277         * @throws InterruptedException
4278         */
4279        protected void waitAndClickXMLIngester(Failable failable) throws InterruptedException {
4280            waitAndClickByLinkText(XML_INGESTER_LINK_TEXT, failable);
4281        }
4282    
4283        protected void waitAndType(By by, String text) throws InterruptedException {
4284            waitAndType(by, text,  "");
4285        }
4286    
4287        protected void waitAndType(By by, String text, String message) throws InterruptedException {
4288            try {
4289                jiraAwareWaitFor(by, "");
4290                (driver.findElement(by)).sendKeys(text);
4291            } catch (Exception e) {
4292                JiraAwareFailureUtil.failOnMatchedJira(by.toString(), this);
4293                failableFail(e.getMessage() + " " + by.toString() + "  unable to type text '" + text + "'  " + message
4294                        + " current url " + driver.getCurrentUrl()
4295                        + "\n" + ITUtil.deLinespace(driver.getPageSource()));
4296            }
4297        }
4298    
4299        protected void waitAndType(String selector, String text) throws InterruptedException {
4300            waitAndType(By.cssSelector(selector), text);
4301        }
4302    
4303        protected void waitAndTypeByXpath(String locator, String text) throws InterruptedException {
4304            waitAndType(By.xpath(locator), text);
4305        }
4306    
4307        protected void waitAndTypeByXpath(String locator, String text, String message) throws InterruptedException {
4308            waitAndType(By.xpath(locator), text, message);
4309        }
4310    
4311        protected void waitAndTypeByName(String name, String text) throws InterruptedException {
4312            waitAndType(By.name(name), text);
4313        }
4314    
4315        protected void waitAndCreateNew() throws InterruptedException {
4316            selectFrameIframePortlet();
4317            try {
4318                jGrowl("Create New");
4319                waitAndClickCreateNew(); // timing out in CI rice-trunk-smoke-test-jdk7/494
4320            } catch (Exception e) {
4321                System.out.println("waitAndClickByXpath(\"//img[@alt='create new']\") failed trying title method with " + e.getMessage());
4322                waitAndClickByXpath("//a[@title='Create a new record']");
4323            }
4324        }
4325    
4326        /**
4327         * {@link #CREATE_NEW_XPATH}
4328         * @throws InterruptedException
4329         */
4330        protected void waitAndClickCreateNew() throws InterruptedException {
4331            waitAndClickByXpath(CREATE_NEW_XPATH);
4332        }
4333    
4334        protected void waitAndClickEdit() throws InterruptedException {
4335            waitAndClickByLinkText(EDIT_LINK_TEXT);
4336        }
4337    
4338        protected void waitAndClickReturnValue() throws InterruptedException {
4339            waitAndClickByLinkText(RETURN_VALUE_LINK_TEXT);
4340        }
4341    
4342        protected void waitAndClickSearch2() throws InterruptedException {
4343            waitAndClickByXpath(SEARCH_XPATH_2);
4344        }
4345    
4346        protected void waitAndClickSearch3() throws InterruptedException {
4347            waitAndClickByXpath(SEARCH_XPATH_3);
4348        }
4349    
4350        protected String waitForDocId() throws InterruptedException {
4351            waitForElementPresentByXpath(DOC_ID_XPATH);
4352    
4353            return driver.findElement(By.xpath(DOC_ID_XPATH)).getText();
4354        }
4355    
4356        protected void waitForElementPresent(By by) throws InterruptedException {
4357            jiraAwareWaitFor(by, "");
4358        }
4359    
4360        protected void waitForElementPresent(String locator) throws InterruptedException {
4361            jiraAwareWaitFor(By.cssSelector(locator), "");
4362        }
4363    
4364        protected void waitForElementPresentByClassName(String name) throws InterruptedException {
4365            jiraAwareWaitFor(By.className(name), "");
4366        }
4367    
4368        protected void waitForElementPresentByClassName(String name, String message) throws InterruptedException {
4369            jiraAwareWaitFor(By.className(name), message);
4370        }
4371    
4372        protected void waitForElementPresentById(String id) throws InterruptedException {
4373            jiraAwareWaitFor(By.id(id), "");
4374        }
4375    
4376        protected void waitForElementPresentByName(String name) throws InterruptedException {
4377            jiraAwareWaitFor(By.name(name), "");
4378        }
4379    
4380        protected void waitForElementPresentByXpath(String locator) throws InterruptedException {
4381            jiraAwareWaitFor(By.xpath(locator), "");
4382        }
4383    
4384        protected void waitForTitleToEqualKualiPortalIndex() throws InterruptedException {
4385            waitForTitleToEqualKualiPortalIndex("");
4386        }
4387    
4388        protected void waitIsVisible(By by) throws InterruptedException {
4389            for (int second = 0;; second++) {
4390                if (second >= waitSeconds) {
4391                    failableFail(TIMEOUT_MESSAGE + " " + by.toString());
4392                }
4393                if (isVisible(by)) {
4394                    break;
4395                }
4396                Thread.sleep(1000);
4397            }
4398        }
4399    
4400        protected void waitIsVisible(By by, String message) throws InterruptedException {
4401            for (int second = 0;; second++) {
4402                if (second >= waitSeconds) {
4403                    failableFail(TIMEOUT_MESSAGE + " " + by.toString() + " " + message);
4404                }
4405                if (isVisible(by)) {
4406                    break;
4407                }
4408                Thread.sleep(1000);
4409            }
4410        }
4411    
4412        protected boolean waitAreAnyVisible(By[] bys) throws InterruptedException {
4413            if (bys == null || bys.length == 0 ) {
4414                return false;
4415            }
4416    
4417            for (int second = 0; second < waitSeconds; second++) {
4418    
4419                if (isVisible(bys)) {
4420                    return true;
4421                }
4422    
4423                Thread.sleep(1000);
4424            }
4425    
4426            return false;
4427        }
4428    
4429        protected boolean isVisible(By[] bys) {
4430            if (bys == null || bys.length == 0 ) {
4431                return false;
4432            }
4433    
4434            for (int i = 0, s = bys.length; i < s; i++) {
4435    
4436                try {
4437    
4438                    if (isVisible(bys[i])) {
4439                        return true;
4440                    }
4441    
4442                } catch (NoSuchElementException nsee) {
4443                    // don't fail
4444                }
4445    
4446            }
4447    
4448            return false;
4449        }
4450    
4451        /**
4452         * Uses Selenium's findElements method which does not throw a test exception if not found.
4453         * @param elementLocator
4454         * @param message
4455         * @throws InterruptedException
4456         */
4457        protected void waitForElementVisible(String elementLocator, String message) throws InterruptedException {
4458            boolean failed = false;
4459    
4460            for (int second = 0;; second++) {
4461                if (second >= waitSeconds)
4462                    failed = true;
4463                try {
4464                    if (failed || (driver.findElements(By.cssSelector(elementLocator))).size() > 0)
4465                        break;
4466                } catch (Exception e) {}
4467                Thread.sleep(1000);
4468            }
4469    
4470            checkForIncidentReport(elementLocator); // after timeout to be sure page is loaded
4471    
4472            if (failed)
4473                failableFail("timeout of " + waitSeconds + " seconds waiting for " + elementLocator + " " + message + " " + driver.getCurrentUrl());
4474        }
4475    
4476        protected void waitIsVisible(String locator) throws InterruptedException {
4477            waitIsVisible(By.cssSelector(locator));
4478        }
4479    
4480        protected void waitIsVisibleByXpath(String locator) throws InterruptedException {
4481            waitIsVisible(By.xpath(locator));
4482        }
4483    
4484        protected void waitIsVisibleByXpath(String locator, String message) throws InterruptedException {
4485            waitIsVisible(By.xpath(locator), message);
4486        }
4487    
4488        protected void waitForTitleToEqualKualiPortalIndex(String message) throws InterruptedException {
4489            Thread.sleep(2000);
4490            // This started failing in CI....
4491            // boolean failed = false;
4492            //
4493            // for (int second = 0;; second++) {
4494            //     Thread.sleep(1000);
4495            //     if (second >= waitSeconds) failed = true;
4496            //     try { if (failed || ITUtil.KUALI_PORTAL_TITLE.equals(driver.getTitle())) break; } catch (Exception e) {}
4497            // }
4498    
4499            // WebDriverUtil.checkForIncidentReport(driver, message); // after timeout to be sure page is loaded
4500            // if (failed) failableFail("timeout of " + waitSeconds + " seconds " + message);
4501        }
4502    
4503        protected void waitAndClick(String locator) throws InterruptedException {
4504            waitAndClick(locator, "");
4505        }
4506    
4507        protected void waitForPageToLoad() {
4508            // noop webdriver doesn't it need it, except when it does...
4509        }
4510    
4511        protected void waitFor(By by) throws InterruptedException {
4512            jiraAwareWaitFor(by, "");
4513        }
4514    
4515        /**
4516         * Should be called from jiraAwareWaitFor to get KULRICE error output in CI.
4517         *
4518         * Inner most waitFor, let it throw the failure so the timeout message reflects the waitSeconds time, not the 1
4519         * second it is set to before returning.
4520         * @param by
4521         * @param message
4522         * @throws InterruptedException
4523         */
4524        protected void waitFor(By by, String message) throws InterruptedException {
4525            WebDriverUtil.waitFor(this.driver, this.waitSeconds, by, message);
4526        }
4527    
4528        /**
4529         * {@link #KRAD_XPATH}
4530         * @throws InterruptedException
4531         */
4532        protected void waitAndClickKRAD() throws InterruptedException {
4533            waitAndClickByLinkText(KRAD_XPATH);
4534        }
4535    
4536        protected void waitNotVisible(By by) throws InterruptedException {
4537            for (int second = 0;; second++) {
4538                if (second >= waitSeconds) {
4539                    failableFail(TIMEOUT_MESSAGE);
4540                }
4541                if (!isVisible(by)) {
4542                    break;
4543                }
4544                Thread.sleep(1000);
4545            }
4546        }
4547    
4548        protected void waitNotVisibleByXpath(String locator) throws InterruptedException {
4549            waitNotVisible(By.xpath(locator));
4550        }
4551    
4552        /**
4553         * Use the KRAD Login Screen or the old KNS Login Screen
4554         */
4555        protected boolean isKradLogin(){
4556            // check system property, default to KRAD
4557            String loginUif = System.getProperty(REMOTE_LOGIN_UIF);
4558            if (loginUif == null) {
4559                loginUif = ITUtil.REMOTE_UIF_KRAD;
4560            }
4561    
4562            return (ITUtil.REMOTE_UIF_KRAD.equalsIgnoreCase(loginUif));
4563        }
4564    
4565        /**
4566         * Does the test page use KRAD UIF?
4567         * Useful if trying to re-use a test for both a KNS and KRAD screens that have different paths to the elements.
4568         * @return
4569         */
4570        protected boolean isKrad(){
4571            return (ITUtil.REMOTE_UIF_KRAD.equalsIgnoreCase(getUiFramework()));
4572        }
4573    
4574        protected WebElement getElementByDataAttributeValue(String dataAttributeName, String value){
4575            return driver.findElement(By.cssSelector("[data-" + dataAttributeName + "='" + value +"']"));
4576        }
4577    
4578        protected WebElement getElementByDataAttribute(String dataAttributeName){
4579            return driver.findElement(By.cssSelector("[data-" + dataAttributeName + "]"));
4580        }
4581    
4582        protected WebElement getElementByAttributeValue(String attributeName, String value){
4583            return driver.findElement(By.cssSelector("[" + attributeName + "='" + value +"']"));
4584        }
4585    
4586        protected WebElement getElementByAttribute(String attributeName){
4587            return driver.findElement(By.cssSelector("[" + attributeName + "]"));
4588        }
4589    
4590        /**
4591         * Determines whether KRAD or KNS UIF is used for this test.
4592         * Useful if trying to re-use a test for both a KNS and KRAD screens that have different paths to the elements.
4593         * @return
4594         */
4595        public String getUiFramework() {
4596            return uiFramework;
4597        }
4598    
4599        /**
4600         * Sets which UIF is used by this test
4601         */
4602        public void setUiFramework(String uiFramework) {
4603            this.uiFramework = uiFramework;
4604        }
4605    }