| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| # KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations | |
| # under the License. | |
| #!/usr/bin/python | |
| # coding: latin-1 | |
| from selenium.selenium import selenium | |
| from selenium.common.exceptions import NoSuchElementException | |
| from selenium import webdriver | |
| from selenium.webdriver.common.by import By | |
| from selenium.common.exceptions import WebDriverException | |
| from selenium.common.exceptions import TimeoutException | |
| from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0 | |
| from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 | |
| import re, sys, time, traceback | |
| def try_except_decor(func): | |
| def try_except(*args, **kwargs): | |
| try: | |
| return func(*args, **kwargs) | |
| except WebDriverException as err: | |
| exc_type, exc_value, exc_traceback = sys.exc_info() | |
| print "WebDriver error. Function: {0}, error: {1}".format(func.func_code, err) | |
| print repr(traceback.format_exception(exc_type, exc_value,exc_traceback)) | |
| except NoSuchElementException as err: | |
| exc_type, exc_value, exc_traceback = sys.exc_info() | |
| print "Element error. Function: {0}, error: {1}".format(func.func_code, err) | |
| print repr(traceback.format_exception(exc_type, exc_value,exc_traceback)) | |
| except TimeoutException as err: | |
| exc_type, exc_value, exc_traceback = sys.exc_info() | |
| print "Timeout error. Function: {0}, error: {1}".format(func.func_code, err) | |
| print repr(traceback.format_exception(exc_type, exc_value,exc_traceback)) | |
| return try_except | |
| class Shared(object): | |
| @staticmethod | |
| @try_except_decor | |
| def option_selection(browser, element_type, element_name, option_text, wait_element_type = '', wait_element_name = ''): | |
| ret = False | |
| Shared.wait_for_element(browser, element_type, element_name) | |
| if element_type == 'id': | |
| ele = browser.find_element_by_id(element_name) | |
| elif element_type == 'class_name': | |
| ele = browser.find_element_by_class_name(element_name) | |
| options = ele.find_elements_by_tag_name('option') | |
| option_names = [option.text for option in options] | |
| if option_text not in option_names: | |
| return ret | |
| for option in options: | |
| if option.text.find(option_text) > -1: | |
| option.click() | |
| ret = True | |
| time.sleep(1) | |
| break | |
| if len(wait_element_type) > 0 and len(wait_element_name) > 0: | |
| Shared.wait_for_element(browser, wait_element_type, wait_element_name) | |
| return ret | |
| @staticmethod | |
| @try_except_decor | |
| def flash_message(browser): | |
| try: | |
| ele1 = browser.find_element_by_id('flashMessageArea') | |
| except NoSuchElementException: | |
| ele1 = None | |
| if ele1 != None: | |
| ele2 = ele1.find_element_by_class_name('flash_message') | |
| if ele2 != None and ele2.text != None and len(ele2.text) > 0: | |
| return ele2.text | |
| else: | |
| return '' | |
| else: | |
| return '' | |
| @staticmethod | |
| @try_except_decor | |
| def string_selection(browser, key, value, index = 0): | |
| element = browser.find_elements_by_id(key)[index] | |
| element.clear() | |
| element.send_keys(value) | |
| @staticmethod | |
| def wait_until_title_text(browser, text, waittime = 30): | |
| wait = WebDriverWait(browser, waittime) | |
| wait.until(lambda browser: browser.title.lower().find(text.lower()) > -1) | |
| @staticmethod | |
| def wait_until_find_id(browser, element_id, waittime = 10): | |
| wait = WebDriverWait(browser, waittime) | |
| wait.until(lambda browser: browser.find_element_by_id(element_id)) | |
| @staticmethod | |
| # the name should exist in the newer page, but not in older one | |
| def wait_for_element(browser, element_type, name, waittime = 30): | |
| wait = WebDriverWait(browser, waittime) | |
| if element_type.lower() == 'id': | |
| wait.until(EC.presence_of_element_located((By.ID, name))) | |
| elif element_type.lower() == 'tag_name': | |
| wait.until(EC.presence_of_element_located((By.TAG_NAME, name))) | |
| elif element_type.lower() == 'class_name': | |
| wait.until(EC.presence_of_element_located((By.CLASS_NAME, name))) | |
| elif element_type.lower() == 'xpath': | |
| wait.until(EC.presence_of_element_located((By.XPATH, name))) | |
| elif element_type.lower() == 'link_text': | |
| wait.until(EC.presence_of_element_located((By.LINK_TEXT, name))) | |
| #feed the string through directly | |
| else: | |
| wait.until(EC.presence_of_element_located(element_type, name)) | |
| time.sleep(1) | |
| def playing_around(self): | |
| from threading import Timer | |
| t = Timer(20,self.wait_for_invisible) | |
| t.start() | |
| @staticmethod | |
| #wait until something disappears | |
| def wait_for_invisible(browser, element_type, name, waittime=30): | |
| wait = WebDriverWait(browser, waittime) | |
| # the code base uses underscores, but the real string doesn't have em. | |
| final_type = re.sub('_',' ',element_type) | |
| wait.until(EC.invisibility_of_element_located((final_type, name))) | |
| #this method isn't as slick as I hoped :( | |
| time.sleep(1) |