#coding=gbk
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By #导入by方法
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains ##对鼠标事件操作
from selenium.webdriver.common.keys import Keys # 对键盘事件操作
from common import HTMLTestReportCN #测试报告
from common.log_utils import logger
from common.config_utils import config
class BasePage(object):
def __init__(self,driver):
self.driver=driver
# ------ -------------------------------------浏览器操作封装----------------------------------------------#
#打开网页
def open\_url(self,url):
self.driver.get(url)
logger.info('打开URL地址%s;'%url)
def set\_browser\_max(self):
self.driver.maximize\_window()
logger.info("设置浏览器的最大化")
def close\_tab(self):
self.driver.close()
logger.info('关闭当前的tab页签')
def set\_brower\_min(self):
self.driver.minimize\_window()
logger.info("设置浏览器的最小化")
def brower\_refresh(self):
self.driver.refresh()
logger.info("浏览器的刷新操作")
def get\_title(self):
value=self.driver.title
logger.info("获取网页的标题为:%s"%value)
return value
def quit\_brower(self):
self.driver.quit()
logger.info("关闭浏览器")
# ------ ------------------------------------- 等待封装---------------------------------------------------#
#测试OK
def implicitly\_wait(self,seconds=config.get\_timeout):
self.driver.implicitly\_wait(seconds)
def wait(self,seconds=config.get\_timeout):
time.sleep(seconds)
# ------ ------------------------------------- 元素识别的封装----------------------------------------------#
def find\_element(self,element\_info):
try:
locator\_type\_name=element\_info\['locator\_type'\]
locator\_value\_info=element\_info\['locator\_value'\]
locator\_timeout=element\_info\['timeout'\]
if locator\_type\_name =='id':
locator\_type=By.ID
elif locator\_type\_name=='class':
locator\_type=By.CLASS\_NAME
elif locator\_type\_name=='xpath':
locator\_type=By.XPATH
# 识别元素
element=WebDriverWait(self.driver,locator\_timeout)\\
.until(lambda x:x.find\_element(locator\_type,locator\_value\_info))
logger.info('\[%s\]元素识别成功'%element\_info\['element\_name'\])
except Exception as e:
logger.error('\[%s\]元素不能识别,原因是%s' % (element\_info\['element\_name'\], e.\_\_str\_\_()))
self.screenshot\_as\_file() # 失败后截屏
return element
# ------ -------------------------------------获取属性封装----------------------------------------------#
#获取元素属性封装-测试OK
def get\_element\_attribute(self,element\_info,attribute\_name):
element=self.find\_element(element\_info)
value=element.get\_attribute(attribute\_name)
logger.info('\[%s\]元素的%s的值为:%s'%(element\_info\['element\_name'\],attribute\_name,value))
return value
#获取元素text属性封装-测试OK
def get\_text(self,element\_info):
text=self.find\_element(element\_info).text
logger.info('\[%s\]元素的text值为:%s'%(element\_info\['element\_name'\],text))
return text
#------ ------------------------------------- 鼠标事件封装----------------------------------------------#
#元素鼠标操作封装:-测试OK
def click(self,element\_info):
element=self.find\_element(element\_info)
logger.info('\[%s\]元素进行点击操作'%element\_info\['element\_name'\])
element.click()
#元素鼠标操作:右击-测试OK
def context\_click(self,element\_info):
mouse = ActionChains(self.driver)
element = self.find\_element(element\_info)
logger.info('\[%s\]元素进行右击操作' % element\_info\['element\_name'\])
mouse.context\_click(element).perform()
#元素鼠标操作:移动到该元素上--测试OK
def move\_to\_element\_by\_mouse(self,element\_info):
element = self.find\_element(element\_info)
mouse = ActionChains(self.driver)
logger.info('将鼠标移动到\[%s\]元素上' % element\_info\['element\_name'\])
mouse.move\_to\_element(element).perform()
def long\_press\_element(self,element\_info,senconds):
element = self.find\_element(element\_info)
logger.info('将鼠标长按到\[%s\]元素上后松开' % element\_info\['element\_name'\])
mouse = ActionChains(self.driver)
mouse.click\_and\_hold(element).pause(senconds).release(element)
def scrollIntoView(self,element\_info):
element=self.find\_element(element\_info)
logger.info('将滚动条滚动至\[%s\]元素可见'%element\_info\['element\_name'\])
self.driver.execute\_script('arguments\[0\].scrollIntoView();', element)
time.sleep(1)
# ------ ------------------------------------- 键盘事件封装-------------------------------------------#
# #键盘事件操作封装:输入内容--OK
def input(self,element\_info,content):
element=self.find\_element(element\_info)
element.send\_keys(content)
logger.info('\[%s\]元素输入内容:%s'%(element\_info\['element\_name'\],content))
#删除内容-测试OK
def back\_space(self,element\_info):
element=self.find\_element(element\_info)
logger.info('\[%s\]元素操作back\_space' % (element\_info\['element\_name'\]))
element.send\_keys(Keys.BACK\_SPACE)
#清空内容--测试OK
def clear\_input(self,element\_info):
element=self.find\_element(element\_info)
logger.info('\[%s\]元素输入框操作清空' % (element\_info\['element\_name'\]))
element.clear()
#按回车--测试OK
def enter(self,element\_info):
element=self.find\_element(element\_info)
logger.info('\[%s\]元素进行回车键操作' % (element\_info\['element\_name'\]))
element.send\_keys(Keys.ENTER)
#全选 Ctrl+a--测试OK
def ctrl\_a(self,element\_info):
element=self.find\_element(element\_info)
logger.info('\[%s\]元素输入框内容进行全选操作' % (element\_info\['element\_name'\]))
element.send\_keys(Keys.CONTROL, 'a')
#粘贴 Ctrl +x--测试OK
def ctrl\_x(self,element\_info):
element=self.find\_element(element\_info)
logger.info('\[%s\]元素输入框内容进行剪切操作' % (element\_info\['element\_name'\]))
element.send\_keys(Keys.CONTROL, 'x')
#粘贴 Ctrl +v--测试OK
def ctrl\_v(self,element\_info):
element=self.find\_element(element\_info)
logger.info('\[%s\]元素输入框内容进行粘贴操作' % (element\_info\['element\_name'\]))
element.send\_keys(Keys.CONTROL, 'v')
# ------ ------------------------------------- 弹窗封装----------------------------------------------#
#弹窗处理封装-测试OK
def get\_alert\_content(self,action='accept',timeout=config.get\_timeout):
WebDriverWait(self.driver, timeout).until(EC.alert\_is\_present())
alter = self.driver.switch\_to.alert
value = alter.text
logger.info('当前弹窗的内容为:%s' % value)
if action == 'accept':
alter.accept()
elif action == 'dismiss':
alter.dismiss()
return value
# ------ -------------------------------------frame封装-----------------------------------------------#
#frame封装frame == > id/name frame元素对象
#思路一
def switch\_to\_frame(self,element\_info):
element = self.find\_element(element\_info)
self.driver.switch\_to.frame(element)
logger.info('\[%s\]frame元素切换成功' %(element\_info\["element\_name"\]))
#思路二
def switch\_to\_frame\_id\_or\_name(self,id\_or\_name):
self.driver.switch\_to.frame(id\_or\_name)
def switch\_to\_frame\_by\_element(self,element\_info):
element = self.find\_element(element\_info)
self.driver.switch\_to.frame(element)
logger.info('\[%s\]frame元素切换成功' % (element\_info\["element\_name"\]))
#------------------------------------selenium执行js封装-----------------------------------------------#
def execute\_script(self,js\_str,element\_info=None):
if element\_info:
self.driver.execute\_script(js\_str)
else:
self.driver.execute\_script(js\_str,None)
def delete\_element\_attribute(self,element\_info,attribute\_name):
element = self.find\_element(element\_info)
self.driver.execute\_script('arguments\[0\].removeAttribute("%s");'%attribute\_name,element)
def update\_element\_attribute(self, element\_info, attribute\_name,attribute\_value):
element = self.find\_element(element\_info)
self.driver.execute\_script('arguments\[0\].setAttribute("%s","%s");' %(attribute\_name,attribute\_value), element)
# ------ -------------------------------------切换句柄封装-------------------------------------------#
##方式一--测试OK
def switch\_window\_by\_title(self,title):
for handle in self.driver.window\_handles:
self.driver.switch\_to.window(handle)
if self.driver.title.\_\_contains\_\_(title):
break
logger.info('切换到网页标题为\[%s\]的句柄成功!'%title)
#方式二--测试OK
def switch\_window\_by\_url(self,url):
for handle in self.driver.window\_handles:
self.driver.switch\_to.window(handle)
if self.driver.current\_url.\_\_contains\_\_(url):
break
logger.info('切换到URL为\[%s\]的句柄成功!' % url)
#----------------------------截图封装----------------------------------------------------------#
#测试OK
# def screenshot\_as\_file\_old(self, \*screenshot\_path):
# current\_dir = os.path.dirname(\_\_file\_\_)
# if len(screenshot\_path) == 0:
# screenshot\_filepath = config.screenshot\_path
# else:
# screenshot\_filepath = screenshot\_path\[0\]
# now = time.strftime('%Y\_%m\_%d\_%H\_%M\_%S')
# screenshot\_filepath\_finally = os.path.join(current\_dir, '../' ,screenshot\_filepath, 'UITest\_%s.png' % now)
# self.driver.get\_screenshot\_as\_file(screenshot\_filepath\_finally)
# logger.info('图片截取成功')
#如果要在测试报告中截图,需要使用这个截图封装
def screenshot\_as\_file(self):
report\_path = os.path.join( os.path.abspath(os.path.dirname(\_\_file\_\_)) , '..', config.report\_path)
report\_dir = HTMLTestReportCN.ReportDirectory(report\_path)
report\_dir.get\_screenshot( self.driver )
手机扫一扫
移动阅读更方便
你可能感兴趣的文章