Python3学习笔记_web自动化基础十三_20200801
Python经典循环导入问题:
多个模块互相调用的时候,避免互相调用造成死循环的问题,
如果真的有两个模块要互相调用,可以将导入的代码写到函数里面,不写到模块开头
对于异常的处理,加日志记录
方法1:直接写到定义的方法里,使用系统自带的find_element,这样的话比较繁琐,凡事使用系统自带的find_element都要单独写异常处理,太麻烦
def enter_username(self,username):
try:
self.driver.find_element(*self.username_locator1).send_keys(username)
except:
HandlerAll.logger.error('元素找不到{}'.format(self.username_locator1))
return self
方法2:封装好一个find_element
def find_element(self,locator):
'''查找元素'''
try:
el=self.driver.find_element(*locator)
return el
except:
HandlerAll.logger.error('元素找不到{}'.format(locator))
#在方法里面调用:去掉了driver,使对象发生了变化,这样来区分是系统自带的还是自己封装的
def enter_username(self,username):
self.find_element(*self.username_locator1).send_keys(username)
return self
方法3:使用异常处理的装饰器,自己定义一个异常处理的装饰器,然后直接在要使用的方法上面添加装饰器
@logger_handler
def enter_username(self,username):
pass
对于需要等待的元素的异常处理,也在通用方法中封装起来,这样在等待的时候直接调用就可以了,不用在定义的方法里在单独写异常处理了
def wait_element_click(self,locator,timeout=20,poll=0.5,):
'''等待某个元素可以被点击'''
try:
ele = WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).until(
expected_conditions.element_to_be_clickable(locator)
)
return ele
except:
HandlerAll.logger.error('元素找不到{}'.format(locator))
对于找不到元素进行截图
对于截图路径的处理,可以在logs下建一个子文件夹img,通过时间戳去保存截图
def screen_shot(self):
'''截图'''
path=config.IMG_PATH
ts=datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
filename=os.path.join(path,ts+'.png')
self.driver.save_screenshot(filename)
调用截图函数:
def find_element(self,locator):
'''查找元素'''
try:
el=self.driver.find_element(*locator)
return el
except:
self.save_screenshot()
HandlerAll.logger.error('元素找不到{}'.format(locator))
截图装饰器
def screenshot(f):
def wrapper(*args,**kw):
try:
f(*args,**kw)
except Exception as e:
obj,*args=args
if not hasattr(obj,'driver'):
raise e
driver=getattr(obj,'driver')
driver.save_screenshot('demo.png')
return wrapper
调用装饰器
@screenshot
def find_element(self,locator):
pass
Jenkins集成的时候报错:找不到浏览器的路径:在 conftest 的 driver 函数中设置,不报这个错误不需要设置
from selenium.webdriver import ChromeOptions
如果执行Jenkins的错误是找不到Chrome,那么需要配置二进制路径和无头选项
# 导入浏览器的选项类
option=ChromeOptions()
# 设置浏览器的可执行文件的路径
option.binary_location=r'chrome.exe的路径'
driver = webdriver.Chrome(options=option)
allure
安装allure包:pip3 install allure-pytest
通过allure生成测试报告,生产的报告是json文件:
pytest.main(["--alluredir=allureout".format(ts)])
将 allure 生成的json格式的测试报告文件转化,切换到对应项目下,通过命令行执行,执行完成后通过一个服务自动展示测试报告
allure serve allureout
待解决:
遇到了一个问题,在对应项目下执行时,报错:bash: allure: command not found
Jenkins 设置allure
-jenkins安装allure插件,【如果是想任何目录下都可以使用allure,那么需要将allure配置到环境变量当中】
在'已安装'中要勾选这个插件,不然在'全局工具配置'中找不到这个选项
在'全局工具配置'中,要添加本地allure的安装目录:比如:d:\program files/allure(不需要加\bin)
进入python_web项目下,然后配置构建后操作:allure report
配置中disabled不要勾选
path填写的是测试报告的位置:allureout(从这个文件中获取测试报告的数据)
然后点击保存即可,这样每次构建完成的时候,就会在构建的右侧显示allure图标,点击就可以进入allure测试报告页面
注意:allure是不能发送邮件的,因为allure的数据是json格式的,可以通过点击图标查看
在奴隶机上运行allure:
进入节点,配置从节点,在工具位置下点击新增,
然后选择allure,目录是allure本机的地址:d:\program files\allure
然后保存,在节点中运行即可
本地启动allure服务:allure serve 目录路径
-全局工具配置中设置allure 命令行,在 Allure Commandline中设置
-设置好了之后设置构建后操作,
web 自动化 Jenkins配置要使用分布式控制:
系统管理-节点管理【manage nodes and clouds】-新建节点【配置好后】---
在需要build的项目下配置:限制项目的运行节点【刚新建的节点】--
然后构建就是这个节点也就是奴隶机在运行,服务器就需要自己去执行了,只管发送任务
接口不配奴隶,web 配奴隶
因为web自动化特别费资源
web 自动化测试总结
xpath
xpath的表达式的写法
-// 相对路径
-/ 绝对路径
-and
-索引从1开始,加括号
-轴运算:找哥哥、姐姐、弟弟、妹妹
xpath 和 css 的对比
css更加的简洁,css不支持test文本,查找速度,查找效率更高
xpath的功能更加的强大,支持text文本
selenium 运行机制,运行原理
画的图:python[http]--->webdriver---->[js]---浏览器
什么协议:HTTP
为什么selenium 可以做到跨平台,跨语言?
因为他是基于HTTP协议,实现webdriver的接口服务
不管是什么语言,只要你能访问webdriver的接口服务,那么就能实现selenium的操作
webdriver控制浏览器的时候,中间用的是JS【浏览器内置了JS的解释器】
鼠标操作
ActionChains(driver).click(el).preform()
-perform(),让动作生效
-链条,因为 return self
-应用到了web 自动化测试的框架中,PO模式使用这种链式调用
键盘操作
类属性
select操作
s=Select(el),s.select_by_visible_text
文件上传操作
send_keys()
系统交互,pywinauto,pyautogui
JS操作
execute_script()
arguments[0]
PO模式
什么是PO模式
是把页面封装成一个Python的对象,然后页面当中的属性和操作,封装成对象的属性和方法
PO模式有什么作用
可读性
扩展性
可维护性
灵活性
复用性
PO模式方法的封装原则
web自动化测试的稳定性,如何提高稳定性?
等待
三大等待:隐式,显示,强制
元素定位
使用相对路径
不轻易能改变的定位方式
异常处理
确定一个网页进入到了自己的页面
重运行机制
rerun
web 自动化测试项目
写那些用例,测试计划的时候需要考虑的
写框架的逻辑
什么时候介入自动化
功能稳定的时候
写web 自动化用例的流程
注释:测试步骤
1、准备前置和后置
2、手工测试流程(元素定位方式放在PO当中)
3、需要封装哪些页面行为
4、test_ 调用具体的页面行为