2013-04-05 16:48:36 +04:00

277 lines
6.8 KiB
Python

# Copyright (c) 2013 Mirantis Inc.
#
# Licensed 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.
import logging
from selenium.webdriver.support.ui import Select
import xml.etree.ElementTree as ET
logging.basicConfig()
LOG = logging.getLogger(' Page object: ')
"""
Disable selenium logging:
"""
logger = logging.getLogger('selenium.webdriver.remote.remote_connection')
logger.setLevel('ERROR')
class ObjectsLibrary:
file = None
objects = []
def __init__(self, file_name='objects.xml'):
"""
Initialization of the Objects Library.
Read objects descriptions from XML file.
"""
self.file = file_name
tree = ET.parse(self.file)
objects = tree.getroot()
self.objects = []
for element in objects:
object = {}
for parameter in element:
object.update({parameter.tag: parameter.text})
self.objects.append(object)
def get_object(self, name, pagename):
"""
Search objects in Objects Library.
"""
for object in self.objects:
obj_pagename = object.get('pagename', None)
if object['name'] == name and (obj_pagename == pagename
or obj_pagename is None):
return object['parameter']
return None
class TableCellClass:
table = None
def __init__(self, obj):
if not obj:
LOG.error('TableCell does not found')
self.table = obj
def Text(self):
if self.table:
LOG.critical(self.table.text)
return self.table.text
else:
return ''
class ButtonClass:
button = None
def __init__(self, obj):
if not obj:
LOG.error('Button does not found')
self.button = obj
def Click(self):
if self.button:
self.button.click()
def isPresented(self):
if self.button:
return True
return False
class LinkClass:
link = None
def __init__(self, obj):
if not obj:
LOG.error('Link does not found')
self.link = obj
def Click(self):
if self.link:
self.link.click()
def isPresented(self):
if self.link:
return True
return False
def Address(self):
if self.link:
return self.link.get_attribute('href')
else:
return ''
class EditBoxClass:
def __init__(self, obj):
if not obj:
LOG.error('EditBox does not found')
self.edit = obj
def isPresented(self):
if self.edit:
return True
return False
def Set(self, value):
if self.edit:
try:
self.edit.clear()
self.edit.send_keys(value)
except:
LOG.error('Can not set value for text box.')
def Text(self):
if self.edit:
return self.edit.get_text()
else:
return ''
class DropDownListClass:
select = None
def __init__(self, obj):
if not obj:
LOG.error('DropDownList does not found')
self.select = obj
def isPresented(self):
if self.select is not None:
return True
return False
def Set(self, value):
if self.select:
try:
Select(self.select).select_by_visible_text(value)
except:
LOG.error('Can not select element %s from drop down list.'
.format(value))
def Text(self):
if self.select:
return self.select.get_text()
else:
return ''
error_msg = """
Object with parameter: %s
does not found on page.
"""
class Page:
driver = None
timeout = 10
lib = None
name = None
def __init__(self, driver):
driver.set_page_load_timeout(self.timeout)
driver.implicitly_wait(0.01)
self.driver = driver
def _find_element(self, name, parameter=None):
"""
This method allows to find element,
based on descriptions in Object Library,
xpath, id, name or pertial link text.
If parameter != None will be used name % parameter
"""
lib = ObjectsLibrary()
if lib.get_object(name, self.name):
name = lib.get_object(name, self.name)
if parameter:
name = name % parameter
obj = None
k = 0
while (obj is None and k < self.timeout):
k += 1
try:
obj = self.driver.find_element_by_name(name)
return obj
except:
pass
try:
obj = self.driver.find_element_by_id(name)
return obj
except:
pass
try:
obj = self.driver.find_element_by_xpath(name)
return obj
except:
pass
try:
obj = self.driver.find_element_by_partial_link_text(name)
return obj
except:
pass
LOG.error(error_msg % name)
return None
def Open(self, url):
self.driver.get(url)
def Refresh(self):
self.driver.refresh()
def TableCell(self, name, parameter=None):
obj = self._find_element(name, parameter)
table = TableCellClass(obj)
return table
def Button(self, name, parameter=None):
obj = self._find_element(name, parameter)
button = ButtonClass(obj)
return button
def Link(self, name, parameter=None):
obj = self._find_element(name, parameter)
link = LinkClass(obj)
return link
def EditBox(self, name, parameter=None):
obj = self._find_element(name, parameter)
edit = EditBoxClass(obj)
return edit
def DropDownList(self, name, parameter=None):
obj = self._find_element(name, parameter)
select = DropDownListClass(obj)
return select
def Navigate(self, path):
"""
This method allows to navigate by
webUI menu button and links to
the specific page
"""
steps = path.split(':')
for step in steps:
self.Button(step).Click()