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