| # 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) |
| |