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