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