Created
November 30, 2011 22:48
-
-
Save pamelafox/1411564 to your computer and use it in GitHub Desktop.
Selenium Utility Funcs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException | |
class SeleniumPage(object): | |
driver = None | |
waiter = None | |
def open_page(self, url): | |
self.driver.get(url) | |
def reload_page(self): | |
self.driver.refresh() | |
def print_el(self, element): | |
print 'tag: ' + element.tag_name + ' id: ' + element.get_attribute('id') + ' class: ' + element.get_attribute('class') + ' text: ' + element.text | |
def get_el(self, selector): | |
if isinstance(selector, (str, unicode)): | |
return self.driver.find_element_by_css_selector(selector) | |
else: | |
return selector | |
def get_els(self, selector): | |
if isinstance(selector, (str, unicode)): | |
return self.driver.find_elements_by_css_selector(selector) | |
else: | |
return selector | |
def get_child_el(self, parent, selector): | |
try: | |
return parent.find_element_by_css_selector(selector) | |
except NoSuchElementException: | |
return None | |
def get_child_els(self, parent, selector): | |
return parent.find_elements_by_css_selector(selector) | |
def is_el_present(self, selector): | |
try: | |
self.driver.find_element_by_css_selector(selector) | |
return True | |
except NoSuchElementException: | |
return False | |
def verify_el_present(self, selector): | |
if not self.is_el_present(selector): | |
raise Exception('Element %s not found' % selector) | |
def verify_el_notpresent(self, selector): | |
if self.is_el_present(selector): | |
raise Exception('Element %s is present and shouldnt be' % selector) | |
def verify_hidden(self, selector): | |
if self.is_el_visible(selector): | |
raise Exception('Element %s is visible and should be hidden' % selector) | |
def verify_visible(self, selector): | |
if not self.is_el_visible(selector): | |
raise Exception('Element %s is hidden and should be visible' % selector) | |
def is_el_visible(self, selector): | |
return self.get_el(selector).is_displayed() | |
def verify_el_invisible(self, selector): | |
if self.get_el(selector).is_displayed(): | |
raise Exception('Element %s is visible and shouldnt be' % selector) | |
def remove_local_storage(self, key): | |
self.driver.execute_script('localStorage.removeItem("%s")' % (key)) | |
def scroll_to(self, selector): | |
self.driver.execute_script('window.scrollTo(0, $("%s").position().top);' % (selector)) | |
def click_button(self, selector): | |
if self.driver.name == 'iPhone': | |
self.driver.execute_script('$("%s").trigger("tap")' % (selector)) | |
else: | |
try: | |
self.get_el(selector).click() | |
except WebDriverException: | |
self.driver.execute_script('window.scrollBy(0,200)') | |
self.get_el(selector).click() | |
def hover_over_el(self, selector): | |
from selenium.webdriver import ActionChains | |
el = self.get_el(selector) | |
hover = ActionChains(self.driver).move_to_element(el) | |
hover.perform() | |
# For faster setting, when we dont care about watching typeity type type | |
def set_value(self, selector, text): | |
self.driver.execute_script('$("%s").val("%s")' % (selector, text)) | |
# For hidden elements | |
def get_text(self, selector): | |
return self.driver.execute_script('return $("%s").text()' % (selector)) | |
def enter_text_field(self, selector, text): | |
text_field = self.get_el(selector) | |
text_field.clear() | |
text_field.send_keys(text) | |
def select_checkbox(self, selector, name, deselect=False): | |
found_checkbox = False | |
checkboxes = self.get_els(selector) | |
for checkbox in checkboxes: | |
if checkbox.get_attribute('name') == name: | |
found_checkbox = True | |
if not deselect and not checkbox.is_selected(): | |
checkbox.click() | |
if deselect and checkbox.is_selected(): | |
checkbox.click() | |
if not found_checkbox: | |
raise Exception('Checkbox %s not found.' % (name)) | |
def select_option(self, selector, value): | |
found_option = False | |
options = self.get_els(selector) | |
for option in options: | |
if option.get_attribute('value') == str(value): | |
found_option = True | |
option.click() | |
if not found_option: | |
raise Exception('Option %s not found' % (value)) | |
def get_selected_option(self, selector): | |
options = self.get_els(selector) | |
for option in options: | |
if option.is_selected(): | |
return option.get_attribute('value') | |
def is_option_selected(self, selector, value): | |
options = self.get_els(selector) | |
for option in options: | |
if option.is_selected() != (value == option.get_attribute('value')): | |
return False | |
return True | |
def is_text_equal(self, selector, text): | |
return self.get_el(selector).text == text | |
def verify_inputs_checked(self, selector, checked): | |
checkboxes = self.get_els(selector) | |
for checkbox in checkboxes: | |
name = checkbox.get_attribute('name') | |
if checkbox.is_selected() != (name in checked): | |
raise Exception('Input isnt checked as expected - %s' % (name)) | |
def verify_option_selected(self, selector, value): | |
if not self.is_option_selected(selector, value): | |
raise Exception('Option isnt selected as expected') | |
def verify_radio_value(self, selector, value): | |
value = str(value) | |
radios = self.get_els(selector) | |
for radio in radios: | |
radio_value = radio.get_attribute('value') | |
if radio.is_selected() and radio_value != value: | |
raise Exception('Radio with value %s is checked and shouldnt be' % radio_value) | |
elif not radio.is_selected() and radio_value == value: | |
raise Exception('Radio with value %s isnt checked and should be' % radio_value) | |
def verify_text_field(self, selector, text): | |
text_field = self.get_el(selector) | |
value = text_field.get_attribute('value') | |
if value != text: | |
raise Exception('Text field contains %s, not %s' % (value, text)) | |
def verify_text_value(self, selector, value): | |
text_field = self.get_el(selector) | |
if isinstance(value, (int, float)): | |
value = str(value) | |
if text_field.get_attribute('value').encode('utf-8') != value.encode('utf-8'): | |
raise Exception('Value of %s not equal to "%s" - instead saw "%s"' % (selector, value, text_field.get_attribute('value'))) | |
def verify_text_of_el(self, selector, text): | |
if not self.is_text_equal(selector, text): | |
raise Exception('Text of %s not equal to "%s" - instead saw "%s"' % (selector, text, self.get_el(selector).text)) | |
def verify_text_in_els(self, selector, text): | |
els = self.get_els(selector) | |
found_text = False | |
for el in els: | |
if text in el.text: | |
found_text = True | |
if not found_text: | |
raise Exception('Didnt find text: %s' % (text)) | |
def verify_text_not_in_els(self, selector, text): | |
els = self.get_els(selector) | |
found_text = False | |
for el in els: | |
if text in el.text: | |
found_text = True | |
if found_text: | |
raise Exception('Found text: %s' % (text)) | |
def is_button_enabled(self, selector): | |
return (self.get_el(selector).get_attribute('disabled') == 'false' or self.get_el(selector).get_attribute('disabled') == None) | |
def check_title(self, title): | |
return self.driver.title == title or self.driver.title == 'eatdifferent.com: ' + title | |
def wait_for(self, condition): | |
self.waiter.until(lambda driver: condition()) | |
def check_num(self, selector, num): | |
els = self.get_els(selector) | |
return len(els) == num | |
def wait_for_num_els(self, selector, num): | |
try: | |
self.waiter.until(lambda driver: self.check_num(selector, num)) | |
except TimeoutException: | |
raise Exception('Never saw %s number of els for %s' % (num, selector)) | |
def wait_for_visible(self, selector): | |
try: | |
self.waiter.until(lambda driver: self.is_el_visible(selector)) | |
except TimeoutException: | |
raise Exception('Never saw element %s become visible' % (selector)) | |
def wait_for_hidden(self, selector): | |
try: | |
self.waiter.until(lambda driver: not self.is_el_visible(selector)) | |
except TimeoutException: | |
raise Exception('Never saw element %s become hidden' % (selector)) | |
def wait_for_button(self, selector): | |
try: | |
self.waiter.until(lambda driver: self.is_button_enabled(selector)) | |
except TimeoutException: | |
raise Exception('Never saw button %s enabled' % (selector)) | |
def wait_for_text(self, selector, text): | |
try: | |
self.waiter.until(lambda driver: self.is_text_equal(selector, text)) | |
except TimeoutException: | |
raise Exception('Never saw text %s for %s' % (text, selector)) | |
def wait_for_el(self, selector): | |
try: | |
self.waiter.until(lambda driver: self.is_el_present(selector)) | |
except TimeoutException: | |
raise Exception('Never saw element %s' % (selector)) | |
def wait_for_title(self, title): | |
try: | |
self.waiter.until(lambda driver: self.check_title(title)) | |
except TimeoutException: | |
raise Exception('Never saw title change to %s' % (title)) | |
def __init__(self, driver, waiter): | |
self.driver = driver | |
self.waiter = waiter |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment