View Javadoc

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