001 package org.kuali.student.lum.ui.selenium; 002 003 import static org.junit.Assert.fail; 004 005 import java.net.URL; 006 import java.util.List; 007 import java.util.concurrent.TimeUnit; 008 009 import org.junit.After; 010 import org.junit.Before; 011 import org.junit.Test; 012 import org.openqa.selenium.By; 013 import org.openqa.selenium.Keys; 014 import org.openqa.selenium.NoSuchElementException; 015 import org.openqa.selenium.Platform; 016 import org.openqa.selenium.WebDriver; 017 import org.openqa.selenium.WebElement; 018 import org.openqa.selenium.firefox.FirefoxDriver; 019 import org.openqa.selenium.ie.InternetExplorerDriver; 020 import org.openqa.selenium.remote.DesiredCapabilities; 021 import org.openqa.selenium.remote.RemoteWebDriver; 022 023 public class CreateCourseSeleniumTest { 024 private WebDriver driver; 025 //private StringBuffer verificationErrors = new StringBuffer(); 026 private String browser; 027 028 @Before 029 public void setUp() throws Exception { 030 String remoteTest = System.getProperty("selenium.remote"); 031 String baseURL = System.getProperty("selenium.baseurl"); 032 browser = System.getProperty("selenium.browser", "firefox"); 033 if ("true".equals(remoteTest)) { 034 String version = System.getProperty("selenium.browser.version", ""); 035 Platform platform = Platform.valueOf(System.getProperty("selenium.platform", "ANY")); 036 DesiredCapabilities capabilities = new DesiredCapabilities(browser, version, platform); 037 capabilities.setCapability("max-duration", "120"); // tests can't run more than 2 mins 038 //capabilities.setCapability("name", getClass().getName() + "." + name.getMethodName()); 039 driver = new RemoteWebDriver(new URL(baseURL), 040 capabilities); 041 // longer timeouts for remote invocation 042 driver.manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS); 043 } else { 044 if ("firefox".equals(browser)) { 045 driver = new FirefoxDriver(); 046 } else if ("ie".equals(browser)) { 047 driver = new InternetExplorerDriver(); 048 } 049 driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); 050 } 051 } 052 053 @Test 054 public void testCreateCourse() throws Exception { 055 driver.get("http://dev.ks.kuali.org/login.jsp"); 056 //driver.get("http://localhost:8081/ks-embedded-dev/login.jsp"); 057 //Login Page 058 WebElement logonUserName = driver.findElement(By.id("j_username")); 059 typeValue(logonUserName, "admin"); 060 WebElement logonPassword = driver.findElement(By.id("j_password")); 061 typeValue(logonPassword, "admin"); 062 logonPassword.submit(); 063 //driver.findElement(By.xpath("//input[@type='submit']")).click(); 064 //Main Page 065 By selectAnAreaPanel = By.id("gwt-debug-Application-Header-Select-an-area--panel-0"); 066 for (int second = 0;; second++) { 067 if (second >= 60) 068 fail("timeout"); 069 try { 070 if (isElementPresent(selectAnAreaPanel)) 071 break; 072 } catch (Exception e) {} 073 Thread.sleep(1000); 074 } 075 076 driver.findElement(selectAnAreaPanel).click(); 077 driver.findElement(By.id("gwt-debug-Curriculum-Management-label")).click(); 078 By createACourseLink = By.linkText("Create a Course"); 079 for (int second = 0;; second++) { 080 if (second >= 60) 081 fail("timeout"); 082 try { 083 if (isElementPresent(createACourseLink)) 084 break; 085 } catch (Exception e) {} 086 Thread.sleep(1000); 087 } 088 089 driver.findElement(createACourseLink).click(); 090 //Create a Course Popup 091 By useCurriculumReviewCheckbox = By.id("gwt-debug-Use-curriculum-review-process-input"); 092 for (int second = 0;; second++) { 093 if (second >= 60) 094 fail("timeout"); 095 try { 096 if (isElementPresent(useCurriculumReviewCheckbox)) 097 break; 098 } catch (Exception e) {} 099 Thread.sleep(1000); 100 } 101 102 driver.findElement(useCurriculumReviewCheckbox).click(); 103 driver.findElement(By.id("gwt-debug-Start-Proposal-anchor")).click(); 104 //Start Proposal 105 //Course Info Section 106 By byProposalName = By.xpath("//input[@id='gwt-debug-proposal-name']"); 107 for (int second = 0;; second++) { 108 if (second >= 60) 109 fail("timeout"); 110 try { 111 if (isElementPresent(byProposalName)) 112 break; 113 } catch (Exception e) {} 114 Thread.sleep(1000); 115 } 116 117 WebElement proposalName = driver.findElement(byProposalName); 118 typeValue(proposalName, "Selenium Tester"); 119 WebElement courseTitle = driver.findElement(By.xpath("//input[@id='gwt-debug-courseTitle']")); 120 typeValue(courseTitle, "Selenium Tester"); 121 WebElement transcriptTitle = driver.findElement(By.xpath("//input[@id='gwt-debug-transcriptTitle']")); 122 typeValue(transcriptTitle, "Selenium Transcript"); 123 WebElement subjectArea = driver.findElement(By.xpath("//input[@id='gwt-debug-subjectArea']")); 124 subjectArea.click(); 125 //subjectArea.sendKeys("CHEM", Keys.RIGHT); 126 typeValue(subjectArea, "CHEM", Keys.RIGHT); 127 // ERROR: Caught exception [ERROR: Unsupported command [keyDown]] 128 // ERROR: Caught exception [ERROR: Unsupported command [keyUp]] 129 for (int second = 0;; second++) { 130 if (second >= 60) 131 fail("timeout"); 132 try { 133 if (isElementPresent(By.xpath("//td[@role='menuitem']"))) 134 break; 135 } catch (Exception e) {} 136 Thread.sleep(1000); 137 } 138 139 driver.findElement(By.xpath("//td[@role='menuitem']")).click(); 140 WebElement courseNumberSuffix = driver.findElement(By.xpath("//input[@id='gwt-debug-courseNumberSuffix']")); 141 typeValue(courseNumberSuffix, "111"); 142 WebElement instructors = driver.findElement(By.xpath("//input[@id='gwt-debug-instructors']")); 143 typeValue(instructors, "Admin 1", Keys.RIGHT); 144 // ERROR: Caught exception [ERROR: Unsupported command [keyDown]] 145 // ERROR: Caught exception [ERROR: Unsupported command [keyUp]] 146 for (int second = 0;; second++) { 147 if (second >= 60) 148 fail("timeout"); 149 try { 150 if (isElementPresent(By.xpath("//td[@role='menuitem']"))) 151 break; 152 } catch (Exception e) {} 153 Thread.sleep(1000); 154 } 155 156 driver.findElement(By.xpath("//td[@role='menuitem']")).click(); 157 //Always add 1 second delay before 'Add to list' buttons 158 Thread.sleep(1000); 159 driver.findElement(By.id("gwt-debug-instructors-Add-to-list-anchor")).click(); 160 WebElement description = driver.findElement(By.xpath("//textarea[@id='gwt-debug-descr-plain']")); 161 typeValue(description, "Selenium Description"); 162 WebElement rationale = driver.findElement(By.xpath("//textarea[@id='gwt-debug-proposal-rationale']")); 163 typeValue(rationale, "Selenium Rationale"); 164 driver.findElement(By.id("gwt-debug-Save-and-Continue-anchor")).click(); 165 166 //Governance Section 167 for (int second = 0;; second++) { 168 if (second >= 60) 169 fail("timeout"); 170 try { 171 if (isElementPresent(By.id("gwt-debug-All-input"))) 172 break; 173 } catch (Exception e) {} 174 Thread.sleep(1000); 175 } 176 177 driver.findElement(By.id("gwt-debug-All-input")).click(); 178 WebElement unitContentOwner = driver.findElement(By.xpath("//select[@id='gwt-debug-unitsContentOwner']")); 179 // ERROR: Caught exception [ERROR: Unsupported command [select]] 180 clickOptionInSelectList(unitContentOwner, "68"); 181 //Always sleep before 'Add to list' buttons 182 Thread.sleep(1000); 183 driver.findElement(By.id("gwt-debug-unitsContentOwner-Add-to-list-anchor")).click(); 184 driver.findElement(By.id("gwt-debug-Save-and-Continue-anchor")).click(); 185 186 //Course Logistics Section 187 for (int second = 0;; second++) { 188 if (second >= 60) 189 fail("timeout"); 190 try { 191 if (isElementPresent(By.id("gwt-debug-Any-input"))) 192 break; 193 } catch (Exception e) {} 194 Thread.sleep(1000); 195 } 196 197 driver.findElement(By.id("gwt-debug-Any-input")).click(); 198 driver.findElement(By.id("gwt-debug-Completed-notation-input")).click(); 199 driver.findElement(By.id("gwt-debug-Standard-final-Exam-input")).click(); 200 WebElement outcome1Type = driver.findElement(By.xpath("//select[@id='gwt-debug-creditOptions-0-type']")); 201 clickOptionInSelectList(outcome1Type, "kuali.resultComponentType.credit.degree.fixed"); 202 // ERROR: Caught exception [ERROR: Unsupported command [select]] 203 WebElement outcome1CreditValue = driver.findElement(By 204 .xpath("//input[@id='gwt-debug-creditOptions-0-fixedCreditValue']")); 205 typeValue(outcome1CreditValue, "5"); 206 driver.findElement(By.id("gwt-debug-Save-and-Continue-anchor")).click(); 207 208 //Learning Objectives Section 209 for (int second = 0;; second++) { 210 if (second >= 60) 211 fail("timeout"); 212 try { 213 if (isElementPresent(By.xpath("//textarea[@id='gwt-debug-courseSpecificLOs-0-loInfo-desc-plain']"))) 214 break; 215 } catch (Exception e) {} 216 Thread.sleep(1000); 217 } 218 WebElement learningObjective1 = driver.findElement(By 219 .xpath("//textarea[@id='gwt-debug-courseSpecificLOs-0-loInfo-desc-plain']")); 220 typeValue(learningObjective1, "Selenium Learning Objectives"); 221 222 driver.findElement(By.id("gwt-debug-courseSpecificLOs-0-loInfo-desc-plain-Browse-for-categories")).click(); 223 for (int second = 0;; second++) { 224 if (second >= 60) 225 fail("timeout"); 226 try { 227 if (isElementPresent(By.id("gwt-debug-Communication-Skill-input"))) 228 break; 229 } catch (Exception e) {} 230 Thread.sleep(1000); 231 } 232 233 driver.findElement(By.id("gwt-debug-Communication-Skill-input")).click(); 234 driver.findElement(By.id("gwt-debug-Add-anchor")).click(); 235 driver.findElement(By.id("gwt-debug-Save-and-Continue-anchor")).click(); 236 237 //Course Requisites Section 238 for (int second = 0;; second++) { 239 if (second >= 60) 240 fail("timeout"); 241 try { 242 if (isElementPresent(By.id("gwt-debug-Add-Student-Eligibility---Prerequisite-anchor"))) 243 break; 244 } catch (Exception e) {} 245 Thread.sleep(1000); 246 } 247 248 driver.findElement(By.id("gwt-debug-Add-Student-Eligibility---Prerequisite-anchor")).click(); 249 for (int second = 0;; second++) { 250 if (second >= 60) 251 fail("timeout"); 252 try { 253 if (isElementPresent(By.id("gwt-debug-Rule-Type"))) 254 break; 255 } catch (Exception e) {} 256 Thread.sleep(1000); 257 } 258 259 WebElement ruleType = driver.findElement(By.id("gwt-debug-Rule-Type")); 260 clickOptionInSelectList(ruleType, "19"); 261 // ERROR: Caught exception [ERROR: Unsupported command [select]] 262 for (int second = 0;; second++) { 263 if (second >= 60) 264 fail("timeout"); 265 try { 266 if (isElementPresent(By 267 .xpath("//input[@id='gwt-debug-kuali-reqComponent-field-type-value-positive-integer']"))) 268 break; 269 } catch (Exception e) {} 270 Thread.sleep(1000); 271 } 272 WebElement minCreditValue = driver.findElement(By 273 .xpath("//input[@id='gwt-debug-kuali-reqComponent-field-type-value-positive-integer']")); 274 typeValue(minCreditValue, "10"); 275 driver.findElement(By.id("gwt-debug-Add-anchor")).click(); 276 //Give the 'Save' button a chance to become active 277 Thread.sleep(2000);//IE needs more time here than Firefox 278 driver.findElement(By.id("gwt-debug-Save-anchor")).click(); 279 Thread.sleep(1000); 280 driver.findElement(By.id("gwt-debug-Save-and-Continue-anchor")).click(); 281 282 //Active Dates Section 283 for (int second = 0;; second++) { 284 if (second >= 60) 285 fail("timeout"); 286 try { 287 if (isElementPresent(By.xpath("//select[@id='gwt-debug-startTerm']"))) 288 break; 289 } catch (Exception e) {} 290 Thread.sleep(1000); 291 } 292 WebElement startTerm = driver.findElement(By.xpath("//select[@id='gwt-debug-startTerm']")); 293 clickOptionInSelectList(startTerm, "kuali.atp.SP2010-2011"); 294 //startTerm.click(); 295 // ERROR: Caught exception [ERROR: Unsupported command [select]] 296 //driver.findElement(By.cssSelector("option[value=\"kuali.atp.SP2010-2011\"]")).click(); 297 driver.findElement(By.id("gwt-debug-Save-and-Continue-anchor")).click(); 298 299 //Financials Section 300 for (int second = 0;; second++) { 301 if (second >= 60) 302 fail("timeout"); 303 try { 304 if (isElementPresent(By.xpath("//textarea[@id='gwt-debug-feeJustification-plain']"))) 305 break; 306 } catch (Exception e) {} 307 Thread.sleep(1000); 308 } 309 WebElement justificationOfFees = driver.findElement(By 310 .xpath("//textarea[@id='gwt-debug-feeJustification-plain']")); 311 typeValue(justificationOfFees, "Selenium Justification of Fees"); 312 //These revenue and expenditure fields only work with Firefox. 313 //Maybe there's an issue in IE because these are multiplicity fields and thus some of these elements are dynamic? 314 if ("firefox".equals(browser)) { 315 driver.findElement(By.id("gwt-debug-revenues-Add-another-Organization-anchor")).click(); 316 driver.findElement(By.id("gwt-debug-revenues-0-affiliatedOrgs-0-orgId-Advanced-Search-anchor")).click(); 317 driver.findElement(By.id("gwt-debug-Search-anchor")).click(); 318 for (int second = 0;; second++) { 319 if (second >= 60) 320 fail("timeout"); 321 try { 322 if (isElementPresent(By.id("gwt-debug-Academics-Academic-Affairs--College--input"))) 323 break; 324 } catch (Exception e) {} 325 Thread.sleep(1000); 326 } 327 328 driver.findElement(By.id("gwt-debug-Academics-Academic-Affairs--College--input")).click(); 329 driver.findElement(By.id("gwt-debug-Search-anchor")).click(); 330 for (int second = 0;; second++) { 331 if (second >= 60) 332 fail("timeout"); 333 try { 334 if (isElementPresent(By.xpath("//input[@id='gwt-debug-revenues-0-affiliatedOrgs-0-percentage']"))) 335 break; 336 } catch (Exception e) {} 337 Thread.sleep(1000); 338 } 339 WebElement revenue1Percentage = driver.findElement(By 340 .xpath("//input[@id='gwt-debug-revenues-0-affiliatedOrgs-0-percentage']")); 341 revenue1Percentage.click(); 342 typeValue(revenue1Percentage, "100"); 343 driver.findElement(By.id("gwt-debug-expenditure-affiliatedOrgs-Add-another-Organization-anchor")).click(); 344 driver.findElement(By.id("gwt-debug-expenditure-affiliatedOrgs-0-orgId-Advanced-Search-anchor")).click(); 345 driver.findElement(By.id("gwt-debug-Search-anchor")).click(); 346 driver.findElement(By.id("gwt-debug-Admissions-Undergraduate-Admissions-input")).click(); 347 driver.findElement(By.id("gwt-debug-Search-anchor")).click(); 348 WebElement expenditure1Percentage = driver.findElement(By 349 .xpath("//input[@id='gwt-debug-expenditure-affiliatedOrgs-0-percentage']")); 350 typeValue(expenditure1Percentage, "100"); 351 } 352 driver.findElement(By.id("gwt-debug-Save-and-Continue-anchor")).click(); 353 354 //Authors & Collaborators Section 355 for (int second = 0;; second++) { 356 if (second >= 60) 357 fail("timeout"); 358 try { 359 if (isElementPresent(By.id("gwt-debug-Name-Advanced-Search-anchor"))) 360 break; 361 } catch (Exception e) {} 362 Thread.sleep(1000); 363 } 364 365 driver.findElement(By.id("gwt-debug-Name-Advanced-Search-anchor")).click(); 366 driver.findElement(By.id("gwt-debug-Search-anchor")).click(); 367 for (int second = 0;; second++) { 368 if (second >= 60) 369 fail("timeout"); 370 try { 371 if (isElementPresent(By.id("gwt-debug-Admin-1--Test-1101-testadmin1-Admin-1--Test--testadmin1--input"))) 372 break; 373 } catch (Exception e) {} 374 Thread.sleep(1000); 375 } 376 377 driver.findElement(By.id("gwt-debug-Admin-1--Test-1101-testadmin1-Admin-1--Test--testadmin1--input")).click(); 378 driver.findElement(By.id("gwt-debug-Search-anchor")).click(); 379 WebElement permission = driver.findElement(By.xpath("//select[@id='gwt-debug-Permission']")); 380 //permission.click(); 381 clickOptionInSelectList(permission, "KS-SYS~Edit Document"); 382 // ERROR: Caught exception [ERROR: Unsupported command [select]] 383 //driver.findElement(By.cssSelector("option[value=\"KS-SYS~Edit Document\"]")).click(); 384 WebElement actionRequest = driver.findElement(By.xpath("//select[@id='gwt-debug-Action-Request']")); 385 //actionRequest.click(); 386 clickOptionInSelectList(actionRequest, "F"); 387 // ERROR: Caught exception [ERROR: Unsupported command [select]] 388 //driver.findElement(By.cssSelector("option[value=\"F\"]")).click(); 389 driver.findElement(By.id("gwt-debug-Add-Collaborator-anchor")).click(); 390 driver.findElement(By.id("gwt-debug-Save-and-Continue-anchor")).click(); 391 392 //Supporting Documents Section 393 for (int second = 0;; second++) { 394 if (second >= 60) 395 fail("timeout"); 396 try { 397 if (isElementPresent(By.id("gwt-debug-Continue-anchor"))) 398 break; 399 } catch (Exception e) {} 400 Thread.sleep(1000); 401 } 402 403 driver.findElement(By.id("gwt-debug-Continue-anchor")).click(); 404 405 //Finally the Review Proposal Section is displayed 406 } 407 408 @After 409 public void tearDown() throws Exception { 410 driver.quit(); 411 // String verificationErrorString = verificationErrors.toString(); 412 // if (!"".equals(verificationErrorString)) { 413 // fail(verificationErrorString); 414 // } 415 } 416 417 private boolean isElementPresent(By by) { 418 try { 419 driver.findElement(by); 420 return true; 421 } catch (NoSuchElementException e) { 422 return false; 423 } 424 } 425 426 private void typeValue(final WebElement webElement, CharSequence... keysToSend) { 427 webElement.clear(); 428 webElement.sendKeys(keysToSend); 429 } 430 431 private void clickOptionInSelectList(final WebElement selectElement, String optionValue) { 432 List<WebElement> selectOptions = selectElement.findElements(By.tagName("option")); 433 for (WebElement option : selectOptions) { 434 if (optionValue != null) { 435 //select element by option value attribute 436 if (optionValue.equals(option.getAttribute("value"))) { 437 option.click(); 438 break; 439 } 440 } 441 } 442 } 443 }