From: Charles Connell Date: Tue, 17 Dec 2013 05:06:27 +0000 (-0500) Subject: More automation of Selenium tests X-Git-Tag: release-20150131~386^2~10^2~1 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=aa02d20846f7f617c5ce216867bea61181156386;p=oweals%2Fkarmaworld.git More automation of Selenium tests --- diff --git a/karmaworld/apps/courses/test/selenium.py b/karmaworld/apps/courses/test/selenium.py deleted file mode 100644 index 55c320b..0000000 --- a/karmaworld/apps/courses/test/selenium.py +++ /dev/null @@ -1,161 +0,0 @@ -from selenium import webdriver -from selenium.webdriver.support.wait import WebDriverWait -from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support import expected_conditions as EC -import uuid -import unittest - - -class AddCourseTest(unittest.TestCase): - """Tests the Add Course form. Requires a copy of KarmaNotes - be available at localhost:8000. This will modify your database.""" - - def setUp(self): - self.driver = webdriver.Firefox() - self.driver.implicitly_wait(3) - self.wait = WebDriverWait(self.driver, 10) - - def tearDown(self): - self.driver.close() - - def selectAutocomplete(self, inputId, keys, fieldIndex): - input = self.driver.find_element_by_id(inputId) - input.send_keys(keys) - self.wait.until(EC.element_to_be_clickable((By.XPATH, "//ul[contains(@class,'ui-autocomplete')][" + str(fieldIndex) + "]/li"))) - input.send_keys(Keys.DOWN) - autocompleteMenuItem = self.driver.find_element_by_id("ui-active-menuitem") - autocompleteMenuItem.click() - - def testSchoolName(self): - self.driver.get("http://localhost:8000/") - - # Click "Add Course" - addCourseButton = self.driver.find_element_by_id("add-course-btn") - addCourseButton.click() - - # Scroll down so the autocomplete menu is in view - # This works around some weird failures - self.driver.execute_script("javascript:window.scrollBy(0,200)") - - # Type in part of a school name - schoolInput = self.driver.find_element_by_id("str_school") - schoolInput.send_keys("harvard u") - - # Wait for autocomplete menu to appear - self.wait.until(EC.element_to_be_clickable((By.XPATH, "//ul[contains(@class,'ui-autocomplete')][1]/li"))) - - # Choose the first suggestion - schoolInput.send_keys(Keys.DOWN) - activeItem = self.driver.find_element_by_id("ui-active-menuitem") - activeItem.click() - - self.assertEqual(schoolInput.get_attribute("value"), "Harvard University") - - schoolId = self.driver.find_element_by_id("id_school") - self.assertEqual(schoolId.get_attribute("value"), "1817") - - def testCreateCourse(self): - self.driver.get("http://localhost:8000/") - - # Click "Add Course" - addCourseButton = self.driver.find_element_by_id("add-course-btn") - addCourseButton.click() - self.driver.execute_script("javascript:window.scrollBy(0,200)") - - # We shouldn't be able to save it yet - saveButton = self.driver.find_element_by_id("save-btn") - self.assertIn("disabled", saveButton.get_attribute("class")) - - # Choose a school - self.selectAutocomplete("str_school", "northeastern u", 1) - - # Check that save button is now enabled - self.assertNotIn("disabled", saveButton.get_attribute("class")) - - # Course name - newCourseName = "SELENIUM TEST COURSE " + uuid.uuid4().hex - courseNameInput = self.driver.find_element_by_id("id_name") - courseNameInput.send_keys(newCourseName) - - # Instructor name - newInstructorName = "SELENIUM TEST INSTRUCTOR " + uuid.uuid4().hex - instructorNameInput = self.driver.find_element_by_id("id_instructor_name") - instructorNameInput.send_keys(newInstructorName) - - # Click "Save" - saveButton = self.driver.find_element_by_id("save-btn") - saveButton.click() - - # See if we are taken to the new course page - self.wait.until(EC.title_contains(newCourseName)) - - - def testCreateExistingCourse(self): - self.driver.get("http://localhost:8000/") - - # Click "Add Course" - addCourseButton = self.driver.find_element_by_id("add-course-btn") - addCourseButton.click() - self.driver.execute_script("javascript:window.scrollBy(0,200)") - - # We shouldn't be able to save it yet - saveButton = self.driver.find_element_by_id("save-btn") - self.assertIn("disabled", saveButton.get_attribute("class")) - - # Choose a school - self.selectAutocomplete("str_school", "northeastern u", 1) - - # Check that save button is now enabled - self.assertNotIn("disabled", saveButton.get_attribute("class")) - - # Course name - newCourseName = "SELENIUM TEST COURSE " + uuid.uuid4().hex - courseNameInput = self.driver.find_element_by_id("id_name") - courseNameInput.send_keys(newCourseName) - - # Instructor name - newInstructorName = "SELENIUM TEST INSTRUCTOR " + uuid.uuid4().hex - instructorNameInput = self.driver.find_element_by_id("id_instructor_name") - instructorNameInput.send_keys(newInstructorName) - - # Click "Save" - saveButton = self.driver.find_element_by_id("save-btn") - saveButton.click() - - # See if we are taken to the new course page - self.wait.until(EC.title_contains(newCourseName)) - - # Now go back to the home page - self.driver.get("http://localhost:8000/") - - # Click "Add Course" - addCourseButton = self.driver.find_element_by_id("add-course-btn") - addCourseButton.click() - self.driver.execute_script("javascript:window.scrollBy(0,200)") - - # Choose the SAME school - self.selectAutocomplete("str_school", "northeastern u", 1) - - # The SAME course name - self.selectAutocomplete("id_name", newCourseName, 2) - - # The SAME instructor name - self.selectAutocomplete("id_instructor_name", newInstructorName, 3) - - # Make sure Save button is disabled and hidden - saveButton = self.driver.find_element_by_id("save-btn") - self.assertIn("disabled", saveButton.get_attribute("class")) - self.wait.until_not(EC.visibility_of(saveButton)) - - # Make sure Existing Course link is shown - existingCourse = self.driver.find_element_by_id("existing-course-btn") - self.wait.until(EC.visibility_of(existingCourse)) - existingCourse.click() - - # See if we are taken to the new course page - self.wait.until(EC.title_contains(newCourseName)) - -if __name__ == "__main__": - unittest.main() - diff --git a/karmaworld/apps/courses/test/test.py b/karmaworld/apps/courses/test/test.py index 36d7f0f..2d74176 100644 --- a/karmaworld/apps/courses/test/test.py +++ b/karmaworld/apps/courses/test/test.py @@ -2,7 +2,6 @@ from django.test import TestCase from karmaworld.apps.courses.models import * from django.test.client import Client from django.core.urlresolvers import reverse -import unittest import json class CoursesTests(TestCase): @@ -143,6 +142,3 @@ class CoursesTests(TestCase): -if __name__ == "__main__": - unittest.main() - diff --git a/karmaworld/apps/courses/test/test_selenium.py b/karmaworld/apps/courses/test/test_selenium.py new file mode 100644 index 0000000..6c81d36 --- /dev/null +++ b/karmaworld/apps/courses/test/test_selenium.py @@ -0,0 +1,161 @@ +from selenium import webdriver +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.support import expected_conditions as EC +from django.test import LiveServerTestCase +from karmaworld.apps.courses.models import * +import uuid + + +class AddCourseTest(LiveServerTestCase): + """Tests the Add Course form.""" + + def setUp(self): + self.driver = webdriver.Firefox() + self.driver.implicitly_wait(3) + self.wait = WebDriverWait(self.driver, 10) + self.harvard = School.objects.create(name="Harvard University") + self.northeastern = School.objects.create(name="Northeastern University") + + def tearDown(self): + self.driver.close() + + def selectAutocomplete(self, inputId, keys, fieldIndex): + input = self.driver.find_element_by_id(inputId) + input.send_keys(keys) + self.wait.until(EC.element_to_be_clickable((By.XPATH, "//ul[contains(@class,'ui-autocomplete')][" + str(fieldIndex) + "]/li"))) + input.send_keys(Keys.DOWN) + autocompleteMenuItem = self.driver.find_element_by_id("ui-active-menuitem") + autocompleteMenuItem.click() + + def testSchoolName(self): + self.driver.get(self.live_server_url) + + # Click "Add Course" + addCourseButton = self.driver.find_element_by_id("add-course-btn") + addCourseButton.click() + + # Scroll down so the autocomplete menu is in view + # This works around some weird failures + self.driver.execute_script("javascript:window.scrollBy(0,200)") + + # Type in part of a school name + schoolInput = self.driver.find_element_by_id("str_school") + schoolInput.send_keys("harvard u") + + # Wait for autocomplete menu to appear + self.wait.until(EC.element_to_be_clickable((By.XPATH, "//ul[contains(@class,'ui-autocomplete')][1]/li"))) + + # Choose the first suggestion + schoolInput.send_keys(Keys.DOWN) + activeItem = self.driver.find_element_by_id("ui-active-menuitem") + activeItem.click() + + self.assertEqual(schoolInput.get_attribute("value"), "Harvard University") + + schoolId = self.driver.find_element_by_id("id_school") + self.assertEqual(schoolId.get_attribute("value"), self.harvard.id) + + def testCreateCourse(self): + self.driver.get(self.live_server_url) + + # Click "Add Course" + addCourseButton = self.driver.find_element_by_id("add-course-btn") + addCourseButton.click() + self.driver.execute_script("javascript:window.scrollBy(0,200)") + + # We shouldn't be able to save it yet + saveButton = self.driver.find_element_by_id("save-btn") + self.assertIn("disabled", saveButton.get_attribute("class")) + + # Choose a school + self.selectAutocomplete("str_school", "northeastern u", 1) + + # Check that save button is now enabled + self.assertNotIn("disabled", saveButton.get_attribute("class")) + + # Course name + newCourseName = "SELENIUM TEST COURSE " + uuid.uuid4().hex + courseNameInput = self.driver.find_element_by_id("id_name") + courseNameInput.send_keys(newCourseName) + + # Instructor name + newInstructorName = "SELENIUM TEST INSTRUCTOR " + uuid.uuid4().hex + instructorNameInput = self.driver.find_element_by_id("id_instructor_name") + instructorNameInput.send_keys(newInstructorName) + + # Click "Save" + saveButton = self.driver.find_element_by_id("save-btn") + saveButton.click() + + # See if we are taken to the new course page + self.wait.until(EC.title_contains(newCourseName)) + + + def testCreateExistingCourse(self): + self.driver.get(self.live_server_url) + + # Click "Add Course" + addCourseButton = self.driver.find_element_by_id("add-course-btn") + addCourseButton.click() + self.driver.execute_script("javascript:window.scrollBy(0,200)") + + # We shouldn't be able to save it yet + saveButton = self.driver.find_element_by_id("save-btn") + self.assertIn("disabled", saveButton.get_attribute("class")) + + # Choose a school + self.selectAutocomplete("str_school", "northeastern u", 1) + + # Check that save button is now enabled + self.assertNotIn("disabled", saveButton.get_attribute("class")) + + # Course name + newCourseName = "SELENIUM TEST COURSE " + uuid.uuid4().hex + courseNameInput = self.driver.find_element_by_id("id_name") + courseNameInput.send_keys(newCourseName) + + # Instructor name + newInstructorName = "SELENIUM TEST INSTRUCTOR " + uuid.uuid4().hex + instructorNameInput = self.driver.find_element_by_id("id_instructor_name") + instructorNameInput.send_keys(newInstructorName) + + # Click "Save" + saveButton = self.driver.find_element_by_id("save-btn") + saveButton.click() + + # See if we are taken to the new course page + self.wait.until(EC.title_contains(newCourseName)) + + # Now go back to the home page + self.driver.get(self.live_server_url) + + # Click "Add Course" + addCourseButton = self.driver.find_element_by_id("add-course-btn") + addCourseButton.click() + self.driver.execute_script("javascript:window.scrollBy(0,200)") + + # Choose the SAME school + self.selectAutocomplete("str_school", "northeastern u", 1) + + # The SAME course name + self.selectAutocomplete("id_name", newCourseName, 2) + + # The SAME instructor name + self.selectAutocomplete("id_instructor_name", newInstructorName, 3) + + # Make sure Save button is disabled and hidden + saveButton = self.driver.find_element_by_id("save-btn") + self.assertIn("disabled", saveButton.get_attribute("class")) + self.wait.until_not(EC.visibility_of(saveButton)) + + # Make sure Existing Course link is shown + existingCourse = self.driver.find_element_by_id("existing-course-btn") + self.wait.until(EC.visibility_of(existingCourse)) + existingCourse.click() + + # See if we are taken to the new course page + self.wait.until(EC.title_contains(newCourseName)) + +