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