mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
150 lines
5.9 KiB
Python
150 lines
5.9 KiB
Python
# 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)
|
|
|