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