001/** 002 * Copyright 2005-2016 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 */ 016package org.kuali.rice.testtools.selenium; 017 018import org.openqa.selenium.Keys; 019 020import org.apache.commons.lang.RandomStringUtils; 021import org.junit.Before; 022import org.kuali.rice.testtools.common.JiraAwareFailable; 023import org.kuali.rice.testtools.common.JiraAwareFailureUtils; 024import org.kuali.rice.testtools.common.PropertiesUtils; 025import org.openqa.selenium.By; 026import org.openqa.selenium.WebElement; 027 028import java.io.IOException; 029import java.text.SimpleDateFormat; 030import java.util.ArrayList; 031import java.util.Calendar; 032import java.util.HashMap; 033import java.util.List; 034import java.util.Map; 035import java.util.concurrent.TimeUnit; 036 037/** 038 * <p> 039 * Old rice sampleapp AFT code. New KRAD AFT code should go in WebDriverAftBase (or maybe KradAftBase in the future). 040 * </p> 041 * <p> 042 * Originally used to upgrade UpgradedSeleniumITBase (Selenium 1.0) tests to WebDriver (Selenium 2.0). Now there is 043 * refactoring to be done: 044 * <ol> 045 * <li><a href="https://jira.kuali.org/browse/KULRICE-9206">KULRICE-9206</a> Replace literal strings used more than 3 times with Constants, 046 * Javadoc constant with constant value. 047 * <li>Extract duplicate waitAndClick...(CONSTANT) to waitAndClickConstant, Javadoc a <pre>{@link #CONSTANT}</pre>. 048 * <li>Replace large chunks of duplication</li> 049 * <li><a href="https://jira.kuali.org/browse/KULRICE-9205">KULRICE-9205</a> Invert dependencies on fields and extract methods to WebDriverUtils 050 * so inheritance doesn't have to be used for reuse. See WebDriverUtils.waitFor </li> 051 * <li>Extract Nav specific code?</li> 052 * <li>Rename to SampleAppAftBase</li> 053 * </ol> 054 * </p> 055 * <p>Calls to passed() probably don't belong in the methods reused here.</p> 056 * @author Kuali Rice Team (rice.collab@kuali.org) 057 * @deprecated only rice sampleapp specific code should go in this class, see WebDriverAftBase. 058 */ 059public abstract class WebDriverLegacyITBase extends WebDriverAftBase { 060 061 /** 062 * Administration 063 */ 064 public static final String ADMINISTRATION_LINK_TEXT = "Administration"; 065 066 /** 067 * Agenda Lookup 068 */ 069 public static final String AGENDA_LOOKUP_LINK_TEXT = "Agenda Lookup"; 070 071 /** 072 * backdoorId 073 */ 074 public static final String BACKDOOR_ID_TEXT = "backdoorId"; 075 076 /** 077 * "//input[@title='Click to login.']" 078 */ 079 public static final String BACKDOOR_LOGIN_BUTTON_XPATH = "//input[@title='Click to login.']"; 080 081 /** 082 * methodToCall.blanketApprove 083 */ 084 public static final String BLANKET_APPROVE_NAME = "methodToCall.blanketApprove"; 085 086 /** 087 * methodToCall.cancel 088 * different cancel than CANCEL2_XPATH 089 */ 090 public static final String CANCEL_NAME = "methodToCall.cancel"; 091 092 /** 093 * //a[contains(text(), 'ancel')] 094 * Different cancel than CANCEL_NAME 095 */ 096 public static final String CANCEL2_XPATH = "//a[contains(text(), 'ancel')]"; 097 098 /** 099 * "//a[@title='cancel']" 100 */ 101 public static final String CANCEL3_XPATH = "//a[@title='cancel']"; 102 103 /** 104 * //*[@title='close this window'] 105 */ 106 public static final String CLOSE_WINDOW_XPATH_TITLE = "//*[@title='close this window']"; 107 108 /** 109 * Collections 110 */ 111 public static final String COLLECTIONS_LINK_TEXT = "Collections"; 112 113 /** 114 * "Kuali :: Configuration Test View" 115 */ 116 public static final String CONFIGURATION_VIEW_WINDOW_TITLE = "Kuali :: Configuration Test View"; 117 118 /** 119 * (//a[contains(text(),'Configuration Test View')])[3] 120 */ 121 public static final String CONFIGURATION_VIEW_XPATH = "(//a[contains(text(),'Configuration Test View')])"; 122 123 /** 124 * copy 125 */ 126 public static final String COPY_LINK_TEXT = "copy"; 127 128 /** 129 * New Document not submitted successfully 130 */ 131 public static final String CREATE_NEW_DOCUMENT_NOT_SUBMITTED_SUCCESSFULLY_MESSAGE_TEXT = "New Document not submitted successfully"; 132 133 /** 134 * //img[@alt='create new'] 135 */ 136 public static final String CREATE_NEW_XPATH = "//img[@alt='create new']"; 137 138 /** 139 * //a[@title='Create a new record'] 140 */ 141 public static final String CREATE_NEW_XPATH2 = "//a[@title='Create a new record']"; 142 143 /** 144 * div.dataTables_wrapper thead th 145 */ 146 public static final String DATA_TABLE_TR_CSS = "div.dataTables_wrapper tbody tr"; 147 148 /** 149 * //div[@class='error']" 150 */ 151 public static final String DIV_ERROR_LOCATOR = "//div[@class='error']"; 152 153 /** 154 * //div[@class='error']" 155 */ 156 public static final String DIV_ERROR_LOCATOR_KRAD = "//div[@class='alert alert-danger']/ul"; 157 158 /** 159 * //div[@class='msg-excol'] 160 */ 161 public static final String DIV_EXCOL_LOCATOR = "//div[@class='msg-excol']"; 162 163 /** 164 * //div[@class='left-errmsg-tab']/div/div 165 */ 166 public static final String DIV_LEFT_ERRMSG = "//div[@class='left-errmsg-tab']/div/div"; 167 168 /** 169 * //input[@id='document.newMaintainableObject.code'] 170 */ 171 public static final String DOC_CODE_XPATH = "//input[@id='document.newMaintainableObject.code']"; 172 173 /** 174 * //div[@id='headerarea']/div/table/tbody/tr[1]/td[1] 175 */ 176 public static final String DOC_ID_XPATH = "//div[@id='headerarea']/div/table/tbody/tr[1]/td[1]"; 177 178 /** 179 * //div[@id='headerarea']/div/table/tbody/tr[1]/td[1] 180 */ 181 public static final String DOC_ID_KRAD_XPATH = "//div[@data-label=\"Document Number\"]"; 182 /** 183 * //table[@id='row']/tbody/tr[1]/td[1 184 */ 185 public static final String DOC_ID_XPATH_2 = "//table[@id='row']/tbody/tr[1]/td[1]"; 186 187 /** 188 * //table[@id='row']/tbody/tr[1]/td[1]/a 189 */ 190 public static final String DOC_ID_XPATH_3 ="//table[@id='row']/tbody/tr[1]/td[1]/a"; 191 192 /** 193 * //input[@id='document.documentHeader.documentDescription'] 194 */ 195 public static final String DOC_DESCRIPTION_XPATH ="//input[@id='document.documentHeader.documentDescription']"; 196 197 /** 198 * //div[@id='headerarea']/div/table/tbody/tr[1]/td[1] 199 */ 200 public static final String DOC_INITIATOR_XPATH = "//div[@id='headerarea']/div/table/tbody/tr[2]/td[1]"; 201 202 /** 203 * "//img[@alt='doc search'] 204 */ 205 public static final String DOC_SEARCH_XPATH = "//img[@alt='doc search']"; 206 207 /** 208 * //a[@title='Document Search'] 209 */ 210 public static final String DOC_SEARCH_XPATH_TITLE = "//a[@title='Document Search']"; 211 212 /** 213 * ENROUTE 214 */ 215 public static final String DOC_STATUS_ENROUTE = "ENROUTE"; 216 217 /** 218 * FINAL 219 */ 220 public static final String DOC_STATUS_FINAL = "FINAL"; 221 222 /** 223 * SAVED 224 */ 225 public static final String DOC_STATUS_SAVED = "SAVED"; 226 227 /** 228 * //table[@class='headerinfo']//tr[1]/td[2] 229 */ 230 public static final String DOC_STATUS_XPATH = "//table[@class='headerinfo']//tr[1]/td[2]"; 231 232 /** 233 * //table[@id='row']/tbody/tr[1]/td[4] 234 */ 235 public static final String DOC_STATUS_XPATH_2 = "//table[@id='row']/tbody/tr[1]/td[4]"; 236 237 /** 238 * //div[contains(div,'Document was successfully submitted.')] 239 */ 240 public static final String DOC_SUBMIT_SUCCESS_MSG_XPATH ="//div[contains(div,'Document was successfully submitted.')]"; 241 242 /** 243 * edit 244 */ 245 public static final String EDIT_LINK_TEXT = "edit"; 246 247 /** 248 * iframeportlet 249 */ 250 public static final String IFRAMEPORTLET_NAME = "iframeportlet"; 251 252 /** 253 * (//a[contains(text(),'Uif Components (Kitchen Sink)')])[2] 254 */ 255 public static final String KITCHEN_SINK_XPATH = "(//a[contains(text(),'Uif Components (Kitchen Sink)')])"; 256 257 /** 258 * KRAD 259 */ 260 public static final String KRAD_XPATH = "KRAD"; 261 262 /** 263 * Kuali :: Collection Totaling 264 */ 265 public static final String KUALI_COLLECTION_TOTALLING_WINDOW_XPATH = "Kuali :: Collection Totaling"; 266 267 /** 268 * //a[text()='Collection Totaling'] 269 */ 270 public static final String KUALI_COLLECTION_TOTALLING_XPATH = "//a[text()='Collection Totaling']"; 271 272 /** 273 * Kuali :: Uif Components 274 */ 275 public static final String KUALI_UIF_COMPONENTS_WINDOW_XPATH = "Kuali :: Uif Components"; 276 277 /** 278 * "Kuali :: View Title" 279 */ 280 public static final String KUALI_VIEW_WINDOW_TITLE = "Kuali :: View Title"; 281 282 /** 283 * KUALI - Kuali Systems 284 */ 285 public static final String LABEL_KUALI_KUALI_SYSTEMS = "KUALI - Kuali Systems"; 286 287 /** 288 * KUALI : Default 289 */ 290 public static final String LABEL_KUALI_DEFAULT = "KUALI : Default"; 291 292 /** 293 * //input[@name='imageField' and @value='Logout'] 294 */ 295 public static final String LOGOUT_XPATH = "//input[@name='imageField' and @value='Logout']"; 296 297 /** 298 * Main Menu 299 */ 300 public static final String MAIN_MENU_LINK_TEXT = "Main Menu"; 301 302 /** 303 * Kuali :: Rich Messages 304 */ 305 public static final String RICH_MESSAGES_WINDOW_TITLE = "Kuali :: Rich Messages"; 306 307 /** 308 * //div[contains(div,'Document was successfully saved.')] 309 */ 310 public static final String SAVE_SUCCESSFUL_XPATH = "//div[contains(div,'Document was successfully saved.')]"; 311 312 /** 313 * //input[@name='methodToCall.save' and @alt='save'] 314 */ 315 public static final String SAVE_XPATH="//input[@name='methodToCall.save' and @alt='save']"; 316 317 /** 318 * KIM Screens 319 * //*[@name='methodToCall.save' and @alt='save'] 320 */ 321 public static final String SAVE_XPATH_2 = "//*[@name='methodToCall.save' and @alt='save']"; 322 323 /** 324 * KIM Screens 325 * //*[@name='methodToCall.reload' and @alt='reload'] 326 */ 327 public static final String RELOAD_XPATH = "//*[@name='methodToCall.reload' and @alt='reload']"; 328 329 /** 330 * //input[@title='search' and @name='methodToCall.search'] 331 */ 332 public static final String SAVE_XPATH_3 = "//input[@title='search' and @name='methodToCall.search']"; 333 334 /** 335 * Search 336 */ 337 public static final String SEARCH = "Search"; 338 339 /** 340 * //input[@name='methodToCall.search' and @value='search'] 341 */ 342 public static final String SEARCH_XPATH="//input[@name='methodToCall.search' and @value='search']"; 343 344 /** 345 * //input[@value='search'] 346 */ 347 public static final String SEARCH_XPATH_2 = "//input[@value='search']"; 348 349 /** 350 * (//input[@name='methodToCall.search'])[2] 351 */ 352 public static final String SEARCH_SECOND = "(//input[@name='methodToCall.search'])[2]"; 353 354 /** 355 * //input[@name='methodToCall.route' and @alt='submit'] 356 */ 357 public static final String SUBMIT_XPATH="//input[@name='methodToCall.route' and @alt='submit']"; 358 359 /** 360 * //input[@name='methodToCall.approve' and @alt='approve'] 361 */ 362 public static final String APPROVE_XPATH="//input[@name='methodToCall.approve' and @alt='approve']"; 363 364 /** 365 * //input[@name='methodToCall.disapprove' and @alt='disapprove'] 366 */ 367 public static final String DISAPPROVE_XPATH="//input[@name='methodToCall.disapprove' and @alt='disapprove']"; 368 369 /** 370 * //input[@name='methodToCall.acknowledge' and @alt='acknowledge'] 371 */ 372 public static final String ACKNOWLEDGE_XPATH="//input[@name='methodToCall.acknowledge' and @alt='acknowledge']"; 373 374 /** 375 * //input[@name='methodToCall.close' and @alt='close'] 376 */ 377 public static final String CLOSE_XPATH="//input[@name='methodToCall.close' and @alt='close']"; 378 379 /** 380 * Travel Account Lookup 381 */ 382 public static final String TRAVEL_ACCOUNT_LOOKUP_LINK_TEXT = "Travel Account Lookup"; 383 384 /** 385 * Uif Components (Kitchen Sink) 386 */ 387 public static final String UIF_COMPONENTS_KITCHEN_SINK_LINK_TEXT = "Uif Components (Kitchen Sink)"; 388 389 /** 390 * (//a[contains(text(),'Validation Framework Demo')])[2] 391 */ 392 public static final String VALIDATION_FRAMEWORK_DEMO_XPATH = "(//a[contains(text(),'Validation Framework Demo')])"; 393 394 /** 395 * XML Ingester 396 */ 397 public static final String XML_INGESTER_LINK_TEXT = "XML Ingester"; 398 399 /** 400 * //a[@title='FiscalOfficerInfo Maintenance (New)'] 401 */ 402 public static final String FISCAL_OFFICER_INFO_MAINTENANCE_NEW_XPATH = "//a[@title='FiscalOfficerInfo Maintenance (New)']"; 403 404 static { 405 if (System.getProperty(WebDriverUtils.REMOTE_PROPERTIES_PROPERTY) != null) { 406 PropertiesUtils propUtils = new PropertiesUtils(); 407 try { 408 propUtils.loadPropertiesWithSystemAndOverridesIntoSystem(System.getProperty(WebDriverUtils.REMOTE_PROPERTIES_PROPERTY)); 409 } catch (IOException ioe) { 410 System.out.println("Exception opening " + System.getProperty(WebDriverUtils.REMOTE_PROPERTIES_PROPERTY) + " " + ioe.getMessage()); 411 } 412 } 413 } 414 415 protected String namespaceCode = "KR-WKFLW"; 416 417 protected String uiFramework = AutomatedFunctionalTestUtils.REMOTE_UIF_KNS; // default to KNS 418 419 private static final Map<String, String> actionRequestLabelMap; 420 private static Map<String, String> actionRequestButtonMap; 421 static{ 422 actionRequestLabelMap = new HashMap(); 423 actionRequestLabelMap.put("A","APPROVE"); 424 actionRequestLabelMap.put("F","FYI"); 425 actionRequestLabelMap.put("C","COMPLETE"); 426 actionRequestLabelMap.put("CR","COMPLETE"); 427 actionRequestLabelMap.put("K","ACKNOWLEDGE"); 428 actionRequestLabelMap.put("D","APPROVE"); 429 actionRequestButtonMap = new HashMap(); 430 actionRequestButtonMap.put("A","methodToCall.approve"); 431 actionRequestButtonMap.put("F","methodToCall.fyi"); 432 actionRequestButtonMap.put("C","methodToCall.complete"); 433 actionRequestButtonMap.put("CR","methodToCall.route"); 434 actionRequestButtonMap.put("K","methodToCall.acknowledge"); 435 actionRequestButtonMap.put("D","methodToCall.disapprove"); 436 } 437 438 /** 439 * 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. 440 * Setup the WebDriver properties, test, and login. Named testSetUp so it runs after TestNG's startSession(Method) 441 * {@link WebDriverUtils#determineUser(String)} 442 * {@link WebDriverUtils#setUp(String, String, String, String)} 443 */ 444 @Before 445 public void testSetUp() { 446 super.testSetUp(); 447 } 448 449 /** 450 * // https://jira.kuali.org/browse/KULRICE-9804 KNS Create new link absent when Bookmark URL requires Login 451 * @return 452 */ 453 @Override 454 protected String getTestUrl() { 455 String testUrl = super.getTestUrl(); 456 if (testUrl.contains(AutomatedFunctionalTestUtils.HIDE_RETURN_LINK) && 457 !testUrl.contains("&showMaintenanceLinks=true")) { 458 testUrl += "&showMaintenanceLinks=true"; 459 } 460 return testUrl; 461 } 462 463 464 protected void impersonateUser(String user) throws InterruptedException { 465 waitAndTypeByName(BACKDOOR_ID_TEXT,user); 466 jGrowl("Click Backdoor Login"); 467 waitAndClickByXpath(BACKDOOR_LOGIN_BUTTON_XPATH); 468 } 469 470 protected void addAdHocRecipientsGroup(String[] adHocRecipients) throws InterruptedException { 471 addAdHocRecipientsGroup(new String[][]{adHocRecipients}); 472 } 473 474 protected void addAdHocRecipientsGroup(String[][] adHocRecipients) throws InterruptedException { 475 String today = getDateToday(); 476 Calendar nextYearCal = Calendar.getInstance(); 477 nextYearCal.add(Calendar.YEAR, 1); 478 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 479 String nextYear = sdf.format(nextYearCal.getTime()); 480 481 waitAndClickByName("methodToCall.toggleTab.tabAdHocRecipients"); 482 for (int i = 0, s = adHocRecipients.length; i < s; i++) { 483 selectOptionByName("newAdHocRouteWorkgroup.actionRequested", adHocRecipients[i][1]); 484 waitAndTypeByName("newAdHocRouteWorkgroup.recipientName", adHocRecipients[i][0]); 485 waitAndTypeByName("newAdHocRouteWorkgroup.recipientNamespaceCode", adHocRecipients[i][2]); 486 WebDriverUtils.jGrowl(getDriver(), "Click Add Group", false, "Click Add Group"); 487 waitAndClickByName("methodToCall.insertAdHocRouteWorkgroup"); 488 } 489 } 490 491 /** 492 * @param adHocRecipients user, action option value 493 * @throws InterruptedException 494 */ 495 protected void addAdHocRecipientsPerson(String[] adHocRecipients) throws InterruptedException { 496 addAdHocRecipientsPerson(new String[][]{adHocRecipients}); 497 } 498 499 /** 500 * @param adHocRecipients user, action option value 501 * @throws InterruptedException 502 */ 503 protected void addAdHocRecipientsPerson(String[][] adHocRecipients) throws InterruptedException { 504 String today = getDateToday(); 505 Calendar nextYearCal = Calendar.getInstance(); 506 nextYearCal.add(Calendar.YEAR, 1); 507 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 508 String nextYear = sdf.format(nextYearCal.getTime()); 509 510 if (!isVisible(By.name("newAdHocRoutePerson.actionRequested"))) { 511 waitAndClickByName("methodToCall.toggleTab.tabAdHocRecipients"); 512 } 513 for (int i = 0, s = adHocRecipients.length; i < s; i++) { 514 selectOptionByName("newAdHocRoutePerson.actionRequested", adHocRecipients[i][1]); 515 waitAndTypeByName("newAdHocRoutePerson.id", adHocRecipients[i][0]); 516// if (isElementPresentByName("member.activeFromDate")) { 517// waitAndTypeByName("member.activeFromDate", today); 518// } 519// if (isElementPresentByName("member.activeFromDate")) { 520// waitAndTypeByName("member.activeFromDate", nextYear); 521// } 522 WebDriverUtils.jGrowl(getDriver(), "Click Add Person", false, "Click Add Person"); 523 waitAndClickByName("methodToCall.insertAdHocRoutePerson"); 524 } 525 } 526 527 protected void agendaLookupAssertions() throws Exception { 528 testLookUp(); 529 assertTextPresent("Rules"); 530 waitAndClickCancelByText(); 531 } 532 533 protected void assertActionList(String docId, String actionListOptionValue, String state) throws InterruptedException { 534 selectTopFrame(); 535 waitAndClickActionList(); 536 selectFrameIframePortlet(); 537 while (!waitForIsTextPresent(docId)) { 538 waitAndClickByLinkText("Next"); 539 } 540 WebElement docIdTr = findElement(By.xpath("//table/tbody/tr/td/a[contains(text(), '" + docId + "')]/../..")); 541 assertTrue(docIdTr.getText() + " does not contain " + docId, docIdTr.getText().contains(docId)); 542 assertTrue(docIdTr.getText() + " does not contain " + state, docIdTr.getText().contains(state)); 543 assertTrue(docIdTr.getText() + " does not contain " + actionRequestLabelMap.get(actionListOptionValue), docIdTr.getText().contains(actionRequestLabelMap.get(actionListOptionValue))); 544// assertTextPresent(new String[]{docId, actionRequestLabelMap.get(actionListOptionValue)}); 545 waitAndClickLinkContainingText(docId); 546 selectChildWindow(); 547 waitAndClickByName(actionRequestButtonMap.get(actionListOptionValue)); 548 549 // Disapprove requires another step before checking outbox 550 if ("D".equals(actionListOptionValue)) { 551 waitAndTypeByName("reason","disapproved for AFT"); 552 jGrowl("Click yes button"); 553 waitAndClickByName("methodToCall.processAnswer.button0"); 554 } else if ("C".equals(actionListOptionValue) || "CR".equals(actionListOptionValue)) { 555 waitAndClickByName("methodToCall.close"); 556 } 557 waitForTextNotPresent(docId); 558 } 559 560 protected void assertNotInActionList(String docId) throws InterruptedException { 561 selectTopFrame(); 562 waitAndClickActionList(); 563 selectFrameIframePortlet(); 564 waitForTextNotPresent(docId); 565 while (isElementPresentByLinkText("Next")) { 566 waitAndClickByLinkText("Next"); 567 waitForTextNotPresent(docId); 568 } 569 } 570 571 protected void assertOutbox(String docId, String state) throws InterruptedException { 572 // find it in outbox 573 waitAndClickLinkContainingText("Outbox"); 574 // TODO if the docId is present as part of uniqueString there will be a false negative it would be better if there 575 // was a waitForIsElementPresent 576 while (!waitForIsTextPresent(docId)) { 577 waitAndClickByLinkText("Next"); 578 } 579 WebElement docIdTr = findElement(By.xpath("//table/tbody/tr/td/a[contains(text(), '" + docId + "')]/../..")); 580 assertTrue("Outbox items " + docIdTr.getText() + " does not contain " + docId, docIdTr.getText().contains(docId)); 581 assertTrue("Outbox items " + docIdTr.getText() + " state is incorrect " + state, docIdTr.getText().contains(state)); 582 waitForTextPresent(docId); 583 584// // clear all items in the outbox 585// waitAndClickAllByName("outboxItems"); 586// waitAndClickByName("methodToCall.removeOutboxItems"); 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 assertDocFinal(String docId) throws InterruptedException { 598 assertDocSearch(docId, DOC_STATUS_FINAL); 599 } 600 601 protected void assertDocSearch(String docId, String docStatus) throws InterruptedException { 602 docSearch(docId); 603 waitForElementPresentByXpath(DOC_ID_XPATH_3); 604 jGrowl("Is doc status for docId: " + docId + " " + docStatus + "?"); 605 acceptAlertIfPresent(); // Agenda 606 assertEquals(docId, getTextByXpath(DOC_ID_XPATH_3)); 607 assertEquals(docStatus, getTextByXpath(DOC_STATUS_XPATH_2)); 608 } 609 610 protected void docSearch(String docId) throws InterruptedException { 611 selectParentWindow(); 612 selectTopFrame(); 613 waitAndClickDocSearchTitle(); 614 acceptAlertIfPresent(); // Agenda 615 waitForPageToLoad(); 616 selectFrameIframePortlet(); 617 waitAndTypeByName("documentId", docId); 618 waitAndClickSearch(); 619 } 620 621 protected void assertDocSearchNoResults(String docId) throws InterruptedException { 622 docSearch(docId); 623 waitForTextPresent("No values match this search."); 624 } 625 626 protected void assertRouteStatus(String status) throws InterruptedException { 627 waitForElementPresentByXpath("//th[contains(.,'Route Status')]/../following-sibling::*/td[contains(.,'" + status + "')]"); 628 } 629 630 protected void assertTableLayout() throws Exception { 631 waitForTextPresent("Actions"); 632 String pageSource = driver.getPageSource(); 633 assertTrue(pageSource.contains("Table Layout")); 634 assertTrue(pageSource.contains("Field 1")); 635 assertTrue(pageSource.contains("Field 2")); 636 assertTrue(pageSource.contains("Field 3")); 637 assertTrue(pageSource.contains("Field 4")); 638 assertTrue(pageSource.contains("Actions")); 639 } 640 641 protected void blanketApproveAssert(String docId) throws InterruptedException { 642 checkForDocError(); 643 assertDocSearch(docId, DOC_STATUS_FINAL); 644 } 645 646 protected void blanketApproveCheck() throws InterruptedException { 647 waitAndClickBlanketApproveKns(); 648 checkForIncidentReport(); 649 } 650 651 public static String blanketApprovalCleanUpErrorText(String errorText) { 652 errorText = errorText.replace("* required field", "").replace("\n", " ").trim(); // bit of extra ui text we don't care about 653 return errorText; 654 } 655 656 /** 657 * Tests blanket approve action. 658 * This method is used by several different tests which perform various types of blanket approvals. 659 * Therefore, this is a candidate to remain in this base class 660 * 661 * @throws InterruptedException 662 */ 663 protected void blanketApproveTest(String docId) throws InterruptedException { 664 jGrowl("Click Blanket Approve"); 665 waitAndClickBlanketApproveKns(); 666 Thread.sleep(2000); 667 checkForIncidentReport(); 668 blanketApproveAssert(docId); 669 } 670 671 protected void blanketApproveSuccessfully() throws InterruptedException { 672 waitAndClickBlanketApprove(); 673 waitAndClickConfirmBlanketApproveOk(); 674 acceptAlertIfPresent(); // LabsLookupDefaultCreateNewBlanketApproveAft 675 waitForProgressLoading(); 676 checkForDocErrorKrad(); 677 waitForTextPresent("Document was successfully approved."); 678 } 679 680 protected void failOnErrorMessageItem() { 681 failOnErrorMessageItem(this.getClass().getName()); 682 } 683 684 protected void failOnErrorMessageItem(String message) { 685 final String error_locator = "//li[@class='uif-errorMessageItem']"; 686 if (findElements(By.xpath(error_locator)).size() > 0) { 687 String errorText = null; 688 689 try { 690 errorText = getTextByXpath(error_locator); 691 } catch (InterruptedException e) { 692 e.printStackTrace(); 693 } 694 695 if (errorText != null && errorText.contains("errors")) { 696 jiraAwareFail((errorText + " " + message).trim()); 697 } 698 699 } 700 } 701 702 /** 703 * Uses Selenium's findElements method which does not throw a test exception if not found. 704 */ 705 public void checkForDocError() { 706 if (hasDocError()) { 707 String errorText = extractErrorText(); 708 jiraAwareFail(errorText); 709 } 710 } 711 712 /** 713 * Uses Selenium's findElements method which does not throw a test exception if not found. 714 */ 715 public void checkForDocErrorKrad() { 716 if (hasDocErrorKrad()) { 717 String errorText = extractErrorTextKrad(); 718 jiraAwareFail(errorText); 719 } 720 } 721 722 protected String extractErrorText() { 723 String errorText = driver.findElement(By.xpath(DIV_ERROR_LOCATOR)).getText(); // don't highlight 724 errorText = blanketApprovalCleanUpErrorText(errorText); 725 if (driver.findElements(By.xpath(DIV_EXCOL_LOCATOR)).size() > 0) { // not present if errors are at the bottom of the page (see left-errmsg below) 726 errorText = blanketApprovalCleanUpErrorText(driver.findElement( 727 // don't highlight 728 By.xpath(DIV_EXCOL_LOCATOR)).getText()); // replacing errorText as DIV_EXCOL_LOCATOR includes the error count 729 } 730 if (driver.findElements(By.xpath(DIV_LEFT_ERRMSG)).size() > 0) { 731 errorText = errorText + blanketApprovalCleanUpErrorText(driver.findElement( 732 By.xpath(DIV_LEFT_ERRMSG)).getText()); // don't highlight 733 } 734 return errorText; 735 } 736 737 protected String extractErrorTextKrad() { 738 return driver.findElement(By.xpath(DIV_ERROR_LOCATOR_KRAD)).getText(); // don't highlight 739 } 740 741 /** 742 * Uses Selenium's findElements method which does not throw a test exception if not found. 743 * @return 744 */ 745 public boolean hasDocError() { 746 acceptAlertIfPresent(); // Agenda 747 if (driver.findElements(By.xpath(DIV_ERROR_LOCATOR)).size() > 0) { 748 String errorText = driver.findElement(By.xpath(DIV_ERROR_LOCATOR)).getText(); // don't highlight 749 if (errorText != null && errorText.contains("error(s) found on page.")) { 750 return true; 751 } 752 } 753 return false; 754 } 755 756 /** 757 * Uses Selenium's findElements method which does not throw a test exception if not found. 758 * @return 759 */ 760 public boolean hasDocErrorKrad() { 761 if (driver.findElements(By.xpath(DIV_ERROR_LOCATOR_KRAD)).size() > 0) { 762 String errorText = driver.findElement(By.xpath(DIV_ERROR_LOCATOR_KRAD)).getText(); // don't highlight 763 if (errorText != null && !errorText.equals("")) { 764 return true; 765 } 766 } 767 return false; 768 } 769 770 /** 771 * Uses Selenium's findElements method which does not throw a test exception if not found. 772 * @param errorTextToMatch 773 * @return 774 */ 775 public boolean hasDocError(String errorTextToMatch) { 776 if (driver.findElements(By.xpath(DIV_ERROR_LOCATOR)).size() > 0) { 777 String errorText = driver.findElement(By.xpath(DIV_ERROR_LOCATOR)).getText(); // don't highlight 778 if (errorText != null && errorText.contains("error(s) found on page.")) { 779 WebElement errorDiv = driver.findElement(By.xpath("//div[@class='left-errmsg']/div[2]/div")); // don't highlight 780 if (errorDiv != null) { 781 errorText = errorDiv.getText(); 782 return errorText != null && errorText.contains(errorTextToMatch); 783 } 784 } 785 } 786 return false; 787 } 788 789 protected String configNameSpaceBlanketApprove() throws Exception { 790 String docId = waitForDocId(); 791 String dtsPlusTwoChars = AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 792 waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Namespace " + AutomatedFunctionalTestUtils 793 .createUniqueDtsPlusTwoRandomCharsNot9Digits()); 794 assertBlanketApproveButtonsPresent(); 795 waitAndTypeByXpath(DOC_CODE_XPATH, "VTN" + dtsPlusTwoChars); 796 waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", 797 "Validation Test NameSpace " + dtsPlusTwoChars); 798 waitAndTypeByXpath("//input[@id='document.newMaintainableObject.applicationId']", "RICE"); 799 800 return docId; 801 } 802 803 protected void contextLookupAssertions() throws Exception { 804 testLookUp(); 805 assertTextPresent("Notes and Attachments"); 806 jGrowl("Click Cancel"); 807 waitAndClickByXpath("//button[@data-performDirtyValidation=\"true\"]"); // first cancel button is for attachment cancel and is hidden 808 } 809 810 // protected void deleteSubCollectionLine() throws Exception { 811 // // click on collections page link 812 // waitAndClickByLinkText(COLLECTIONS_LINK_TEXT); 813 // Thread.sleep(5000); 814 // 815 // // wait for collections page to load by checking the presence of a sub collection line item 816 // waitForElementPresentByName("list4[0].subList[0].field1"); 817 // 818 // // change a value in the line to be deleted 819 // waitAndTypeByName("list4[0].subList[0].field1", "selenium"); 820 // 821 // // click the delete button 822 // 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"); 823 // Thread.sleep(2000); 824 // 825 // // confirm that the input box containing the modified value is not present 826 // for (int second = 0;; second++) { 827 // if (second >= waitSeconds) 828 // jiraAwareFail(TIMEOUT_MESSAGE); 829 // try { 830 // if (!"selenium".equals(waitAndGetAttributeByName("list4[0].subList[0].field1", "value"))) 831 // break; 832 // } catch (Exception e) {} 833 // Thread.sleep(1000); 834 // } 835 // 836 // // verify that the value has changed for the input box in the line that has replaced the deleted one 837 // assertNotSame("selenium", waitAndGetAttributeByName("list4[0].subList[0].field1", "value")); 838 // } 839 840 protected void expandColapseByXpath(String clickLocator, String visibleLocator) throws InterruptedException { 841 waitAndClickByXpath(clickLocator); 842 waitIsVisibleByXpath(visibleLocator); 843 waitAndClickByXpath(clickLocator); 844 waitNotVisibleByXpath(visibleLocator); 845 } 846 847 protected String getDocStatus() { 848 return findElement(By.xpath(DOC_STATUS_XPATH_2)).getText(); 849 } 850 851 /** 852 * <p> 853 * Handles simple nested frame content; validates that a frame and nested frame exists before 854 * switching to it. 855 * </p><p> 856 * Uses Selenium's findElements method which does not throw a test exception if not found. 857 * </p> 858 */ 859 protected void gotoNestedFrame() { 860 driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); 861 driver.switchTo().defaultContent(); 862 final String iframeXpath = "//iframe"; 863 864 gotoIframeByXpath(iframeXpath); 865 866 gotoIframeByXpath(iframeXpath); 867 868 driver.manage().timeouts().implicitlyWait(waitSeconds, TimeUnit.SECONDS); 869 } 870 871 @Override 872 protected void logout() throws InterruptedException { 873 selectTopFrame(); 874 if (isElementPresentByXpath(LOGOUT_XPATH)) { 875 waitAndClickLogout(this); 876 } 877 } 878 879 protected void lookupDocByWildcardedUniqueStringName() throws InterruptedException { 880 open(getBaseUrlString() + getBookmarkUrl()); 881 selectFrameIframePortlet(); 882 waitAndTypeByName("name", "*" + uniqueString); 883 waitAndClickSearch(); 884 } 885 886 protected boolean noAffilication() { 887 return !isElementPresentByName("document.affiliations[0].dflt"); 888 } 889 890 /** 891 * recalls a document. 892 * closes the page when done. 893 * 894 * @param cancel if true, performs recall and cancel. if false, performs recall to action list 895 * 896 * @throws InterruptedException 897 */ 898 protected void recall(boolean cancel) throws InterruptedException { 899 waitAndClickByName("methodToCall.recall"); 900 waitForTextPresent("the reason below"); 901 waitAndTypeByName("reason", "Recall " + uniqueString); 902 if (cancel){ 903 // recall and cancel 904 waitAndClickByName("methodToCall.processAnswer.button1"); 905 waitForTextPresent("RECALLED"); 906 waitAndClickByName("methodToCall.close"); 907 } else { 908 // recall to action list 909 waitAndClickByName("methodToCall.processAnswer.button0"); 910 waitForTextPresent("SAVED"); 911 waitAndClickByName("methodToCall.close"); 912 waitAndClickByName("methodToCall.processAnswer.button1"); 913 } 914 } 915 916 protected void saveSuccessfully() throws InterruptedException { 917 saveSuccessfully(WebDriverUtils.configuredImplicityWait() * 4); 918 } 919 920 protected void saveSuccessfully(int secondsToWait) throws InterruptedException { 921 waitAndClickSaveByText(); 922 waitForProgressSaving(secondsToWait); 923 checkForDocErrorKrad(); 924 waitForTextPresent("Document was successfully saved."); 925 } 926 927 protected void selectFrameIframePortlet() { 928 selectFrame(IFRAMEPORTLET_NAME); 929 } 930 931 protected void selectFrame(String locator) { 932 933 if (IFRAMEPORTLET_NAME.equals(locator)) { 934 gotoNestedFrame(); 935 } else { 936 WebDriverUtils.selectFrameSafe(driver, locator); 937 } 938 } 939 940 protected void submitSuccessfully() throws InterruptedException { 941 submitSuccessfully(WebDriverUtils.configuredImplicityWait() * 4); 942 } 943 944 protected void submitSuccessfully(int loadingSeconds) throws InterruptedException { 945 waitAndClickSubmitByText(); 946 waitAndClickConfirmSubmitOk(); 947 waitForProgressLoading(loadingSeconds); 948 Thread.sleep(500); 949 checkForDocError(); 950 checkForDocErrorKrad(); 951 waitForTextPresent("Document was successfully submitted."); 952 } 953 954 protected void testAddingBrownGroup() throws Exception { 955 selectFrameIframePortlet(); 956 waitAndCreateNew(); 957 String docId = waitForDocId(); 958 String random = RandomStringUtils.randomNumeric(4); 959 String organizationDocumentNumber = "ORD" + random; 960 String groupDescription = "GD" + random; 961 String groupName = "BrownGroup " + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 962 String nameSpace = "KR-IDM"; 963 String today = getDateToday(); 964 Calendar nextYearCal = Calendar.getInstance(); 965 nextYearCal.add(Calendar.YEAR, 1); 966 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 967 String nextYear = sdf.format(nextYearCal.getTime()); 968 969 //Enter details for BrownGroup. 970 waitAndTypeByName("document.documentHeader.documentDescription", "Adding Brown Group"); 971 waitAndTypeByName("document.documentHeader.explanation", "I want to add Brown Group to test KIM"); 972 waitAndTypeByName("document.documentHeader.organizationDocumentNumber", organizationDocumentNumber); 973 selectOptionByName("document.groupNamespace", nameSpace); 974 waitAndTypeByName("document.groupName", groupName); 975 waitAndTypeByName("document.groupDescription", groupDescription); 976 977 checkByName("document.active"); 978 waitAndClickByXpath(SAVE_XPATH_2); 979 waitForTextPresent("Document was successfully saved."); 980 } 981 982 protected void testAddingBrownGroupSubmit() throws Exception { 983 selectFrameIframePortlet(); 984 waitAndCreateNew(); 985 String docId = waitForDocId(); 986 String random = RandomStringUtils.randomNumeric(4); 987 String organizationDocumentNumber = "ORD" + random; 988 String groupDescription = "GD" + random; 989 String groupName = "BrownGroup " + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 990 String nameSpace = "KR-IDM"; 991 String today = getDateToday(); 992 acceptAlertIfPresent(); 993 Calendar nextYearCal = Calendar.getInstance(); 994 nextYearCal.add(Calendar.YEAR, 1); 995 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 996 String nextYear = sdf.format(nextYearCal.getTime()); 997 998 //Enter details for BrownGroup. 999 waitAndTypeByName("document.documentHeader.documentDescription", "Adding Brown Group"); 1000 waitAndTypeByName("document.documentHeader.explanation", "I want to add Brown Group to test KIM"); 1001 waitAndTypeByName("document.documentHeader.organizationDocumentNumber", organizationDocumentNumber); 1002 selectOptionByName("document.groupNamespace", nameSpace); 1003 waitAndTypeByName("document.groupName", groupName); 1004 waitAndTypeByName("document.groupDescription", groupDescription); 1005 1006 checkByName("document.active"); 1007 waitAndClickByXpath(SUBMIT_XPATH); 1008 } 1009 1010 protected void testAddingBrownGroupSaveSubmit() throws Exception { 1011 selectFrameIframePortlet(); 1012 waitAndCreateNew(); 1013 String docId = waitForDocId(); 1014 String random = RandomStringUtils.randomNumeric(4); 1015 String organizationDocumentNumber = "ORD" + random; 1016 String groupDescription = "GD" + random; 1017 String groupName = "BrownGroup " + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 1018 String nameSpace = "KR-IDM"; 1019 String today = getDateToday(); 1020 Calendar nextYearCal = Calendar.getInstance(); 1021 nextYearCal.add(Calendar.YEAR, 1); 1022 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 1023 String nextYear = sdf.format(nextYearCal.getTime()); 1024 1025 //Enter details for BrownGroup. 1026 waitAndTypeByName("document.documentHeader.documentDescription", "Adding Brown Group"); 1027 waitAndTypeByName("document.documentHeader.explanation", "I want to add Brown Group to test KIM"); 1028 waitAndTypeByName("document.documentHeader.organizationDocumentNumber", organizationDocumentNumber); 1029 selectOptionByName("document.groupNamespace", nameSpace); 1030 waitAndTypeByName("document.groupName", groupName); 1031 waitAndTypeByName("document.groupDescription", groupDescription); 1032 1033 waitAndClickByXpath(SAVE_XPATH_2); 1034 waitForTextPresent("Document was successfully saved."); 1035 waitAndClickByXpath(SUBMIT_XPATH); 1036 waitForTextPresent("Document was successfully submitted."); 1037 } 1038 1039 protected void testAttributeDefinitionLookUp() throws Exception { 1040 waitForPageToLoad(); 1041 selectFrameIframePortlet(); 1042 waitAndClickByXpath("//button[contains(.,'earch')]"); 1043 Thread.sleep(3000); 1044 waitForPageToLoad(); 1045 findElement(By.tagName("body")).getText().contains("Actions"); // there are no actions, but the header is the only unique text from searching 1046 waitAndClickByLinkText("1000"); 1047 waitForPageToLoad(); 1048 findElement(By.tagName("body")).getText().contains("Attribute Inquiry"); 1049 findElement(By.tagName("body")).getText().contains("KRMS Attributes"); 1050 findElement(By.tagName("body")).getText().contains("Attribute Label"); 1051 findElement(By.tagName("body")).getText().contains("1000"); 1052 findElement(By.tagName("body")).getText().contains("peopleFlowId"); 1053 findElement(By.tagName("body")).getText().contains("KR-RULE"); 1054 findElement(By.tagName("body")).getText().contains("PeopleFlow"); 1055 1056 // selectFrame("name=fancybox-frame1343151577256"); // TODO parse source to get name 1057 // jiraAwareWaitAndClick("css=button:contains(Close)"); // looks lower case, but is upper 1058 // Thread.sleep(500); 1059 // jiraAwareWaitAndClick("css=button:contains(cancel)"); 1060 // AttributeDefinition's don't have actions (yet) 1061 // jiraAwareWaitAndClick("id=u80"); 1062 // waitForPageToLoad(); 1063 // jiraAwareWaitAndClick("id=u86"); 1064 // waitForPageToLoad(); 1065 // selectWindow("null"); 1066 // jiraAwareWaitAndClick("xpath=(//input[@name='imageField'])[2]"); 1067 // waitForPageToLoad(); 1068 passed(); 1069 } 1070 1071 protected String testBlanketApprove() throws Exception { 1072 selectFrameIframePortlet(); 1073 waitAndCreateNew(); 1074 String docId = verifyDocInitiated(); 1075 assertBlanketApproveButtonsPresent(); 1076 createNewLookupDetails(); 1077 1078 jGrowl("Click Blanket Approve"); 1079 waitAndClickBlanketApproveKns(); 1080 1081 int attempts = 0; 1082 while (hasDocError() && extractErrorText().contains("a record with the same primary key already exists.") && 1083 ++attempts <= 3) { 1084 uniqueString = null; // make sure try a new one 1085 jGrowl("record with the same primary key already exists"); 1086 createNewEnterDetails(); 1087 jGrowl("Click Blanket Approve"); 1088 waitAndClickBlanketApproveKns(); 1089 } 1090 1091 checkForIncidentReport(); 1092 blanketApproveAssert(docId); 1093 return docId; 1094 } 1095 1096 protected void waitAndClickBlanketApproveKns() throws InterruptedException { 1097 waitAndClickByName(BLANKET_APPROVE_NAME, 1098 "No blanket approve button does the user " + getUserName() + " have permission?"); 1099 waitForProgressLoading(); 1100 } 1101 1102 protected void testCancelConfirmation() throws InterruptedException { 1103 waitAndCancelConfirmation(); 1104 } 1105 1106 protected void testCreateDocType() throws Exception { 1107 selectFrameIframePortlet(); 1108 waitAndCreateNew(); 1109 assertElementPresentByXpath("//*[@name='methodToCall.route' and @alt='submit']","submit button does not exist on the page"); 1110 1111 //waitForElementPresentByXpath(DOC_ID_XPATH); 1112 //String docId = findElement(By.xpath(DOC_ID_XPATH)).getText(); 1113 String docId = waitForDocId(); 1114 waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Creating new Document Type"); 1115 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,`)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;" 1116 + getBaseUrlString() + "/kr/lookup.do;::::).anchor4']"; 1117 waitAndClickByXpath(parentDocType); 1118 waitForPageToLoad(); 1119 Thread.sleep(2000); 1120 waitAndClickSearch(); 1121 waitAndClickReturnValue(); 1122 String docTypeName = "TestDocType" + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 1123 waitForElementPresentByXpath("//input[@id='document.newMaintainableObject.name']"); 1124 waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", docTypeName); 1125 waitAndTypeByXpath("//input[@id='document.newMaintainableObject.unresolvedDocHandlerUrl']","${kr.url}/maintenance.do?methodToCall=docHandler"); 1126 1127 //waitAndTypeByXpath("//input[@id='document.newMaintainableObject.actualNotificationFromAddress']", "NFA"); 1128 waitAndTypeByXpath("//input[@id='document.newMaintainableObject.label']", "Label for " + docTypeName); 1129 waitAndTypeByXpath("//input[@id='document.newMaintainableObject.unresolvedHelpDefinitionUrl']","default.htm?turl=WordDocuments%2Fdocumenttype.htm"); 1130 jGrowl("Click Submit button"); 1131 waitAndClickByXpath("//*[@name='methodToCall.route' and @alt='submit']"); 1132 checkForIncidentReport(); 1133 waitForPageToLoad(); 1134 driver.switchTo().defaultContent(); 1135 waitAndClickDocSearchTitle(); 1136 waitForPageToLoad(); 1137 selectFrameIframePortlet(); 1138 waitAndTypeByName("documentId", docId); 1139 waitAndClickSearch(); 1140 assertEquals(docId, waitForElementPresent(By.xpath(DOC_ID_XPATH_2)).getText()); 1141 } 1142 1143 protected String testCreateNew() throws InterruptedException { 1144 selectFrameIframePortlet(); 1145 waitAndCreateNew(); 1146 String docId = verifyDocInitiated(); 1147 createNewEnterDetails(); 1148 return docId; 1149 } 1150 1151 protected String testCreateNewCancel() throws Exception { 1152 selectFrameIframePortlet(); 1153 waitAndCreateNew(); 1154 String docId = verifyDocInitiated(); 1155 createNewEnterDetails(); 1156 testCancelConfirmation(); 1157 assertDocSearchNoResults(docId); 1158 return docId; 1159 } 1160 1161 protected void testCreateNewRequired() throws Exception { 1162 selectFrameIframePortlet(); 1163 waitAndCreateNew(); 1164 waitAndClickSubmit(); 1165 assertTrue(waitForElementVisibleBy(By.xpath("//div[@class='error']")).getText().contains( 1166 " error(s) found on page.")); 1167 } 1168 1169 protected String testCreateNewSave() throws Exception { 1170 selectFrameIframePortlet(); 1171 waitAndCreateNew(); 1172 String docId = verifyDocInitiated(); 1173 createNewEnterDetails(); 1174 waitAndClickSave(); 1175 1176 int attempts = 0; 1177 while (hasDocError() && extractErrorText().contains("a record with the same primary key already exists.") && 1178 ++attempts <= 3) { 1179 uniqueString = null; // make sure try a new one 1180 jGrowl("record with the same primary key already exists"); 1181 createNewEnterDetails(); 1182 waitAndClickSave(); 1183 } 1184 1185 checkForDocError(); 1186 waitForSuccessfulSaveMessage(); 1187 assertDocSearch(docId, "SAVED"); 1188 waitAndClickRouteLogIcon(); 1189 assertRouteStatus("SAVED"); 1190 back(); 1191 return docId; 1192 } 1193 1194 protected void waitForSuccessfulSaveMessage() throws InterruptedException { 1195 waitForElementVisibleBy(By.xpath(SAVE_SUCCESSFUL_XPATH)); 1196 } 1197 1198 protected String testCreateNewSubmit() throws Exception { 1199 selectFrameIframePortlet(); 1200 waitAndCreateNew(); 1201 String docId = verifyDocInitiated(); 1202 createNewEnterDetails(); 1203 waitAndClickSubmit(); 1204 int attempts = 0; 1205 while (hasDocError() && extractErrorText().contains("a record with the same primary key already exists.") && 1206 ++attempts <= 3) { 1207 uniqueString = null; // make sure try a new one 1208 jGrowl("record with the same primary key already exists"); 1209 createNewEnterDetails(); 1210 waitAndClickSubmit(); 1211 } 1212 1213 checkForDocError(); 1214 waitForSuccessfulSubmitMessage(); 1215 assertDocSearch(docId, "FINAL"); 1216 waitAndClickRouteLogIcon(); 1217 assertRouteStatus("FINAL"); 1218 back(); 1219 return docId; 1220 } 1221 1222 protected void waitForSuccessfulSubmitMessage() 1223 throws InterruptedException {waitForElementVisibleBy(By.xpath(DOC_SUBMIT_SUCCESS_MSG_XPATH));} 1224 1225 protected String testCreateNewSaveSubmit() throws Exception { 1226 selectFrameIframePortlet(); 1227 waitAndCreateNew(); 1228 String docId = verifyDocInitiated(); 1229 createNewEnterDetails(); 1230 waitAndClickSave(); 1231 1232 int attempts = 0; 1233 while (hasDocError() && extractErrorText().contains("a record with the same primary key already exists.") && 1234 ++attempts <= 3) { 1235 uniqueString = null; // make sure try a new one 1236 jGrowl("record with the same primary key already exists"); 1237 createNewEnterDetails(); 1238 waitAndClickSave(); 1239 } 1240 1241 checkForDocError(); 1242 waitForSuccessfulSaveMessage(); 1243 waitAndClickSubmit(); 1244 checkForDocError(); 1245 waitForSuccessfulSubmitMessage(); 1246 assertDocSearch(docId, "FINAL"); 1247 waitAndClickRouteLogIcon(); 1248 assertRouteStatus("FINAL"); 1249 back(); 1250 return docId; 1251 } 1252 1253 protected String verifyDocInitiated() throws InterruptedException { 1254 String docId = waitForDocId(); 1255 assertEquals("INITIATED", waitForDocStatus()); 1256 assertEquals(getUserName(), waitForDocInitiator()); 1257 return docId; 1258 } 1259 1260 protected List<String> testCreateNewParameter(String docId, String parameterName) throws Exception { 1261 waitForPageToLoad(); 1262 docId = waitForDocId(); 1263 //Enter details for Parameter. 1264 waitAndTypeByName("document.documentHeader.documentDescription", "Adding Test Parameter"); 1265 selectOptionByName("document.newMaintainableObject.namespaceCode", "KR-WKFLW"); 1266 waitAndTypeByName("document.newMaintainableObject.componentCode", "ActionList"); 1267 waitAndTypeByName("document.newMaintainableObject.applicationId", "KUALI"); 1268 parameterName = "TestIndicator" + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 1269 waitAndTypeByName("document.newMaintainableObject.name", parameterName); 1270 waitAndTypeByName("document.newMaintainableObject.value", "Y"); 1271 waitAndTypeByName("document.newMaintainableObject.description", "for testing"); 1272 selectOptionByName("document.newMaintainableObject.parameterTypeCode", "HELP"); 1273 waitAndClickByXpath("//input[@name='document.newMaintainableObject.evaluationOperatorCode' and @value='A']"); 1274 waitAndClickSave(); 1275 waitAndClickSubmit(); 1276 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 1277 1278 1279 assertDocSearch(docId, DOC_STATUS_FINAL); 1280 selectTopFrame(); 1281 List<String> params = new ArrayList<String>(); 1282 params.add(docId); 1283 params.add(parameterName); 1284 1285 return params; 1286 } 1287 1288 protected List<String> testCreateNewParameterType(String docId, String parameterType, String parameterCode)throws Exception { 1289 waitForPageToLoad(); 1290 docId = waitForDocId(); 1291 1292 //Enter details for Parameter. 1293 waitAndTypeByName("document.documentHeader.documentDescription", "Adding Test Parameter Type"); 1294 parameterCode = RandomStringUtils.randomAlphabetic(4).toLowerCase(); 1295 waitAndTypeByName("document.newMaintainableObject.code", parameterCode); 1296 parameterType = "testing " + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 1297 waitAndTypeByName("document.newMaintainableObject.name", parameterType); 1298 waitAndClickSave(); 1299 waitAndClickSubmit(); 1300 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 1301 assertDocSearch(docId, DOC_STATUS_FINAL); 1302 selectTopFrame(); 1303 List<String> params = new ArrayList<String>(); 1304 params.add(docId); 1305 params.add(parameterType); 1306 params.add(parameterCode); 1307 1308 return params; 1309 } 1310 1311 protected void testCreateNewSearchReturnValueCancelConfirmation() throws InterruptedException, Exception { 1312 selectFrameIframePortlet(); 1313 waitAndCreateNew(); 1314 waitAndClickSearch2(); 1315 waitAndClickReturnValue(); 1316 waitAndCancelConfirmation(); 1317 passed(); 1318 } 1319 1320 protected List<String> testCopyParameter(String docId, String parameterName) throws Exception { 1321 selectFrameIframePortlet(); 1322 waitAndClickCopy(); 1323 waitForPageToLoad(); 1324 docId = waitForDocId(); 1325 waitAndTypeByName("document.documentHeader.documentDescription", "Copying Test Parameter"); 1326 selectOptionByName("document.newMaintainableObject.namespaceCode", "KR-WKFLW"); 1327 waitAndTypeByName("document.newMaintainableObject.componentCode", "ActionList"); 1328 waitAndTypeByName("document.newMaintainableObject.applicationId", "KUALI"); 1329 parameterName = "TestIndicator" + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 1330 waitAndTypeByName("document.newMaintainableObject.name", parameterName); 1331 waitAndClickSave(); 1332 waitAndClickSubmit(); 1333 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 1334 assertDocSearch(docId, DOC_STATUS_FINAL); 1335 selectTopFrame(); 1336 List<String> params = new ArrayList<String>(); 1337 params.add(docId); 1338 params.add(parameterName); 1339 1340 return params; 1341 } 1342 1343 protected List<String> testCopyParameterType(String docId, String parameterType, String parameterCode) throws Exception { 1344 selectFrameIframePortlet(); 1345 waitAndClickCopy(); 1346 waitForPageToLoad(); 1347 docId = waitForDocId(); 1348 waitAndTypeByName("document.documentHeader.documentDescription", "Copying Test Parameter"); 1349 parameterCode = RandomStringUtils.randomAlphabetic(4).toLowerCase(); 1350 waitAndTypeByName("document.newMaintainableObject.code", parameterCode); 1351 clearTextByName("document.newMaintainableObject.name"); 1352 parameterType = "testing " + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 1353 waitAndTypeByName("document.newMaintainableObject.name", parameterType); 1354 waitAndClickSave(); 1355 waitAndClickSubmit(); 1356 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 1357 assertDocSearch(docId, DOC_STATUS_FINAL); 1358 selectTopFrame(); 1359 List<String> params = new ArrayList<String>(); 1360 params.add(docId); 1361 params.add(parameterType); 1362 params.add(parameterCode); 1363 1364 return params; 1365 } 1366 1367 protected void testDemoCustomRuleEventAndDocumentEventMethodInvocationAccountTypeChec() throws InterruptedException { 1368 String randomCode = org.apache.commons.lang3.RandomStringUtils.randomAlphabetic(9).toUpperCase(); 1369 waitAndTypeByName("document.documentHeader.documentDescription","Travel Account Maintenance New Test Document " + randomCode); 1370 waitAndTypeByName("document.newMaintainableObject.dataObject.number",randomCode); 1371 waitAndTypeByName("document.newMaintainableObject.dataObject.name","Test Account Name " + randomCode); 1372 waitAndClickByXpath("//button[contains(text(),'Submit')]"); 1373 assertTravelAccountTypeCodeRequired(); 1374 } 1375 1376 protected void assertTravelAccountTypeCodeRequired() throws InterruptedException { 1377 waitForTextPresent("Travel Account Type Code: Required"); 1378 fireEvent("document.newMaintainableObject.dataObject.accountTypeCode", "focus"); 1379 waitForElementVisibleBy(By.xpath("//div[@class='popover top in uif-tooltip-error-cs']")); 1380 fireEvent("document.newMaintainableObject.dataObject.accountTypeCode", "blur"); 1381 waitAndTypeByName("document.newMaintainableObject.dataObject.number", "a"); // focus, blur just doesn't do it sometimes 1382 if(isVisibleByXpath("//div[@class='popover top in uif-tooltip-error-cs']")){ 1383 JiraAwareFailureUtils.fail("Required popup still present", this); 1384 } 1385 } 1386 1387 protected void testDocTypeLookup() throws Exception { 1388 selectFrameIframePortlet(); 1389 waitAndClickByXpath("//input[@title='Search Parent Name']"); 1390 waitAndClickByXpath(SAVE_XPATH_3); 1391 waitAndClickByXpath("//table[@id='row']/tbody/tr[contains(td[3],'RiceDocument')]/td[1]/a"); 1392 waitAndClickByXpath(SAVE_XPATH_3); 1393 assertEquals("RiceDocument", getTextByXpath("//table[@id='row']/tbody/tr/td[4]/a")); 1394 waitAndClickByName("methodToCall.clearValues"); 1395 waitAndTypeByName("name", "Kuali*D"); 1396 waitAndClickByXpath(SAVE_XPATH_3); 1397 assertElementPresentByXpath("//table[@id='row']/tbody/tr[contains(td[3], 'KualiDocument')]"); 1398 String docIdOld = getTextByXpath("//table[@id='row']/tbody/tr[contains(td[3], 'KualiDocument')]/td[2]/a"); 1399 waitAndClickByName("methodToCall.clearValues"); 1400 waitAndTypeByName("label", "KualiDocument"); 1401 waitAndClickByXpath(SAVE_XPATH_3); 1402 assertElementPresentByXpath("//table[@id='row']/tbody/tr[contains(td[5], 'KualiDocument')]"); 1403 waitAndClickByName("methodToCall.clearValues"); 1404 waitAndTypeByName("documentTypeId", docIdOld); 1405 waitAndClickByXpath(SAVE_XPATH_3); 1406 assertElementPresentByXpath("//table[@id='row']/tbody/tr[contains(td[2], '" + docIdOld + "')]"); 1407 } 1408 1409 protected void testEditCopy(String docId) throws InterruptedException { 1410 String desc = getDescriptionUnique(); 1411 jiraAwareTypeByName("document.documentHeader.documentDescription", desc); 1412 String thisDocId = verifyDocInitiated(); 1413 assertFalse("Document id should not be the same as original (" + docId + ").", docId.equals(thisDocId)); 1414 waitAndClickSave(); 1415 waitForSuccessfulSaveMessage(); 1416 assertDocSearch(docId, "FINAL"); 1417 waitAndClickRouteLogIcon(); 1418 assertRouteStatus("FINAL"); 1419 waitForElementPresentByXpath("//th[contains(.,'Title')]/../following-sibling::*/td[contains(.,'" + desc + "')]"); 1420 } 1421 1422 protected List<String> testEditParameterType(String docId, String parameterType, String parameterCode) throws Exception { 1423 selectFrameIframePortlet(); 1424 waitAndClickEdit(); 1425 waitForPageToLoad(); 1426 docId = waitForDocId(); 1427 waitAndTypeByName("document.documentHeader.documentDescription", "Editing Test Parameter"); 1428 clearTextByName("document.newMaintainableObject.name"); 1429 parameterType = "testing " + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 1430 waitAndTypeByName("document.newMaintainableObject.name", parameterType); 1431 waitAndClickSave(); 1432 waitAndClickSubmit(); 1433 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 1434 assertDocSearch(docId, DOC_STATUS_FINAL); 1435 selectTopFrame(); 1436 List<String> params = new ArrayList<String>(); 1437 params.add(docId); 1438 params.add(parameterType); 1439 params.add(parameterCode); 1440 1441 return params; 1442 } 1443 1444 protected List<String> testEditParameter(String docId, String parameterName) throws Exception { 1445 selectFrameIframePortlet(); 1446 waitAndClickEdit(); 1447 waitForPageToLoad(); 1448 docId = waitForDocId(); 1449 waitAndTypeByName("document.documentHeader.documentDescription", "Editing Test Parameter"); 1450 clearTextByName("document.newMaintainableObject.value"); 1451 waitAndTypeByName("document.newMaintainableObject.value", "N"); 1452 waitAndClickSave(); 1453 waitAndClickSubmit(); 1454 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 1455 assertDocSearch(docId, DOC_STATUS_FINAL); 1456 selectTopFrame(); 1457 List<String> params = new ArrayList<String>(); 1458 params.add(docId); 1459 params.add(parameterName); 1460 return params; 1461 } 1462 1463 protected void testEditRouteRulesDelegation() throws Exception { 1464 waitForPageToLoad(); 1465 Thread.sleep(3000); 1466 assertEquals("Kuali Portal Index", getTitle()); 1467 selectFrameIframePortlet(); 1468 waitAndClickSearch(); 1469 waitAndClickEdit(); 1470 waitForPageToLoad(); 1471 Thread.sleep(3000); 1472 assertTrue(isElementPresentByName(CANCEL_NAME)); 1473 waitAndClickCancel(); 1474 waitAndClickByName("methodToCall.processAnswer.button0"); 1475 waitForPageToLoad(); 1476 passed(); 1477 } 1478 1479 protected void testFiscalOfficerInfoMaintenanceNew() throws Exception { 1480 selectFrameIframePortlet(); 1481 checkForIncidentReport(); 1482 String docId = getTextByXpath("//*[@id='u13_control']"); 1483 waitAndTypeByXpath("//input[@name='document.documentHeader.documentDescription']", "New FO Doc"); 1484 waitAndTypeByXpath("//input[@name='document.newMaintainableObject.dataObject.id']", "5"); 1485 waitAndTypeByXpath("//input[@name='document.newMaintainableObject.dataObject.userName']", "Jigar"); 1486 waitAndClickByXpath("//button[@id='usave']"); 1487 Integer docIdInt = Integer.valueOf(docId).intValue(); 1488 waitAndClickActionList(); 1489 selectFrameIframePortlet(); 1490 1491 if(isElementPresentByLinkText("Last")){ 1492 waitAndClickByLinkText("Last"); 1493 waitAndClickByLinkText(docIdInt.toString()); 1494 } else { 1495 waitAndClickByLinkText(docIdInt.toString()); 1496 } 1497 1498 // ------------------------------- Not working in code when click docId link in list-------------------------- 1499 //Thread.sleep(5000); 1500 //String[] windowTitles = getAllWindowTitles(); 1501 //selectWindow(windowTitles[1]); 1502 //windowFocus(); 1503 //assertEquals(windowTitles[1], getTitle()); 1504 //checkForIncidentReport("Action List Id link opened window.", "https://jira.kuali.org/browse/KULRICE-9062 Action list id links result in 404 or NPE"); 1505 1506 //------submit-----// 1507 //selectFrame("relative=up"); 1508 //waitAndClick("//button[@value='submit']"); 1509 //waitForPageToLoad50000(); 1510 //close(); 1511 //------submit over---// 1512 1513 //----step 2----// 1514 //selectWindow("null"); 1515 //windowFocus(); 1516 //waitAndClick("//img[@alt='doc search']"); 1517 //waitForPageToLoad50000(); 1518 //assertEquals(windowTitles[0], getTitle()); 1519 //selectFrame("iframeportlet"); 1520 //waitAndClick(SEARCH_XPATH); 1521 //waitForPageToLoad50000(); 1522 //----step 2 over ----// 1523 1524 //-----Step 3 verifies that doc is final-------// 1525 //assertEquals("FINAL", getText("//table[@id='row']/tbody/tr[1]/td[4]")); 1526 //selectFrame("relative=up"); 1527 //waitAndClick("link=Main Menu"); 1528 //waitForPageToLoad50000(); 1529 //assertEquals(windowTitles[0], getTitle()); 1530 //-----Step 3 verified that doc is final ------- 1531 } 1532 1533 protected void testIdentityPersonBlanketApprove() throws Exception { 1534 selectFrameIframePortlet(); 1535 waitAndCreateNew(); 1536 String docId = waitForDocId(); 1537 waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Person"); 1538 assertBlanketApproveButtonsPresent(); 1539 waitAndTypeByXpath("//input[@id='document.principalName']", "principal" + RandomStringUtils.randomAlphabetic(3).toLowerCase()); 1540 selectByName("newAffln.affiliationTypeCode", "Affiliate"); 1541 selectByName("newAffln.campusCode", "BX - BLGTN OFF CAMPUS"); 1542 selectByName("newAffln.campusCode", "BL - BLOOMINGTON"); 1543 assertElementPresentByName("newAffln.dflt"); 1544 waitAndClickByName("newAffln.dflt"); 1545 waitAndClickByName("methodToCall.addAffln.anchor"); 1546 waitAndClickByName("methodToCall.toggleTab.tabContact"); 1547 selectByName("newName.namePrefix", "Mr"); 1548 waitAndTypeByName("newName.firstName", "First"); 1549 waitAndTypeByName("newName.lastName", "Last"); 1550 selectByName("newName.nameSuffix", "Mr"); 1551 waitAndClickByName("newName.dflt"); 1552 waitAndClickByName("methodToCall.addName.anchor"); 1553 waitForPageToLoad(); 1554 blanketApproveTest(docId); 1555 } 1556 1557 protected void testIdentityRoleSaveAndReload()throws Exception{ 1558 selectFrameIframePortlet(); 1559 waitAndClickSearch2(); 1560 waitAndClickByXpath("//a[@title='edit Role withRole=63 ']"); 1561 waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Test Save and Reload Role "); 1562 assertBlanketApproveButtonsPresent(); 1563 waitAndClickByXpath(SAVE_XPATH_2); 1564 waitForTextPresent("Document was successfully saved."); 1565 waitAndClickByXpath(RELOAD_XPATH); 1566 waitForTextPresent("Document was successfully reloaded."); 1567 findElement(By.xpath("//div[@class='tab-container']")).getText().contains("Members:"); 1568 passed(); 1569 } 1570 1571 protected void testIdentityRoleBlanketApprove() throws Exception { 1572 selectFrameIframePortlet(); 1573 waitAndCreateNew(); 1574 waitAndClickByXpath(SEARCH_XPATH, "No search button to click."); 1575 waitAndClickReturnValue(); 1576 String docId = waitForDocId(); 1577 String dtsTwo = AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomCharsNot9Digits(); 1578 waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Role " + dtsTwo); 1579 assertBlanketApproveButtonsPresent(); 1580 selectByXpath("//select[@id='document.roleNamespace']", LABEL_KUALI_KUALI_SYSTEMS); 1581 waitAndTypeByXpath("//input[@id='document.roleName']", "Validation Test Role " + dtsTwo, 1582 "No Role Name input to type in."); 1583 waitAndClickByName( 1584 "methodToCall.performLookup.(!!org.kuali.rice.kim.impl.identity.PersonImpl!!).(((principalId:member.memberId,principalName:member.memberName))).((``)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;;::::).anchorAssignees"); 1585 waitAndClickByXpath(SEARCH_XPATH, "No search button to click."); 1586 waitAndClickReturnValue(); 1587 waitAndClickByName("methodToCall.addMember.anchorAssignees"); 1588 waitForPageToLoad(); 1589 blanketApproveTest(docId); 1590 } 1591 1592 protected void finishBlanketApprovalTest(String docId) throws InterruptedException { 1593 assertBlanketApproveButtonsPresent(); 1594 blanketApproveCheck(); 1595 if (!hasDocError("same primary key already exists")) { // don't fail as to still have the same key after 25 sequential attempts we've created many today already 1596 blanketApproveAssert(docId); 1597 } 1598 } 1599 1600 protected void testLookUp() throws Exception { 1601 waitForPageToLoad(); 1602 selectFrameIframePortlet(); 1603 1604 // Mixed capitalization 1605 waitAndClick(By.xpath(SEARCH_XPATH_3)); 1606 waitAndClickByLinkText(EDIT_LINK_TEXT, "edit button not present does user " + user + " have permission?"); 1607 waitForTextPresent("ubmit"); 1608 assertTextPresent("ave"); 1609 assertTextPresent("pprove"); 1610 assertTextPresent("lose"); 1611 assertTextPresent("ancel"); 1612 } 1613 1614 protected void testReferenceCampusTypeBlanketApprove() throws Exception { 1615 selectFrameIframePortlet(); 1616 String randomCode = searchForAvailableCode(1); 1617 1618 waitAndCreateNew(); 1619 String docId = waitForDocId(); 1620 String dtsTwo = AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomCharsNot9Digits(); 1621 waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Validation Test Campus Type " + randomCode + " " + dtsTwo); 1622 waitAndTypeByXpath(DOC_CODE_XPATH, randomCode); 1623 waitAndTypeByXpath("//input[@id='document.newMaintainableObject.name']", "Indianapolis" + randomCode + dtsTwo); 1624 1625 finishBlanketApprovalTest(docId); 1626 } 1627 1628 protected void performParameterInquiry(String parameterField) throws Exception { 1629 waitAndTypeByName("name", parameterField); 1630 waitAndClickSearch(); 1631 isElementPresentByLinkText(parameterField); 1632 waitAndClickByLinkText(parameterField); 1633 waitForPageToLoad(); 1634 Thread.sleep(2000); 1635 switchToWindow("Kuali :: Inquiry"); 1636 Thread.sleep(2000); 1637 } 1638 1639 protected List<String> testLookUpParameterType(String docId, String parameterType, String parameterCode) throws Exception { 1640 performParameterInquiry(parameterType); 1641 assertEquals(parameterCode, getTextByXpath("//div[@class='tab-container']/table//span[@id='code.div']").trim().toLowerCase()); 1642 assertEquals(parameterType, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim().toLowerCase()); 1643 waitAndClickCloseWindow(); 1644 switchToWindow("null"); 1645 List<String> params = new ArrayList<String>(); 1646 params.add(docId); 1647 params.add(parameterType); 1648 params.add(parameterCode); 1649 1650 return params; 1651 } 1652 1653 protected List<String> testLookUpParameter(String docId, String parameterName) throws Exception { 1654 performParameterInquiry(parameterName); 1655 assertEquals(parameterName, getTextByXpath( 1656 "//div[@class='tab-container']/table//span[@id='name.div']").trim()); 1657 assertEquals("Y", getTextByXpath("//div[@class='tab-container']/table//span[@id='value.div']") 1658 .trim()); 1659 waitAndClickCloseWindow(); 1660 switchToWindow("null"); 1661 List<String> params = new ArrayList<String>(); 1662 params.add(docId); 1663 params.add(parameterName); 1664 1665 return params; 1666 } 1667 1668 protected void testTermLookupAssertions() throws Exception { 1669 testLookUp(); 1670 assertTextPresent("Term Parameters"); 1671 waitAndClick(By.xpath(CANCEL2_XPATH)); 1672 passed(); 1673 } 1674 1675 protected void testTermSpecificationLookupAssertions() throws Exception { 1676 testLookUp(); 1677 assertTextPresent("Context"); 1678 waitAndClickCancelByText(); 1679 passed(); 1680 } 1681 1682 protected List<String> testVerifyModifiedParameter(String docId, String parameterName) throws Exception { 1683 performParameterInquiry(parameterName); 1684 assertEquals(parameterName, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim()); 1685 assertEquals("N", getTextByXpath("//div[@class='tab-container']/table//span[@id='value.div']").trim()); 1686 waitAndClickCloseWindow(); 1687 switchToWindow("null"); 1688 List<String> params = new ArrayList<String>(); 1689 params.add(docId); 1690 params.add(parameterName); 1691 1692 return params; 1693 } 1694 1695 protected List<String> testVerifyCopyParameterType(String docId, String parameterType, String parameterCode) throws Exception 1696 { 1697 performParameterInquiry(parameterType); 1698 assertEquals(parameterType, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim().toLowerCase()); 1699 waitAndClickCloseWindow(); 1700 switchToWindow("null"); 1701 List<String> params = new ArrayList<String>(); 1702 params.add(docId); 1703 params.add(parameterType); 1704 params.add(parameterCode); 1705 1706 return params; 1707 } 1708 1709 protected List<String> testCreateNewPermission(String docId, String permissionName) throws Exception { 1710 waitForPageToLoad(); 1711 Thread.sleep(2000); 1712 docId = waitForDocId(); 1713 waitAndClickSave(); 1714 waitForElementPresentByXpath("//div[contains(.,'Document Description (Description) is a required field.')]/img[@alt='error']"); 1715 waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Adding Permission removeme"); 1716 waitAndClickSubmit(); 1717 waitForElementPresentByXpath("//div[@class='error']"); 1718 assertElementPresentByXpath("//div[contains(.,'Template (Template) is a required field.')]/img[@alt='error']"); 1719 assertElementPresentByXpath("//div[contains(.,'Permission Namespace (Permission Namespace) is a required field.')]/img[@alt='error']"); 1720 assertElementPresentByXpath("//div[contains(.,'Permission Name (Permission Name) is a required field.')]/img[@alt='error']"); 1721 selectOptionByName("document.newMaintainableObject.templateId", "36"); 1722 selectOptionByName("document.newMaintainableObject.namespaceCode", "KR-SYS"); 1723 permissionName = "removeme" + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 1724 waitAndTypeByName("document.newMaintainableObject.name", permissionName); 1725 waitAndTypeByName("document.newMaintainableObject.description", "namespaceCode=KR*"); 1726 checkByName("document.newMaintainableObject.active"); 1727 waitAndClickSave(); 1728 waitForElementPresentByXpath(SAVE_SUCCESSFUL_XPATH); 1729 assertEquals(DOC_STATUS_SAVED, getTextByXpath(DOC_STATUS_XPATH)); 1730 waitAndClickSubmit(); 1731 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 1732 assertEquals(DOC_STATUS_ENROUTE, getTextByXpath(DOC_STATUS_XPATH)); 1733 List<String> params = new ArrayList<String>(); 1734 params.add(docId); 1735 params.add(permissionName); 1736 1737 return params; 1738 } 1739 1740 protected List<String> testLookUpPermission(String docId, String permissionName) throws Exception { 1741 waitAndTypeByName("name", permissionName); 1742 waitAndClickSearch(); 1743 isElementPresentByLinkText(permissionName); 1744 List<String> params = new ArrayList<String>(); 1745 params.add(docId); 1746 params.add(permissionName); 1747 1748 return params; 1749 } 1750 1751 protected List<String> testEditPermission(String docId, String permissionName) throws Exception { 1752 waitAndClickEdit(); 1753 waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Editing Permission removeme"); 1754 uncheckByName("document.newMaintainableObject.active"); 1755 waitAndClickSubmit(); 1756 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 1757 List<String> params = new ArrayList<String>(); 1758 params.add(docId); 1759 params.add(permissionName); 1760 1761 return params; 1762 } 1763 1764 protected List<String> testVerifyPermission(String docId, String permissionName) throws Exception { 1765 waitAndTypeByName("name", permissionName); 1766 waitAndClickByXpath("//input[@title='Active Indicator - No']"); 1767 waitAndClickSearch(); 1768 isElementPresentByLinkText(permissionName); 1769 List<String> params = new ArrayList<String>(); 1770 params.add(docId); 1771 params.add(permissionName); 1772 1773 return params; 1774 } 1775 1776 protected List<String> testCreateNewPerson(String docId, String personName) throws Exception { 1777 waitForPageToLoad(); 1778 docId = waitForDocId(); 1779 waitAndTypeByXpath(DOC_DESCRIPTION_XPATH, "Adding Charlie Brown"); 1780 waitAndTypeByName("document.documentHeader.explanation", "I want to add Charlie Brown to test KIM"); 1781 1782 //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. 1783 personName = "cbrown" + AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomChars(); 1784 waitAndTypeByName("document.principalName", personName); 1785 waitAndClickSave(); 1786 waitForElementPresentByXpath(SAVE_SUCCESSFUL_XPATH); 1787 assertEquals(DOC_STATUS_SAVED, getTextByXpath(DOC_STATUS_XPATH)); 1788 waitAndClickSubmit(); 1789 waitForElementPresentByXpath("//div[contains(.,'At least one affiliation must be entered.')]/img[@alt='error']"); 1790 assertElementPresentByXpath("//div[contains(.,'At least one name must be entered.')]/img[@alt='error']"); 1791 selectOptionByName("newAffln.affiliationTypeCode", "STDNT"); 1792 selectOptionByName("newAffln.campusCode", "BL"); 1793 checkByName("newAffln.dflt"); 1794 waitAndClickByName("methodToCall.addAffln.anchor"); 1795 waitAndSelectByName("newName.nameCode", "PRM"); 1796 selectOptionByName("newName.namePrefix", "Mr"); 1797 waitAndTypeByName("newName.firstName", "Charlie"); 1798 waitAndTypeByName("newName.lastName", "Brown"); 1799 checkByName("newName.dflt"); 1800 waitAndClickByName("methodToCall.addName.anchor"); 1801 waitAndClickSubmit(); 1802 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 1803 assertEquals(DOC_STATUS_ENROUTE, getTextByXpath(DOC_STATUS_XPATH)); 1804 List<String> params = new ArrayList<String>(); 1805 params.add(docId); 1806 params.add(personName); 1807 1808 return params; 1809 } 1810 1811 protected List<String> testLookUpPerson(String docId, String personName) throws Exception { 1812 waitAndTypeByName("principalName", personName); 1813 waitAndClickSearch(); 1814 isElementPresentByLinkText(personName); 1815 waitAndClickByName("methodToCall.clearValues"); 1816 waitAndTypeByName("firstName", "Charlie"); 1817 waitAndClickSearch(); 1818 isElementPresentByLinkText(personName); 1819 waitAndClickByName("methodToCall.clearValues"); 1820 waitAndTypeByName("lastName", "Brown"); 1821 waitAndClickSearch(); 1822 isElementPresentByLinkText(personName); 1823 waitAndClickByName("methodToCall.clearValues"); 1824 waitAndTypeByName("campusCode", "BL"); 1825 waitAndClickSearch(); 1826 isElementPresentByLinkText(personName); 1827 List<String> params = new ArrayList<String>(); 1828 params.add(docId); 1829 params.add(personName); 1830 1831 return params; 1832 } 1833 1834 protected List<String> testVerifyPerson(String docId, String personName) throws Exception { 1835 waitAndClickByLinkText(personName); 1836 waitForPageToLoad(); 1837 Thread.sleep(5000); 1838 switchToWindow("Kuali :: Person"); 1839 Thread.sleep(2000); 1840 assertEquals(personName, getTextByXpath("//div[@class='tab-container']/table//tr[2]/td[1]/div").trim()); 1841 assertEquals("BL - BLOOMINGTON", getTextByXpath("//div[@class='tab-container']/table[3]//tr[2]/td[2]/div").trim()); 1842 assertEquals("Student", getTextByXpath("//select/option[@selected]").trim()); 1843 assertElementPresentByXpath("//table[@class='tab']//input[@title='close Overview']"); 1844 assertElementPresentByXpath("//table[@class='tab']//input[@title='open Contact']"); 1845 assertElementPresentByXpath("//table[@class='tab']//input[@title='open Privacy Preferences']"); 1846 assertElementPresentByXpath("//table[@class='tab']//input[@title='open Membership']"); 1847 waitAndClickByName("methodToCall.showAllTabs"); 1848 waitForElementPresentByXpath("//table[@class='tab']//input[@title='close Overview']"); 1849 assertElementPresentByXpath("//table[@class='tab']//input[@title='close Contact']"); 1850 assertElementPresentByXpath("//table[@class='tab']//input[@title='close Privacy Preferences']"); 1851 assertElementPresentByXpath("//table[@class='tab']//input[@title='close Membership']"); 1852 waitAndClickByName("methodToCall.hideAllTabs"); 1853 waitForElementPresentByXpath("//table[@class='tab']//input[@title='open Overview']"); 1854 assertElementPresentByXpath("//table[@class='tab']//input[@title='open Contact']"); 1855 assertElementPresentByXpath("//table[@class='tab']//input[@title='open Privacy Preferences']"); 1856 assertElementPresentByXpath("//table[@class='tab']//input[@title='open Membership']"); 1857 waitAndClickCloseWindow(); 1858 switchToWindow("null"); 1859 List<String> params = new ArrayList<String>(); 1860 params.add(docId); 1861 params.add(personName); 1862 1863 return params; 1864 } 1865 1866 protected void testConfigurationTestView(String idPrefix) throws Exception { 1867 waitForElementPresentByXpath("//label[@id='" + idPrefix + "TextInputField_label']"); 1868 1869 // testing for https://groups.google.com/a/kuali.org/group/rice.usergroup.krad/browse_thread/thread/1e501d07c1141aad# 1870 String styleValue = waitAndGetAttributeByXpath("//label[@id='" + idPrefix + "TextInputField_label']", 1871 "style"); 1872 1873 // log.info("styleValue is " + styleValue); 1874 assertTrue(idPrefix + "textInputField label does not contain expected style", styleValue.replace(" ", "").contains("color:red")); 1875 1876 // get current list of options 1877 String refreshTextSelectLocator = "//select[@id='" + idPrefix + "RefreshTextField_control']"; 1878 String[] options1 = getSelectOptionsByXpath(refreshTextSelectLocator); 1879 String dropDownSelectLocator = "//select[@id='" + idPrefix + "DropDown_control']"; 1880 selectByXpath(dropDownSelectLocator, "Vegetables"); 1881 Thread.sleep(3000); 1882 1883 //get list of options after change 1884 String[] options2 = getSelectOptionsByXpath(refreshTextSelectLocator); 1885 1886 //verify that the change has occurred 1887 assertFalse("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", 1888 options1[options1.length - 1].equalsIgnoreCase(options2[options2.length - 1])); 1889 1890 //confirm that control gets disabled 1891 selectByXpath(dropDownSelectLocator, "None"); 1892 Thread.sleep(3000); 1893 assertEquals("true", waitAndGetAttributeByXpath(refreshTextSelectLocator, "disabled")); 1894 } 1895 1896 // protected void testTravelAccountTypeLookup() throws Exception { 1897 // selectFrameIframePortlet(); 1898 // 1899 // //Blank Search 1900 // waitAndClickByXpath("//*[contains(button,\"earch\")]/button[1]"); 1901 // Thread.sleep(4000); 1902 // assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'CAT')]"); 1903 // assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'EAT')]"); 1904 // assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'IAT')]"); 1905 // 1906 // //search with each field 1907 // waitAndTypeByName("lookupCriteria[accountTypeCode]", "CAT"); 1908 // waitAndClickByXpath("//*[contains(button,\"earch\")]/button[1]"); 1909 // Thread.sleep(2000); 1910 // assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'CAT')]"); 1911 // waitAndClickByXpath("//*[contains(button,\"earch\")]/button[2]"); 1912 // Thread.sleep(2000); 1913 // waitAndTypeByName("lookupCriteria[name]", "Expense Account Type"); 1914 // waitAndClickByXpath("//*[contains(button,\"earch\")]/button[1]"); 1915 // Thread.sleep(4000); 1916 // assertElementPresentByXpath("//table[@class='uif-tableCollectionLayout dataTable']//tr[contains(td[1],'EAT')]"); 1917 // 1918 // //Currently No links available for Travel Account Type Inquiry so cant verify heading and values. 1919 // } 1920 1921 protected void testCategoryLookUp() throws Exception { 1922 waitForPageToLoad(); 1923 selectFrameIframePortlet(); 1924 waitAndClickByXpath("//button[contains(.,'earch')]"); 1925 Thread.sleep(3000); 1926 waitForPageToLoad(); 1927 findElement(By.tagName("body")).getText().contains("Actions"); // there are no actions, but the header is the only unique text from searching 1928 1929 // Category's don't have actions (yet) 1930 //waitAndClick("id=u80"); 1931 //waitForPageToLoad(); 1932 //waitAndClick("id=u86"); 1933 //waitForPageToLoad(); 1934 //selectWindow("null"); 1935 //waitAndClick("xpath=(//input[@name='imageField'])[2]"); 1936 //waitForPageToLoad(); 1937 //passed(); 1938 } 1939 1940 protected void testCreateSampleEDocLite() throws Exception { 1941 waitForPageToLoad(); 1942 Thread.sleep(3000); 1943 assertEquals("Kuali Portal Index", getTitle()); 1944 selectFrameIframePortlet(); 1945 waitAndClickByXpath("//input[@name='methodToCall.search' and @alt='search']"); 1946 waitForPageToLoad(); 1947 1948 // click on the create new. 1949 waitAndClickByLinkText("Create Document"); 1950 waitForPageToLoad(); 1951 Thread.sleep(3000); 1952 String docId = getTextByXpath("//table/tbody/tr[4]/td[@class='datacell1']"); 1953 waitAndTypeByName("userName", "Viral Chauhan"); 1954 waitAndTypeByName("rqstDate", "12/03/2020"); 1955 checkByName("fundedBy"); 1956 waitAndTypeByName("addText", "Note Added."); 1957 waitAndClickByXpath("//td[@class='datacell']/div/img"); 1958 waitAndClickByXpath("//input[@value='submit']"); 1959 assertEquals(Boolean.FALSE, (Boolean) isElementPresentByXpath("//input[@value='submit']")); 1960 assertEquals(Boolean.FALSE, (Boolean) isElementPresentByXpath("//input[@value='save']")); 1961 assertEquals(Boolean.FALSE, (Boolean) isElementPresentByXpath("//input[@value='cancel']")); 1962 waitForPageToLoad(); 1963 selectTopFrame(); 1964 waitAndClickDocSearch(); 1965 waitForPageToLoad(); 1966 selectFrameIframePortlet(); 1967 waitAndClickByXpath("//input[@name='methodToCall.search' and @alt='search']"); 1968 waitForElementPresent(By.linkText(docId)); 1969 } 1970 1971 protected void testTermLookUp() throws Exception { 1972 testLookUp(); 1973 assertTextPresent("Term Parameters"); 1974 waitAndClickCancelByText(); 1975 passed(); 1976 } 1977 1978 protected void testCreateNewRRDTravelRequestDestRouting() throws Exception { 1979 selectFrameIframePortlet(); 1980 1981 // Create new Routing Rules Delegation 1982 waitAndClick("img[alt=\"create new\"]"); 1983 1984 // Lookup parent rule, click lookup icon 1985 waitAndClickByName( 1986 "methodToCall.performLookup.(!!org.kuali.rice.kew.rule.RuleBaseValues!!).(((id:parentRuleId))).((``)).((<>)).(([])).((**)).((^^)).((&&)).((//)).((~~)).(::::;;::::).anchor"); 1987 1988 // Search 1989 waitAndClickByXpath("//td[@class='infoline']/input[@name='methodToCall.search']"); 1990 1991 // return value for 1046 TravelRequest.Destination.LasVegas TravelRequest-DestinationRouting 1992 waitAndClick("a[title=\"return valueRule Id=1046 \"]"); 1993 1994 // Select the parent rule we just returned 1995 waitAndClickByName("parentResponsibilityId"); 1996 1997 // Click continue 1998 waitAndClickByName("methodToCall.createDelegateRule"); 1999 2000 waitAndClickCancel(); 2001 waitAndClickByName("methodToCall.processAnswer.button0"); 2002 waitForPageToLoad(); 2003 driver.switchTo().defaultContent(); 2004 waitAndClickByXpath("(//input[@name='imageField'])[2]"); 2005 passed(); 2006 } 2007 2008 protected void testWorkFlowRouteRulesCreateNew() throws Exception { 2009 waitForPageToLoad(); 2010 Thread.sleep(5000); 2011 assertEquals("Kuali Portal Index", getTitle()); 2012 selectFrameIframePortlet(); 2013 waitAndClickCreateNew(); 2014 waitAndClickByName(CANCEL_NAME, "https://jira.kuali.org/browse/KULRICE-8161 Work Flow Route Rules cancel new yields 404 not found"); 2015 2016 // KULRICE-7753 : WorkFlowRouteRulesIT cancel confirmation missing from create new Route Rules. 2017 waitAndClickByName("methodToCall.processAnswer.button0"); 2018 passed(); 2019 } 2020 2021 /** 2022 * tests that a Routing Rule maintenance document is created for an edit operation originating 2023 * from a lookup screen 2024 */ 2025 protected void testWorkFlowRouteRulesEditRouteRules() throws Exception { 2026 waitForPageToLoad(); 2027 assertEquals("Kuali Portal Index", getTitle()); 2028 selectFrameIframePortlet(); 2029 waitAndClickSearch(); 2030 waitAndClickEdit(); 2031 waitForPageToLoad(); 2032 selectFrameIframePortlet(); 2033 waitAndClickCancel(); 2034 waitAndClickByName("methodToCall.processAnswer.button0"); 2035 passed(); 2036 } 2037 2038 /** 2039 * Look at the Location*Aft classes for the current best practices on implementing this method 2040 * @throws InterruptedException 2041 */ 2042 protected void createNewEnterDetails() throws InterruptedException { 2043 // overload to utilize 2044 fail("createNewEnterDetails must be implemented by test class"); 2045 } 2046 2047 /** 2048 * Look at the Location*Aft classes for the current best practices on implementing this method 2049 * @throws InterruptedException 2050 */ 2051 protected void createNewLookupDetails() throws InterruptedException { 2052 // overload to utilize 2053 fail("createNewLookupDetails must be implemented by test class"); 2054 } 2055 2056// protected String createNewTemplateMethod() throws InterruptedException { 2057// waitAndCreateNew(); 2058// String docId = waitForDocId(); 2059// 2060// createNewEnterDetails(); 2061// 2062// // Ad Hoc Recipients with current user to test Action List 2063// addAdHocRecipientsPerson(new String[]{getUserName(), "F"}); // FYI 2064// 2065// waitAndClickSave(); 2066// waitAndClickSubmit(); 2067// waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, CREATE_NEW_DOCUMENT_NOT_SUBMITTED_SUCCESSFULLY_MESSAGE_TEXT); 2068// 2069// // Action List 2070// assertActionList(docId, "F", "ENROUTE"); // FYI 2071// 2072// assertDocSearch(docId, DOC_STATUS_FINAL); 2073// selectTopFrame(); 2074// return docId; 2075// } 2076// 2077// protected String createNewTemplateMethodNoAction() throws InterruptedException { 2078// waitAndCreateNew(); 2079// String docId = waitForDocId(); 2080// 2081// createNewEnterDetails(); 2082// 2083// waitAndClickSave(); 2084// waitAndClickSubmit(); 2085// waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, CREATE_NEW_DOCUMENT_NOT_SUBMITTED_SUCCESSFULLY_MESSAGE_TEXT); 2086// 2087// assertDocSearch(docId, DOC_STATUS_FINAL); 2088// selectTopFrame(); 2089// return docId; 2090// } 2091 2092 protected void waitAndClickActionList() throws InterruptedException { 2093 WebDriverUtils.jGrowl(driver, "Click Action List", false, "Click Action List"); 2094 selectTopFrame(); 2095 waitAndClickByXpath("//img[@alt='action list']"); 2096 } 2097 2098 protected void testLookUpComponent(String docId, String componentName, String componentCode) throws Exception { 2099 selectFrameIframePortlet(); 2100 //Lookup 2101 waitAndTypeByName("name", componentName); 2102 waitAndClickSearch(); 2103 isElementPresentByLinkText(componentName); 2104 waitAndClickByLinkText(componentName); 2105 waitForPageToLoad(); 2106 Thread.sleep(2000); 2107 switchToWindow("Kuali :: Inquiry"); 2108 Thread.sleep(2000); 2109 assertEquals(componentName, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim()); 2110 assertEquals(componentCode, getTextByXpath("//div[@class='tab-container']/table//span[@id='code.div']").trim()); 2111 waitAndClickCloseWindow(); 2112 switchToWindow("null"); 2113 } 2114 2115 protected void testEditComponent(String docId, String componentName, String componentCode) throws Exception { 2116 selectFrameIframePortlet(); 2117 waitAndClickEdit(); 2118 waitForPageToLoad(); 2119 docId = waitForDocId(); 2120 waitAndTypeByName("document.documentHeader.documentDescription", "Editing Test Component"); 2121 clearTextByName("document.newMaintainableObject.name"); 2122 waitAndTypeByName("document.newMaintainableObject.name", componentName); 2123 waitAndClickSave(); 2124 waitAndClickSubmit(); 2125 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 2126 assertDocSearch(docId, DOC_STATUS_FINAL); 2127 selectTopFrame(); 2128 } 2129 2130 protected void testCopyComponent(String docId, String componentName, String componentCode) throws Exception { 2131 selectFrameIframePortlet(); 2132 waitAndClickCopy(); 2133 waitForPageToLoad(); 2134 docId = waitForDocId(); 2135 waitAndTypeByName("document.documentHeader.documentDescription", "Copying Test Component"); 2136 selectOptionByName("document.newMaintainableObject.namespaceCode", "KR-IDM"); 2137 waitAndTypeByName("document.newMaintainableObject.code", componentCode); 2138 clearTextByName("document.newMaintainableObject.name"); 2139 waitAndTypeByName("document.newMaintainableObject.name", componentName); 2140 waitAndClickSave(); 2141 waitAndClickSubmit(); 2142 waitForPageToLoad(); 2143 checkForDocError(); 2144 waitForElementPresentByXpath(DOC_SUBMIT_SUCCESS_MSG_XPATH, "Document is not submitted successfully"); 2145 assertDocSearch(docId, DOC_STATUS_FINAL); 2146 selectTopFrame(); 2147 } 2148 2149 protected void testVerifyCopyComponent(String docId, String componentName, String componentCode) throws Exception { 2150 selectFrameIframePortlet(); 2151 waitAndTypeByName("name", componentName); 2152 waitAndClickSearch(); 2153 isElementPresentByLinkText(componentName); 2154 waitAndClickByLinkText(componentName); 2155 waitForPageToLoad(); 2156 Thread.sleep(2000); 2157 switchToWindow("Kuali :: Inquiry"); 2158 Thread.sleep(2000); 2159 assertEquals(componentName, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim()); 2160 assertEquals(componentCode, getTextByXpath("//div[@class='tab-container']/table//span[@id='code.div']").trim()); 2161 waitAndClickCloseWindow(); 2162 switchToWindow("null"); 2163 } 2164 2165 protected void testMultiValueSelectAllPages() throws InterruptedException { 2166 waitAndClickButtonByText(SEARCH); 2167 assertButtonDisabledByText(RETURN_SELECTED_BUTTON_TEXT); 2168 2169 // select all, all checkboxes should be checked and return button enabled 2170 waitAndClickDropDown("select all items"); 2171 if (!areAllMultiValueSelectsChecked()) { 2172 JiraAwareFailureUtils.fail("select all items failure", this); 2173 } 2174 assertButtonEnabledByText(RETURN_SELECTED_BUTTON_TEXT); 2175 2176 boolean anotherPageOfResults = false; 2177 if (Integer.parseInt(multiValueResultCount()) > 10) { 2178 anotherPageOfResults = true; 2179 } 2180 2181 // all should be checked and button enabled on the next page as well (server side paging) 2182 if (!anotherPageOfResults) { 2183 JiraAwareFailureUtils.fail("select all items server side paging failure not enough results for next page", 2184 this); 2185 } 2186 waitAndClickByLinkText("Next"); 2187 2188 if (!areAllMultiValueSelectsChecked()) { 2189 JiraAwareFailureUtils.fail("select all items server side paging failure", this); 2190 } 2191 assertButtonEnabledByText(RETURN_SELECTED_BUTTON_TEXT); 2192 2193 // deselect all no checkboxes should be checked and return button disabled 2194 waitAndClickDropDown("deselect all items"); 2195 if (!areNoMultiValueSelectsChecked()) { 2196 JiraAwareFailureUtils.fail("deselect all items failure", this); 2197 } 2198 assertButtonDisabledByText(RETURN_SELECTED_BUTTON_TEXT); 2199 2200 waitAndClickByLinkText("Previous"); 2201 if (!areNoMultiValueSelectsChecked()) { 2202 JiraAwareFailureUtils.fail("deselect all items failure", this); 2203 } 2204 assertButtonDisabledByText(RETURN_SELECTED_BUTTON_TEXT); 2205 } 2206 2207 protected void acceptAlert() { 2208 if (!WebDriverUtils.isAlertPresent(driver)) { 2209 fail("Alert expected but not present for " + this.getClass().getName()); 2210 } 2211 WebDriverUtils.alertAccept(driver); 2212 } 2213 2214 protected void testMultiValueSelectAllThisPage() throws InterruptedException { 2215 waitAndClickButtonByText(SEARCH); 2216 assertButtonDisabledByText(RETURN_SELECTED_BUTTON_TEXT); 2217 2218 // select all on this page, all checkboxes should be checked and return button enabled 2219 assertMultiValueSelectAllThisPage(); 2220 2221 boolean anotherPageOfResults = false; 2222 if (Integer.parseInt(multiValueResultCount()) > 5) { 2223 anotherPageOfResults = true; 2224 } 2225 2226 // the next page should not have any checkboxes checked return button should still be enabled 2227 waitAndClickByLinkText("Next"); 2228 if (!areNoMultiValueSelectsChecked()) { 2229 if (anotherPageOfResults) { 2230 JiraAwareFailureUtils.fail("select all items on this page failure", this); 2231 } else { 2232 JiraAwareFailureUtils.fail("select all items on this page failure not enough results for next page", 2233 this); 2234 } 2235 } 2236 assertButtonEnabledByText(RETURN_SELECTED_BUTTON_TEXT); 2237 2238 // back to the previous page, checkboxes should be checked and return button enabled still 2239 waitAndClickByLinkText("Previous"); 2240 if (!areAllMultiValueSelectsChecked()) { 2241 JiraAwareFailureUtils.fail("select all items on previous page failure", this); 2242 } 2243 2244 // deselect no checkboxes should be checked and the return button should be disabled 2245 assertMultiValueDeselectAllThisPage(); 2246 } 2247 2248 /** 2249 * Test the external help on the section and fields 2250 */ 2251 protected void testExternalHelp2() throws Exception { 2252 // test external help of section 2253 assertPopUpWindowUrl(By.cssSelector("input[title=\"Help for External Help\"]"), "HelpWindow", 2254 "http://www.kuali.org/?section"); 2255 2256 // test external help of field with label left 2257 assertPopUpWindowUrl(By.xpath("//div[@id='field-label-left-external-help']/fieldset/input[@title='Help for Field Label']"), "HelpWindow", 2258 "http://www.kuali.org/?label_left"); 2259 2260 // test external help of field with label right 2261 assertPopUpWindowUrl(By.xpath("//div[@id='field-label-right-external-help']/fieldset/input[@title='Help for Field Label']"), "HelpWindow", 2262 "http://www.kuali.org/?label_right"); 2263 2264 // test external help of field with label top and help URL from system parameters 2265 assertPopUpWindowUrl(By.xpath("//div[@id='field-label-top-external-help']/fieldset/input[@title='Help for Field Label']"), "HelpWindow", 2266 "http://www.kuali.org/?system_parm"); 2267 2268 // test external help of standalone help widget 2269 assertPopUpWindowUrl(By.id("standalone-external-help"), "HelpWindow", "http://www.kuali.org/?widget_only"); 2270 } 2271 2272 /** 2273 * Test the external help on the sub-section and display only fields 2274 */ 2275 2276 protected void testDisplayOnlyExternalHelp2() throws Exception { 2277 // test external help of sub-section 2278 assertPopUpWindowUrl(By.cssSelector("input[title=\"Help for Display only fields\"]"), "HelpWindow", "http://www.kuali.org/?sub_section"); 2279 2280 // test external help of display only data field 2281 assertPopUpWindowUrl(By.xpath( 2282 "//div[@id='display-field-external-help']/fieldset/input[@title='Help for Field Label']"), "HelpWindow", 2283 "http://www.kuali.org/?display_field"); 2284 } 2285 2286 /** 2287 * Test the external help on the section and fields with missing help URL 2288 */ 2289 2290 protected void testMissingExternalHelp2() throws Exception { 2291 // test external help of section is not rendered 2292 assertFalse(isElementPresent(By.cssSelector("input[title=\"Help for Missing External Help\"]"))); 2293 2294 // test external help of field with blank externalHelpURL is not rendered 2295 assertFalse(isElementPresentByXpath("//div[@id='external-help-externalHelpUrl-empty']/*[@class='uif-helpImage']")); 2296 2297 // test external help of field with empty helpDefinition is not rendered 2298 assertFalse(isElementPresentByXpath("//div[@id='external-help-helpdefinition-empty']/*[@class='uif-helpImage']")); 2299 2300 // test external help of field with missing system parameter is not rendered 2301 assertFalse(isElementPresentByXpath("//div[@id='external-help-system-parm-missing']/*[@class='uif-helpImage']")); 2302 2303 // test external help of standalone help widget is not rendered 2304 assertFalse(isElementPresentByXpath("//div[@id='standalone-external-help-missing']")); 2305 } 2306 2307 private String searchForAvailableCode(int codeLength) throws InterruptedException { 2308 String randomCode = RandomStringUtils.randomAlphabetic(codeLength).toUpperCase(); 2309 waitAndTypeByName("code", randomCode); 2310 waitAndClickSearch(); 2311 int attemptCount = 1; 2312 waitForTextPresent("You have entered the primary key for this table"); 2313 while (!isTextPresent("No values match this search.") && attemptCount < 25) { 2314 randomCode = Character.toString((char) (randomCode.toCharArray()[0] + attemptCount++)); 2315 clearTextByName("code"); 2316 waitAndTypeByName("code", randomCode); 2317 waitAndClickSearch(); 2318 waitForTextPresent("You have entered the primary key for this table"); 2319 } 2320 return randomCode; 2321 } 2322 2323 protected void testSearchEditCancel() throws InterruptedException { 2324 selectFrameIframePortlet(); 2325 waitAndClickSearch2(); 2326 waitAndClickEdit(); 2327 testCancelConfirmation(); 2328 } 2329 2330 protected void testServerErrorsIT() throws Exception { 2331 waitAndClickByXpath("//button[contains(.,'Get Error Messages')]"); 2332 waitForElementPresent("div[data-messages_for=\"Demo-ValidationLayout-SectionsPage\"] .uif-errorMessageItem-field"); 2333 waitIsVisibleByXpath("//header[@data-header_for='Demo-ValidationLayout-Section1']"); 2334 assertElementPresentByXpath("//*[@data-messageitemfor='Demo-ValidationLayout-Section1' and @class='uif-errorMessageItem']"); 2335 assertElementPresent("div[data-role=\"InputField\"] img[alt=\"Error\"]"); 2336 assertElementPresentByXpath("//a[contains(.,'Section 1 Title')]"); 2337 fireMouseOverEventByXpath("//a[contains(.,'Field 1')]"); 2338 assertElementPresent(".uif-errorMessageItem-field"); 2339 waitAndClickByXpath("//a[contains(.,'Field 1')]"); 2340 waitIsVisible(".popover"); 2341 waitIsVisible(".popover-content > .uif-serverMessageItems"); 2342 waitIsVisible(".popover-content > .uif-serverMessageItems .uif-errorMessageItem-field"); 2343 waitAndTypeByName("field1", ""); 2344 fireEvent("field1", "blur"); 2345 fireEvent("field1", "focus"); 2346 waitIsVisible(".popover"); 2347 waitIsVisible(".popover-content > .uif-serverMessageItems .uif-errorMessageItem-field"); 2348 waitIsVisible(".popover-content > .uif-clientMessageItems"); 2349 waitIsVisible(".popover-content > .uif-clientMessageItems .uif-errorMessageItem-field"); 2350 waitAndTypeByName("field1", "t"); 2351 2352 for (int second = 0;; second++) { 2353 if (second >= waitSeconds) { 2354 jiraAwareFail(TIMEOUT_MESSAGE); 2355 } 2356 try { 2357 if (!isElementPresent(".popover-content > .uif-clientMessageItems")) { 2358 break; 2359 } 2360 } catch (Exception e) {} 2361 Thread.sleep(1000); 2362 } 2363 2364 waitIsVisible(".popover-content > .uif-serverMessageItems .uif-errorMessageItem-field"); 2365 assertFalse(isElementPresent(".popover-content > .uif-clientMessageItems")); 2366 } 2367 2368 protected void testServerInfoIT() throws Exception { 2369 waitAndClickByXpath("//button[contains(.,'Get Info Messages')]"); 2370 waitIsVisibleByXpath("//div[@data-messages_for='Demo-ValidationLayout-SectionsPage']"); 2371 waitForProgressLoading(); 2372 assertTrue(isVisibleByXpath("//div[@data-messages_for='Demo-ValidationLayout-SectionsPage']")); 2373 assertTrue(isElementPresent( 2374 "div[data-messages_for=\"Demo-ValidationLayout-SectionsPage\"] .uif-infoMessageItem")); 2375 assertTrue(isVisible("div[data-messages_for=\"Demo-ValidationLayout-Section1\"]")); 2376 assertTrue(isElementPresent("div[data-messages_for=\"Demo-ValidationLayout-Section1\"] .uif-infoMessageItem")); 2377 assertTrue(isElementPresentByXpath("//div[@data-role='InputField']//img[@alt='Information']")); 2378 fireMouseOverEventByXpath("//a[contains(.,'Field 1')]"); 2379 assertTrue(isElementPresent(".uif-infoHighlight")); 2380 waitAndClickByXpath("//a[contains(.,'Field 1')]"); 2381 waitForElementPresentByXpath("//div[@class='popover top in uif-tooltip-info-ss']"); 2382 waitAndTypeByName("field1", ""); 2383 fireEvent("field1", "blur"); 2384 fireEvent("field1", "focus"); 2385 waitForElementPresentByXpath("//div[@class='popover uif-tooltip-info-ss top in uif-tooltip-error-ss']"); 2386 waitAndTypeByName("field1", "b"); 2387 fireEvent("field1", "blur"); 2388 fireEvent("field1", "focus"); 2389 waitForElementPresentByXpath("//div[@class='popover uif-tooltip-error-ss top in uif-tooltip-info-ss']"); 2390 fireEvent("field1", "focus"); 2391 clearTextByName("field1"); 2392 fireEvent("field1", "blur"); 2393 waitForElementPresentByXpath("//div[@class='popover uif-tooltip-info-ss top in uif-tooltip-error-ss']"); 2394 } 2395 2396 protected void testServerWarningsIT() throws Exception { 2397 waitAndClickByXpath("//button[contains(.,'Get Warning Messages')]"); 2398 waitForElementPresentByXpath("//div[@id='Demo-ValidationLayout-SectionsPage_messages']"); 2399 waitForElementPresentByXpath("//div[@id='Demo-ValidationLayout-Section1_messages']"); 2400 waitForElementPresentByXpath("//a[contains(.,'Field 1')]"); 2401 fireMouseOverEventByXpath("//a[contains(.,'Field 1')]"); 2402 waitForElementPresentByXpath( 2403 "//div[@class='uif-inputField uif-boxLayoutHorizontalItem uif-hasWarning uif-warningHighlight']"); 2404 waitAndClickByXpath("//a[contains(.,'Field 1')]"); 2405 waitForElementPresentByXpath("//div[@class='popover uif-tooltip-warning-ss top in uif-tooltip-error-ss']"); 2406 waitAndTypeByName("field1", ""); 2407 fireEvent("field1", "blur"); 2408 fireMouseOverEventByName("field1"); 2409 waitForElementPresentByXpath("//div[@class='popover uif-tooltip-warning-ss top in uif-tooltip-error-ss']"); 2410 waitAndTypeByName("field1", "b"); 2411 fireEvent("field1", "blur"); 2412 fireMouseOverEventByName("field1"); 2413 waitForElementPresentByXpath("//div[@class='popover uif-tooltip-warning-ss top in uif-tooltip-error-ss']"); 2414 clearTextByName("field1"); 2415 fireEvent("field1", "blur"); 2416 fireMouseOverEventByName("field1"); 2417 waitForElementPresentByXpath("//div[@class='popover uif-tooltip-warning-ss top in uif-tooltip-error-ss']"); 2418 passed(); 2419 } 2420 2421 /** 2422 * Test the tooltip and external help on the view 2423 */ 2424 protected void testViewHelp2() throws Exception { 2425 // test tooltip help 2426 if (isElementPresentByXpath("//td[@class='jquerybubblepopup-innerHtml']")) { 2427 assertFalse(findElement(By.cssSelector("td.jquerybubblepopup-innerHtml")).isDisplayed()); 2428 } 2429 2430 // test tooltip help 2431 fireMouseOverEventByXpath("//h1/span[@class='uif-headerText-span']"); 2432 Thread.sleep(2000); 2433 assertTrue(isVisibleByXpath("//td[contains(text(),'View help')]")); 2434 assertPopUpWindowUrl(By.cssSelector("input[title=\"Help for Configuration Test View\"]"), "HelpWindow", "http://www.kuali.org/"); 2435 } 2436 2437 protected void testVerifyAddDeleteFiscalOfficerLegacy() throws Exception { 2438 selectFrameIframePortlet(); 2439 waitAndTypeByName("document.documentHeader.documentDescription", AutomatedFunctionalTestUtils 2440 .createUniqueDtsPlusTwoRandomChars()); 2441 waitAndTypeByName("newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].number","1234567890"); 2442 waitAndTypeByName("newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].foId", "2"); 2443 waitAndClickByXpath("//button[@data-loadingmessage='Adding Line...']"); 2444 waitForElementPresentByName("document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].number"); 2445 assertEquals("1234567890", waitAndGetAttributeByName( 2446 "document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].number", "value")); 2447 assertEquals("2", waitAndGetAttributeByName( 2448 "document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].foId", "value")); 2449 waitAndClickByXpath("//button[@data-loadingmessage='Deleting Line...']"); 2450 Thread.sleep(3000); 2451 assertEquals(Boolean.FALSE, (Boolean) isElementPresentByName( 2452 "document.newMaintainableObject.dataObject.fiscalOfficer.accounts[0].number")); 2453 passed(); 2454 } 2455 2456 protected void testVerifyAddDeleteNoteLegacy() throws Exception { 2457 selectFrameIframePortlet(); 2458 waitAndClick( 2459 "div.tableborders.wrap.uif-boxLayoutVerticalItem.clearfix span.uif-headerText-span > img.uif-disclosure-image"); 2460 waitForElementPresent("button[title='Add a Note'].uif-action.uif-primaryActionButton.uif-smallActionButton"); 2461 waitAndClickByName("newCollectionLines['document.notes'].noteText"); 2462 waitAndTypeByName("newCollectionLines['document.notes'].noteText", "Test note"); 2463 waitAndClick("button[title='Add a Note'].uif-action.uif-primaryActionButton.uif-smallActionButton"); 2464 // waitForElementPresentByName("document.notes[0].noteText"); 2465 assertEquals("Test note", getTextByXpath("//pre")); 2466 waitAndClick("button[title='Delete a Note'].uif-action.uif-primaryActionButton.uif-smallActionButton"); 2467 assertEquals(Boolean.FALSE, (Boolean) isElementPresentByName("document.notes[0].noteText")); 2468 passed(); 2469 } 2470 2471 protected void testVerifyAdHocRecipientsLegacy() throws Exception { 2472 selectFrameIframePortlet(); 2473 waitAndClickByLinkText("Fiscal Officer Accounts"); 2474 assertElementPresentByXpath( 2475 "//select[@name=\"newCollectionLines['document.adHocRoutePersons'].actionRequested\"]"); 2476 assertElementPresentByXpath( 2477 "//input[@name=\"newCollectionLines['document.adHocRoutePersons'].name\" and @type=\"text\"]"); 2478 assertElementPresentByXpath( 2479 "//select[@name=\"newCollectionLines['document.adHocRouteWorkgroups'].actionRequested\"]"); 2480 assertElementPresentByXpath( 2481 "//input[@name=\"newCollectionLines['document.adHocRouteWorkgroups'].recipientNamespaceCode\" and @type='text']"); 2482 assertElementPresentByXpath( 2483 "//input[@name=\"newCollectionLines['document.adHocRouteWorkgroups'].recipientName\" and @type='text']"); 2484 passed(); 2485 } 2486 2487 protected void testVerifyButtonsLegacy() throws Exception { 2488 selectFrameIframePortlet(); 2489 assertElementPresentByXpath("//button[contains(.,'ubmit')]"); 2490 assertElementPresentByXpath("//button[contains(.,'ave')]"); 2491 assertElementPresentByXpath("//button[contains(.,'lanket approve')]"); 2492 assertElementPresentByXpath("//button[contains(.,'lose')]"); 2493 assertElementPresentByXpath("//a[contains(.,'ancel')]"); 2494 passed(); 2495 } 2496 2497 protected void testVerifyConstraintText() throws Exception { 2498 selectFrameIframePortlet(); 2499 assertEquals("* indicates required field", getText( 2500 "div.uif-boxLayout.uif-horizontalBoxLayout.clearfix > span.uif-message.uif-requiredInstructionsMessage.uif-boxLayoutHorizontalItem")); 2501 assertEquals("Must not be more than 10 characters", getText( 2502 "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")); 2503 assertEquals("Must not be more than 10 characters", getText( 2504 "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")); 2505 assertEquals("Must not be more than 10 characters", getText( 2506 "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")); 2507 passed(); 2508 } 2509 2510 protected void testVerifyEditedComponent(String docId, String componentName, String componentCode) throws Exception { 2511 selectFrameIframePortlet(); 2512 waitAndTypeByName("name", componentName); 2513 waitAndClickSearch(); 2514 isElementPresentByLinkText(componentName); 2515 waitAndClickByLinkText(componentName); 2516 waitForPageToLoad(); 2517 Thread.sleep(2000); 2518 switchToWindow("Kuali :: Inquiry"); 2519 Thread.sleep(2000); 2520 assertEquals(componentName, getTextByXpath("//div[@class='tab-container']/table//span[@id='name.div']").trim()); 2521 assertEquals(componentCode, getTextByXpath("//div[@class='tab-container']/table//span[@id='code.div']").trim()); 2522 waitAndClickCloseWindow(); 2523 switchToWindow("null"); 2524 List<String> parameterList=new ArrayList<String>(); 2525 } 2526 2527 protected void testVerifyDisclosures() throws Exception { 2528 selectFrameIframePortlet(); 2529 assertElementPresentByXpath("//span[contains(text(),'Document Overview')]"); 2530 assertElementPresentByXpath("//span[contains(text(),'Document Overview')]"); 2531 assertElementPresentByXpath("//span[contains(text(),'Account Information')]"); 2532 assertElementPresentByXpath("//span[contains(text(),'Fiscal Officer Accounts')]"); 2533 assertElementPresentByXpath("//span[contains(text(),'Notes and Attachments')]"); 2534 assertElementPresentByXpath("//span[contains(text(),'Ad Hoc Recipients')]"); 2535 assertElementPresentByXpath("//span[contains(text(),'Route Log')]"); 2536 colapseExpandByXpath("//span[contains(text(),'Document Overview')]//img", 2537 "//label[contains(text(),'Organization Document Number')]"); 2538 colapseExpandByXpath("//span[contains(text(),'Account Information')]//img", 2539 "//label[contains(text(),'Travel Account Type Code')]"); 2540 colapseExpandByXpath("//span[contains(text(),'Fiscal Officer Accounts')]//img", 2541 "//a[contains(text(),'Lookup/Add Multiple Lines')]"); 2542 expandColapseByXpath("//span[contains(text(),'Notes and Attachments')]//img", 2543 "//label[contains(text(),'Note Text')]"); 2544 expandColapseByXpath("//span[contains(text(),'Ad Hoc Recipients')]", 2545 "//span[contains(text(),'Ad Hoc Group Requests')]"); 2546 2547 // Handle frames 2548 waitAndClickByXpath("//span[contains(text(),'Route Log')]//img"); 2549 selectFrame("routeLogIFrame"); 2550 waitIsVisibleByXpath("//img[@alt='refresh']"); 2551 2552 // relative=top iframeportlet might look weird but either alone results in something not found. 2553 selectTopFrame(); 2554 selectFrameIframePortlet(); 2555 waitAndClickByXpath("//span[contains(text(),'Route Log')]//img"); 2556 selectFrame("routeLogIFrame"); 2557 waitNotVisibleByXpath("//img[@alt='refresh']"); 2558 passed(); 2559 } 2560 2561 protected void testVerifyDocumentOverviewLegacy() throws Exception { 2562 selectFrameIframePortlet(); 2563 assertTextPresent("Document Overview"); 2564 assertElementPresentByXpath("//input[@name='document.documentHeader.documentDescription']"); 2565 assertElementPresentByXpath("//input[@name='document.documentHeader.organizationDocumentNumber']"); 2566 assertElementPresentByXpath("//textarea[@name='document.documentHeader.explanation']"); 2567 passed(); 2568 } 2569 2570 protected void testVerifyExpandCollapse() throws Exception { 2571 selectFrameIframePortlet(); 2572 assertElementPresentByXpath("//button[contains(@class, 'uif-expandDisclosuresButton')]"); 2573 assertElementPresentByXpath("//button[contains(@class, 'uif-collapseDisclosuresButton')]"); 2574 passed(); 2575 } 2576 2577 protected void testVerifyFieldsLegacy() throws Exception { 2578 selectFrameIframePortlet(); 2579 assertElementPresentByXpath("//input[@name='document.newMaintainableObject.dataObject.number' and @type='text' and @size=10 and @maxlength=10]"); 2580 assertElementPresentByXpath("//input[@name='document.newMaintainableObject.dataObject.extension.accountTypeCode' and @type='text' and @size=2 and @maxlength=3]"); 2581 assertElementPresentByXpath( 2582 "//input[@name='document.newMaintainableObject.dataObject.subAccount' and @type='text' and @size=10 and @maxlength=10]"); 2583 assertElementPresentByXpath("//input[@name='document.newMaintainableObject.dataObject.subsidizedPercent' and @type='text' and @size=6 and @maxlength=20]"); 2584 assertElementPresentByXpath( 2585 "//input[@name='document.newMaintainableObject.dataObject.foId' and @type='text' and @size=5 and @maxlength=10]"); 2586 assertElementPresentByXpath( 2587 "//input[@name=\"newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].number\" and @type='text' and @size=10 and @maxlength=10]"); 2588 assertElementPresentByXpath( 2589 "//input[@name=\"newCollectionLines['document.newMaintainableObject.dataObject.fiscalOfficer.accounts'].foId\" and @type='text' and @size=5 and @maxlength=10]"); 2590 passed(); 2591 } 2592 2593 protected void testVerifyHeaderFieldsLegacy() throws Exception { 2594 selectFrameIframePortlet(); 2595 assertElementPresentByXpath("//div[contains(@class, 'uif-documentNumber')]"); 2596 assertElementPresentByXpath("//div[contains(@class, 'uif-documentInitiatorNetworkId')]"); 2597 assertElementPresentByXpath("//div[contains(@class, 'uif-documentStatus')]"); 2598 assertElementPresentByXpath("//div[contains(@class, 'uif-documentCreateDate')]"); 2599 passed(); 2600 } 2601 2602 protected void testVerifyLookupAddMultipleLinesLegacy() throws Exception { 2603 selectFrameIframePortlet(); 2604 assertElementPresentByXpath("//a[contains(text(),'Lookup/Add Multiple Lines')]"); 2605 passed(); 2606 } 2607 2608 protected void testVerifyNotesAndAttachments() throws Exception { 2609 selectFrameIframePortlet(); 2610 waitAndClickByXpath("//span[contains(text(),'Notes and Attachments')]"); 2611 waitForElementPresentByXpath("//button[@title='Add a Note']"); 2612 assertElementPresentByXpath("//span[contains(text(),'Notes and Attachments')]"); 2613 assertElementPresentByXpath("//textarea[@name=\"newCollectionLines['document.notes'].noteText\"]"); 2614 assertElementPresentByXpath("//input[@name='attachmentFile']"); 2615 2616 //assertElementPresentByXpath("//input[@name=\"newCollectionLines['document.notes'].attachment.attachmentTypeCode\"]"); 2617 passed(); 2618 } 2619 2620 protected void testVerifyQuickfinderIconsLegacy() throws Exception { 2621 selectFrameIframePortlet(); 2622 assertTextPresent("Document Overview"); 2623 assertElementPresentByXpath("//*[@id='quickfinder1']"); 2624 assertElementPresentByXpath("//*[@id='quickfinder2']"); 2625 assertElementPresentByXpath("//*[@id='quickfinder3']"); 2626 assertElementPresentByXpath("//*[@id='quickfinder4_add']"); 2627 2628 // TODO it would be better to test that the image isn't 404 2629 passed(); 2630 } 2631 2632 protected void testVerifyRouteLog() throws Exception { 2633 selectFrameIframePortlet(); 2634 waitAndClickByLinkText("Route Log"); 2635 waitForElementPresent("//iframe[contains(@src,'RouteLog.do')]"); 2636 passed(); 2637 } 2638 2639 protected void testVerifySave() throws Exception { 2640 selectFrameIframePortlet(); 2641 waitAndTypeByName("document.documentHeader.documentDescription", 2642 "Test Document " + AutomatedFunctionalTestUtils.DTS); 2643 waitAndClickByName("document.newMaintainableObject.dataObject.number"); 2644 waitAndTypeByName("document.newMaintainableObject.dataObject.number", "1234567890"); 2645 waitAndTypeByName("document.newMaintainableObject.dataObject.extension.accountTypeCode", "EAT"); 2646 waitAndTypeByName("document.newMaintainableObject.dataObject.subAccount", "a1"); 2647 waitAndClick( 2648 "button[data-loadingmessage='Saving...'].uif-action.uif-primaryActionButton.uif-boxLayoutHorizontalItem"); 2649 Thread.sleep(2000); 2650 2651 // checkErrorMessageItem(" also digit validation jira https://jira.kuali.org/browse/KULRICE-8038"); 2652 passed(); 2653 } 2654 2655 protected void testVerifySubsidizedPercentWatermarkLegacy() throws Exception { 2656 selectFrameIframePortlet(); 2657 2658 // May be blowing up due to multiple locators 2659 //assertTrue(isElementPresent("//input[@name='document.newMaintainableObject.dataObject.subsidizedPercent' and @type='text' and @placeholder='##.## ']")); 2660 assertElementPresentByXpath("//input[@name='document.newMaintainableObject.dataObject.subsidizedPercent']"); 2661 passed(); 2662 } 2663 2664 protected void typeEnter() { 2665 jGrowl("Press Enter"); 2666 driver.switchTo().activeElement().sendKeys(Keys.ENTER); 2667 } 2668 2669 protected void typeTab() { 2670 jGrowl("Press Tab"); 2671 driver.switchTo().activeElement().sendKeys(Keys.TAB); 2672 } 2673 2674 protected void uncheck(By by) throws InterruptedException { 2675 WebElement element = findElement(by); 2676 if (element.isSelected()) { 2677 element.click(); 2678 } 2679 } 2680 2681 protected void uncheckByName(String name) throws InterruptedException { 2682 uncheck(By.name(name)); 2683 } 2684 2685 protected void uncheckByXpath(String locator) throws InterruptedException { 2686 uncheck(By.xpath(locator)); 2687 } 2688 2689 protected void verifyRichMessagesValidationBasicFunctionality() throws Exception { 2690 assertTrue(isElementPresentByXpath("//input[@type='text' and @name='field1']")); 2691 assertTrue(isElementPresentByXpath("//a[contains(text(), 'Kuali')]")); 2692 assertTrue(isElementPresentByXpath("//input[@type='checkbox' and @name='field2']")); 2693 Thread.sleep(3000); 2694 } 2695 2696 protected void verifyRichMessagesValidationAdvancedFunctionality() throws Exception { 2697 //Color Options 2698 assertTrue(isElementPresentByXpath("//span[@style='color: green;']")); 2699 assertTrue(isElementPresentByXpath("//span[@style='color: blue;']")); 2700 2701 //Css class 2702 assertTrue(isElementPresentByXpath("//span[@class='uif-text-underline uif-text-larger']")); 2703 2704 //Combinations 2705 assertTrue(isElementPresentByXpath("//input[@type='text' and @name='field3']")); 2706 assertTrue(isElementPresentByXpath("//select[@name='field4']")); 2707 assertTrue(isElementPresentByXpath("//button[contains(text(), 'Action Button')]")); 2708 2709 //Rich Message Field 2710 assertTrue(isElementPresentByXpath("//label[contains(., 'Label With')]/span[contains(., 'Color')]")); 2711 assertTrue(isElementPresentByXpath("//label[contains(., 'Label With')]/i/b[contains(., 'Html')]")); 2712 assertTrue(isElementPresentByXpath("//label[contains(., 'Label With')]/img[@class='uif-image inlineBlock']")); 2713 Thread.sleep(3000); 2714 } 2715 2716 protected void verifyRichMessagesValidationLettersNumbersValidation() throws Exception { 2717 //For letters only Validation 2718 assertTrue(isElementPresentByXpath("//div[@data-parent='Demo-AdvancedMessagesSection']/div/input[@type='text' and @name='field5']")); 2719 waitAndTypeByXpath( 2720 "//div[@data-parent='Demo-AdvancedMessagesSection']/div/input[@type='text' and @name='field5']", "abc"); 2721 assertFalse(isElementPresentByXpath("//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock uif-hasError']")); 2722 clearTextByXpath( 2723 "//div[@data-parent='Demo-AdvancedMessagesSection']/div/input[@type='text' and @name='field5']"); 2724 waitAndTypeByXpath("//div[@data-parent='Demo-AdvancedMessagesSection']/div/input[@type='text' and @name='field5']","abc12"); 2725 waitAndTypeByXpath("//input[@name= 'field6']", ""); 2726 waitForElementPresentByXpath("//div[@class='uif-inputField inlineBlock uif-hasError']"); 2727 Thread.sleep(3000); 2728 clearTextByXpath("//div[@data-parent='Demo-AdvancedMessagesSection']/div/input[@type='text' and @name='field5']"); 2729 waitAndTypeByXpath("//div[@data-parent='Demo-AdvancedMessagesSection']/div/input[@type='text' and @name='field5']","abc"); 2730 waitAndTypeByXpath("//input[@name= 'field6']", ""); 2731 2732 //For numbers only validation 2733 waitAndTypeByXpath("//input[@name= 'field6']", "123"); 2734 assertFalse(isElementPresentByXpath("//div[@class='uif-field uif-inputField uif-inputField-labelTop inlineBlock uif-hasError']")); 2735 clearTextByXpath("//input[@name='field6']"); 2736 waitAndTypeByXpath("//input[@name='field6']", "123ab"); 2737 fireEvent("field6", "blur"); 2738 waitForElementPresentByXpath("//div[@class='uif-inputField inlineBlock uif-hasError']"); 2739 } 2740 2741 protected void verifyRichMessagesValidationRadioAndCheckBoxGroupFunctionality() throws Exception { 2742 //Radio Group 2743 assertTrue(isElementPresentByXpath("//fieldset[@class='uif-verticalRadioFieldset']/span/input[@type='radio' and @name='field24' and @value='1']")); 2744 assertTrue(isElementPresentByXpath( 2745 "//fieldset[@class='uif-verticalRadioFieldset']/span/input[@type='radio' and @name='field24' and @value='2']")); 2746 assertTrue(isElementPresentByXpath( 2747 "//fieldset[@class='uif-verticalRadioFieldset']/span/input[@type='radio' and @name='field24' and @value='3']")); 2748 assertTrue(isElementPresentByXpath( 2749 "//fieldset[@class='uif-verticalRadioFieldset']/span/input[@type='radio' and @name='field24' and @value='4']")); 2750 2751 //Checkbox Group 2752 assertTrue(isElementPresentByXpath( 2753 "//fieldset[@class='uif-verticalCheckboxesFieldset']/span/input[@type='checkbox' and @name='field115' and @value='1']")); 2754 assertTrue(isElementPresentByXpath( 2755 "//fieldset[@class='uif-verticalCheckboxesFieldset']/span/input[@type='checkbox' and @name='field115' and @value='2']")); 2756 assertTrue(isElementPresentByXpath( 2757 "//fieldset[@class='uif-verticalCheckboxesFieldset']/span/input[@type='checkbox' and @name='field115' and @value='3']")); 2758 assertTrue(isElementPresentByXpath( 2759 "//fieldset[@class='uif-verticalCheckboxesFieldset']/span/label/div/select[@name='field4']")); 2760 2761 //Checkbox Control 2762 assertTrue(isElementPresentByXpath("//input[@type='checkbox' and @name='bField1']")); 2763 assertTrue(isElementPresentByXpath("//input[@type='text' and @name='field103']")); 2764 } 2765 2766 protected void verifyRichMessagesValidationLinkDeclarationsFunctionality() throws Exception { 2767 //Testing link tag 2768 waitAndClickByLinkText("Kuali Site"); 2769 Thread.sleep(9000); 2770 switchToWindow("Open Source Software | www.kuali.org"); 2771 switchToWindow(RICH_MESSAGES_WINDOW_TITLE); 2772 2773 //Testing methodToCall Action 2774 waitAndClickByXpath("//p[contains(., 'Testing methodToCall action')]/a"); 2775 Thread.sleep(3000); 2776 assertTrue(isElementPresentByXpath( 2777 "//div[@class='alert alert-danger']")); 2778 2779 //Testing methodToCall action (no client validation check) 2780 waitAndClickByXpath("//p[contains(., 'Testing methodToCall action (no client validation check)')]/a"); 2781 assertTrue(isElementPresentByXpath("//div[@id='Demo-BasicMessagesSection_messages' and @class='alert alert-danger']")); 2782 assertTrue(isElementPresentByXpath("//div[@id='Demo-AdvancedMessagesSection_messages' and @class='alert alert-danger']")); 2783 Thread.sleep(3000); 2784 } 2785 2786 protected void waitAndClickAdministration() throws InterruptedException { 2787 waitAndClickByLinkText(ADMINISTRATION_LINK_TEXT, this); 2788 } 2789 2790 protected void waitAndClickClearValues() throws InterruptedException { 2791 waitAndClickButtonByText("Clear Values"); 2792 } 2793 2794 /** 2795 * {@link #ADMINISTRATION_LINK_TEXT} 2796 * @param failable 2797 * @throws InterruptedException 2798 */ 2799 private void waitAndClickAdministration(JiraAwareFailable failable) throws InterruptedException { 2800 waitAndClickByLinkText(ADMINISTRATION_LINK_TEXT, failable); 2801 } 2802 2803 protected void waitAndCancelConfirmation() throws InterruptedException { 2804 waitAndClickCancel(); 2805 waitAndClickByName("methodToCall.processAnswer.button0"); 2806 } 2807 2808 protected void waitAndClickAdHocPersonAdd() throws InterruptedException { 2809 jGrowl("Click AdHoc Person add"); 2810 waitAndClickByXpath("//button[@id='Uif-AdHocPersonCollection_add']"); 2811 } 2812 2813 protected void waitAndClickAdHocPersonAddQuickFinder() throws InterruptedException { 2814 jGrowl("Click AdHoc Person quickfinder"); 2815 waitAndClickByXpath("//div[@data-parent='Uif-AdHocPersonCollection']/div/div/button"); 2816 } 2817 2818 protected void waitAndClickAdHocGroupAddQuickFinder() throws InterruptedException { 2819 jGrowl("Click AdHoc Group quickfinder"); 2820 waitAndClickByXpath("//div[@data-parent='CollectionGroup_AdHocWorkgroup']/div/div/button"); 2821 } 2822 2823 protected void waitAndClickBlanketApprove() throws InterruptedException { 2824 waitAndClickButtonByText("Blanket Approve"); 2825 } 2826 2827 /** 2828 * {@link #CANCEL_NAME} 2829 * @throws InterruptedException 2830 */ 2831 protected void waitAndClickCancel() throws InterruptedException { 2832 waitAndClickByName(CANCEL_NAME); 2833 } 2834 2835 protected void waitAndClickCancelByText() throws InterruptedException { 2836 waitAndClickButtonByText("Cancel"); 2837 } 2838 2839 /** 2840 * {@link #CLOSE_WINDOW_XPATH_TITLE} 2841 * @throws InterruptedException 2842 */ 2843 protected void waitAndClickCloseWindow() throws InterruptedException { 2844 waitAndClickByXpath(CLOSE_WINDOW_XPATH_TITLE); 2845 } 2846 2847 /** 2848 * {@link #COPY_LINK_TEXT} 2849 * @throws InterruptedException 2850 */ 2851 protected void waitAndClickCopy() throws InterruptedException { 2852 waitAndClickByLinkText(COPY_LINK_TEXT); 2853 } 2854 2855 protected void waitAndClickDemoLink() throws InterruptedException { 2856 jGrowl("Click Demo Link"); 2857 waitAndClickById("Demo-DemoLink", ""); 2858 } 2859 2860 /** 2861 * {}@link #DOC_SEARCH_XPATH} 2862 * @throws InterruptedException 2863 */ 2864 protected void waitAndClickDocSearch() throws InterruptedException { 2865 waitAndClickByXpath(DOC_SEARCH_XPATH); 2866 } 2867 2868 /** 2869 * {@link #DOC_SEARCH_XPATH_TITLE} 2870 * @throws InterruptedException 2871 */ 2872 protected void waitAndClickDocSearchTitle() throws InterruptedException { 2873 waitAndClickByXpath(DOC_SEARCH_XPATH_TITLE); 2874 } 2875 2876 protected void waitAndClickLibraryLink() throws InterruptedException { 2877 jGrowl("Click Library Link"); 2878 waitAndClickById("Demo-LibraryLink", ""); 2879 } 2880 2881 /** 2882 * {@link #LOGOUT_XPATH} 2883 * @throws InterruptedException 2884 */ 2885 protected void waitAndClickLogout() throws InterruptedException { 2886 waitAndClickLogout(this); 2887 } 2888 2889 /** 2890 * {@link #LOGOUT_XPATH} 2891 * @param failable 2892 * @throws InterruptedException 2893 */ 2894 protected void waitAndClickLogout(JiraAwareFailable failable) throws InterruptedException { 2895 jGrowl("Logging out"); 2896 selectTopFrame(); 2897 waitAndClickByXpath(LOGOUT_XPATH, failable); 2898 } 2899 2900 protected void waitAndClickMainMenu() throws InterruptedException { 2901 waitAndClickByLinkText(MAIN_MENU_LINK_TEXT, this); 2902 } 2903 2904 /** 2905 * {}@link #MAIN_MENU_LINK_TEXT} 2906 * @param failable 2907 * @throws InterruptedException 2908 */ 2909 private void waitAndClickMainMenu(JiraAwareFailable failable) throws InterruptedException { 2910 waitAndClickByLinkText(MAIN_MENU_LINK_TEXT, failable); 2911 } 2912 2913 protected void waitAndClickRouteLogIcon() throws InterruptedException { 2914 jGrowl("Click Route Log link"); 2915 waitAndClickByXpath("//img[@alt=\"Route Log for Document\"]"); 2916 } 2917 2918 /** 2919 * {@link #SAVE_XPATH} 2920 * @throws InterruptedException 2921 */ 2922 protected void waitAndClickSave() throws InterruptedException { 2923 waitAndClickByXpath(SAVE_XPATH); 2924 } 2925 2926 protected void waitAndClickSaveByText() throws InterruptedException { 2927 waitAndClickButtonByText("Save"); 2928 } 2929 2930 /** 2931 * {@link #SUBMIT_XPATH} 2932 * @throws InterruptedException 2933 */ 2934 protected void waitAndClickSubmit() throws InterruptedException { 2935 jGrowl("Click Submit"); 2936 waitAndClickByXpath(SUBMIT_XPATH); 2937 } 2938 2939 protected void waitAndClickSubmitByText() throws InterruptedException { 2940 waitAndClickButtonByText("Submit"); 2941 } 2942 2943 /** 2944 * {@link #APPROVE_XPATH} 2945 * @throws InterruptedException 2946 */ 2947 protected void waitAndClickApprove() throws InterruptedException { 2948 jGrowl("Click Approve"); 2949 waitAndClickByXpath(APPROVE_XPATH); 2950 } 2951 2952 protected void waitAndClickApproveByText() throws InterruptedException { 2953 waitAndClickButtonByText("Approve"); 2954 } 2955 2956 /** 2957 * {@link #DISAPPROVE_XPATH} 2958 * @throws InterruptedException 2959 */ 2960 protected void waitAndClickDisapprove() throws InterruptedException { 2961 jGrowl("Click Disapprove"); 2962 waitAndClickByXpath(DISAPPROVE_XPATH); 2963 } 2964 2965 protected void waitAndClickDisapproveByText() throws InterruptedException { 2966 waitAndClickButtonByText("Disapprove"); 2967 } 2968 2969 /** 2970 * {@link #ACKNOWLEDGE_XPATH} 2971 * @throws InterruptedException 2972 */ 2973 protected void waitAndClickAcknowledge() throws InterruptedException { 2974 jGrowl("Click Acknowledge"); 2975 waitAndClickByXpath(ACKNOWLEDGE_XPATH); 2976 } 2977 2978 protected void waitAndClickAcknowledgeByText() throws InterruptedException { 2979 waitAndClickButtonByText("Acknowledge"); 2980 } 2981 2982 /** 2983 * {@link #CLOSE_XPATH} 2984 * @throws InterruptedException 2985 */ 2986 protected void waitAndClickClose() throws InterruptedException { 2987 jGrowl("Click Close"); 2988 waitAndClickByXpath(CLOSE_XPATH); 2989 } 2990 2991 protected void waitAndClickCloseByText() throws InterruptedException { 2992 waitAndClickButtonByText("Close"); 2993 } 2994 2995 /** 2996 * {@link #XML_INGESTER_LINK_TEXT} 2997 * @param failable 2998 * @throws InterruptedException 2999 */ 3000 protected void waitAndClickXMLIngester(JiraAwareFailable failable) throws InterruptedException { 3001 waitAndClickByLinkText(XML_INGESTER_LINK_TEXT, failable); 3002 } 3003 3004 protected void waitAndCreateNew() throws InterruptedException { 3005 waitAndCreateNew(this.getClass().toString()); 3006 } 3007 3008 protected void waitAndCreateNew(String message) throws InterruptedException { 3009 selectFrameIframePortlet(); 3010 jGrowl("Create New"); 3011 waitAndClickCreateNew(message); 3012 } 3013 3014 /** 3015 * {@link #CREATE_NEW_XPATH} 3016 * @throws InterruptedException 3017 */ 3018 protected void waitAndClickCreateNew() throws InterruptedException { 3019 waitAndClickCreateNew(this.getClass().toString()); 3020 } 3021 3022 protected void waitAndClickCreateNew(String message) throws InterruptedException { 3023 jGrowl("Click Create New"); 3024 if (WebDriverUtils.waitFors(driver, By.xpath(CREATE_NEW_XPATH)).size() > 0) { 3025 waitAndClickByXpath(CREATE_NEW_XPATH, message); 3026 } else { 3027 System.out.println("waitAndClickByXpath(" + CREATE_NEW_XPATH + ") wasn't found trying " + CREATE_NEW_XPATH2); 3028 waitAndClickByXpath(CREATE_NEW_XPATH2, message); 3029 } 3030 } 3031 3032 protected void waitAndClickEdit() throws InterruptedException { 3033 waitAndClickByLinkText(EDIT_LINK_TEXT); 3034 } 3035 3036 /** 3037 * {@link #SEARCH_XPATH} 3038 * @throws InterruptedException 3039 */ 3040 protected void waitAndClickSearch() throws InterruptedException { 3041 jGrowl("Click Search"); 3042 waitAndClickByXpath(SEARCH_XPATH); 3043 } 3044 3045 protected void waitAndClickSearch2() throws InterruptedException { 3046 jGrowl("Click Search"); 3047 waitAndClickByXpath(SEARCH_XPATH_2); 3048 } 3049 3050 protected void waitAndClickSearchSecond() throws InterruptedException { 3051 jGrowl("Click Search"); 3052 waitAndClickByXpath(SEARCH_SECOND); 3053 } 3054 3055 protected void waitAndClickSearchByText() throws InterruptedException { 3056 waitAndClickButtonByText("Search"); 3057 } 3058 3059 protected String waitForAgendaDocId() throws InterruptedException { 3060 String docId = waitForElementPresentByXpath("//div[@data-label=\"Document Number\"]").getText(); 3061 jGrowl("Document Number is " + docId); 3062 return docId; 3063 } 3064 3065 protected String waitForDocId() throws InterruptedException { 3066 checkForDocError(); 3067 waitForElementPresentByXpath(DOC_ID_XPATH); 3068 String docId = findElement(By.xpath(DOC_ID_XPATH)).getText(); 3069 jGrowl("Document Number is " + docId); 3070 return docId; 3071 } 3072 3073 protected String waitForDocIdKrad() throws InterruptedException { 3074 failOnErrorMessageItem(); 3075 waitForElementPresentByXpath(DOC_ID_KRAD_XPATH); 3076 String docId = findElement(By.xpath(DOC_ID_KRAD_XPATH)).getText(); 3077 jGrowl("Document Number is " + docId); 3078 3079 return docId; 3080 } 3081 3082 protected String waitForDocInitiator() throws InterruptedException { 3083 waitForElementPresentByXpath(DOC_INITIATOR_XPATH); 3084 3085 return findElement(By.xpath(DOC_INITIATOR_XPATH)).getText(); 3086 } 3087 3088 protected String waitForDocStatus() throws InterruptedException { 3089 waitForElementPresentByXpath(DOC_STATUS_XPATH); 3090 3091 return findElement(By.xpath(DOC_STATUS_XPATH)).getText(); 3092 } 3093 3094 protected void waitForTitleToEqualKualiPortalIndex() throws InterruptedException { 3095 waitForTitleToEqualKualiPortalIndex(this.getClass().toString()); 3096 } 3097 3098 protected void waitForToolTipTextPresent(String tooltipText) throws InterruptedException { 3099 assertEquals("ToolTip text not as expected", tooltipText, waitForToolTipPresent().getText()); 3100 } 3101 3102 protected WebElement waitForToolTipPresent() throws InterruptedException { 3103 waitForElementPresent(".popover.top.in"); 3104 WebElement tooltip = findElement(By.cssSelector(".popover.top.in")); 3105 jGrowl("ToolTip " + tooltip.getText()); 3106 return tooltip; 3107 } 3108 3109 protected void waitForTitleToEqualKualiPortalIndex(String message) throws InterruptedException { 3110 Thread.sleep(2000); 3111 // This started failing in CI.... 3112 // boolean failed = false; 3113 // 3114 // for (int second = 0;; second++) { 3115 // Thread.sleep(1000); 3116 // if (second >= waitSeconds) failed = true; 3117 // try { if (failed || ITUtil.KUALI_PORTAL_TITLE.equals(driver.getTitle())) break; } catch (Exception e) {} 3118 // } 3119 3120 // WebDriverUtils.checkForIncidentReport(driver, message); // after timeout to be sure page is loaded 3121 // if (failed) jiraAwareFail("timeout of " + waitSeconds + " seconds " + message); 3122 } 3123 3124 /** 3125 * {@link #KRAD_XPATH} 3126 * @throws InterruptedException 3127 */ 3128 protected void waitAndClickKRAD() throws InterruptedException { 3129 waitAndClickByLinkText(KRAD_XPATH); 3130 } 3131 3132 /** 3133 * Does the test page use KRAD UIF? 3134 * Useful if trying to re-use a test for both a KNS and KRAD screens that have different paths to the elements. 3135 * @return 3136 */ 3137 protected boolean isKrad(){ 3138 return (AutomatedFunctionalTestUtils.REMOTE_UIF_KRAD.equalsIgnoreCase(getUiFramework())); 3139 } 3140 3141 /** 3142 * Determines whether KRAD or KNS UIF is used for this test. 3143 * Useful if trying to re-use a test for both a KNS and KRAD screens that have different paths to the elements. 3144 * @return 3145 */ 3146 public String getUiFramework() { 3147 return uiFramework; 3148 } 3149 3150 /** 3151 * Sets which UIF is used by this test 3152 */ 3153 public void setUiFramework(String uiFramework) { 3154 this.uiFramework = uiFramework; 3155 } 3156 3157 /** 3158 * presses Enter Key by Name 3159 */ 3160 public void pressEnterByName(String locator){ 3161 pressEnter(By.name(locator)); 3162 } 3163 3164 /** 3165 * presses Enter Key by Xpath 3166 */ 3167 public void pressEnterByXpath(String locator){ 3168 pressEnter(By.xpath(locator)); 3169 } 3170 3171 /** 3172 * presses Enter Key 3173 */ 3174 public void pressEnter(By by){ 3175 findElement(by).sendKeys(Keys.ENTER); 3176 } 3177}