0


自动化测试笔记(selenium+pytest+Allure)

自动化测试:所有采用程序或代码来替代或辅助人工测试的行为称为自动化测试。
自动化测试好处:提升工作效率
主要应用环节:回归测试、兼容性测试、冒烟测试
适合自动化测试的项目特点:
1、项目需求稳定
2、项目周期较长
3、脚本可以重复使用

selenium:是由thoughtworks公司2004年左右开发的基于浏览器的自动化测试工具,提供了一整套的用于
web UI自动化的函数。
组成:webdriver:基于浏览器的自动化测试工具,提供了一整套的用于web UI自动化的函数。
selenium IDE:firefox浏览器的插件,可以录制脚本,selenium3.0已被淘汰。
selenium grid:用于管理和执行自动化测试用例(课程中讲jenkins)

 selenium是一个C/S模式工具,脚本是C端,浏览器是S端,使用json wire协议。

搭建自动化测试环境:
1、安装python和编译器
2、安装浏览器,将浏览器的安装路径添加到path变量中。
3、将浏览器的驱动文件存放路径添加到path变量中
4、导入selenium库(pip install selenium)
离线导入:下载selenium tar包,解压。
python setup.py build
python setup.py install

注意:浏览器驱动文件与浏览器版本需要匹配,工作中浏览器版本不能频繁升级

chrome浏览器驱动文件下载地址:http://chromedriver.storage.googleapis.com/index.html
https://npm.taobao.org/mirrors/chromedriver
火狐浏览器驱动文件对应地址:https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html
下载地址: https://github.com/mozilla/geckodriver/releases

edge浏览器驱动文件下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

元素定位:
定位方法:
find_element():单元素定位,返回值为定位到的元素对象
find_elements():多元素定位,返回值为列表,列表中是定位到的元素对象

八种元素定位方式:
1、id定位:find_element(By.ID,'id属性值')
2、name定位:find_element(By.NAME,'name属性值')
3、class定位:find_element(By.CLASS_NAME,'name属性值')
class属性值中有空格时必须使用点代替
4、tag定位:find_element(By.TAG_NAME,'元素的标签值')
5、link_text定位:find_element(By.LINK_TEXT,'超链接文字')
6、partial_link_text定位:find_element(By.PARTIAL_LINK_TEXT,'超链接部分文字')
7、css定位:find_element(By.CSS_SELECTOR,'css值')
8、xpath定位:find_element(By.XPATH,'xpath值')

Day2:
frame框架(标签是iframe或frame)切换:
切换方法:
切入框架: switch_to.frame()
1、id切入:switch_to.frame('frame框架id属性值')
2、name切入:switch_to.frame('frame框架name属性值')
3、先定位frame框架,再切入:switch_to.frame(frame框架对象)
4、索引切入:switch_to.frame(索引值)

注意:frame框架存在嵌套的情况下需要一层一层切入

返回父框架:switch_to.parent_frame()
切出框架:switch_to.default_content()

网页切换:
1、获取打开网页的句柄,得到一个由网页对象组成的列表,按照网页打开顺序,索引从0开始
handles = driver.window_handles

2、切换网页:switch_to.window(handler[索引值])
3、close():关闭网页

网页常用操作:
网页最大化:maximize_window(),避免由于没有最大化显示,网页上元素堆叠,影响元素定位。浏览器打开后第一件事情就是网页最大化。
网页最小化:minimize_window()
设置网页大小:set_window_size(1024,768)
网页刷新:refresh()
网页前进:forword()
网页后退:back()
获取网页的url:current_url
获取网页的标题:titile
网页截图:get_screenshot_as_file()

页面元素常用操作:
1、获取元素上的文字:text
2、获取元素的属性值:get_attribute()
3、清除元素内容:clear() ,避免由于浏览器缓存,造成重复输入,原则上输入前都清除一下
4、判断元素是否被选中:is_selected()
5、判断元素是否显示:is_displayed()
6、判断元素是否可用:is_enabled()

鼠标模拟操作:
在ActionChains库中提供了模拟鼠标操作的方法
鼠标右击:context_click()
鼠标双击:double_click()
鼠标悬停:move_to_element()
按住鼠标不松开:click_and_hold()
拖拽某个元素一定的距离:drag_and_drop_by_offset()
拖拽某个元素到另一个元素上:drag_and_drop()
移动鼠标距离某个元素左上角一定像素的位置上:move_to_element_with_offset()
发送某些键到当前焦点元素:send_keys()
点击当前焦点元素:click()
松开鼠标:release()
执行以上动作:perform()

火狐浏览器下像素距离测量插件:Measure-it

警告窗口处理:
1、切入警告窗口,获取窗口对象
alert_window = switch_to.alert
2、点击确定:alert_window.accept()
3、点击取消:alert_window.dismiss()
4、获取提示信息:alert_window.text
5、发送键:alert_window.send_keys()

模拟键盘操作:
send_keys(Keys.xxx)

下拉菜单操作:
1、直接定位子菜单,通过点击选择
2、当无法直接定位子菜单时,可以采取二次定位方式,先定位子菜单的上层元素,再定位子菜单
find_element().find_element()
3、对于标签为select的元素(一般是下拉菜单或多选框),可以使用select类下的方法来选择。
常用的方法:
select_by_index():通过索引选择
select_by_value():通过value属性值选择
select_by_visible_text():通过文字选择
deselect_all():取消所有选择
deselect_by_index():通过索引取消选择,适用于多选的情况
deselect_by_value():通过value属性值取消选择,适用于多选情况
deselect_by_visible_text():通过文字取消选择,适用于多选情况
first_select_option: 返回第一个选择
all_select_options:返回所有选择

注意:用select类下的方法操作下拉菜单或多选框时,需要先定位下拉菜单或多选框

java script应用:
在ui自动化测试过程中,可能会通过改变元素的属性值或删除元素的某个属性值来达到简化操作的目的。
常用方法:删除元素的属性值、修改元素的属性值、添加属性值
1、删除元素属性js:
js = 'arguments[0].removeAttribute();'

2、修改元素的属性值、添加属性值(属性存在就是修改,属性不存就是添加):
js = 'arguments[0].setAttribute();'

3、滚动浏览器的滚动条:
'window.scrollTo();'
4、移动滚动条到某个元素可以显示出来的位置
'arguments[0].scrollIntoView();'

文件上传:
1、如果文件路径输入框的type属性为file,可以定位文件路径输入框,使用send_keys()将上传文件
的路径及名称填入输入框,点击上传,实现上传操作。

2、使用win32gui库和win32con下的方法实现上传。
需要 pip install pypiwin32

文件下载:
opt = webdriver.ChromeOptions() # 实例化ChromeOptions类对象
prefs = {"download.default_directory":"D:\jnc\selenium_0630"} # 设置下载的默认路径
opt.add_experimental_option('prefs',prefs)
driver = webdriver.Chrome(options=opt)

等待设置:
强制等待sleep():使用起来最简单的一种等待方式。确定很明显就是设置短了不管用,时间设置长了又浪费时间。

隐式等待implicitly_wait():隐式等待是设置一个等待时间,等待网页是否加载完成,如果在设置的等待时间内
网页加载完成,则会立刻执行后续脚本,不会等完设置的时间,如果在设置的时间内网页没有加载完成,则会超
时报错。隐式等待依然存在浪费时间的情况,因为现在网页都是随时间局部加载的,只要所需的元素加载出来就
可以执行后续脚本了,不需要等完整个网页的加载的,但是隐式等待是必须等完整个页面加载完成,所以依然存
在浪费时间的情况。隐式等待在整个浏览器的驱动周期内只需要设置一次。

显示等待webdriverwait():显示等待可以结合until()方法,在until方法中设置等待条件,在webdriverwait()中设置
等待时间和间隔时间(默认0.5秒),按照设置的间隔时间每隔一定时间判断一下等待条件是否成立,成立则立刻执行后续脚本,不会等完设置的等待时间,如果在设置的等待时间内条件一直不成立,则超时报错。在until中可以设置多种等待条件满足各种等待场景,例如等待某个元素是否出现,出现立刻执行后续脚本,判断框架是否可以切入,可以则直接切入。

在expected_conditions模块下,提供了各种各样的等待条件,可以形成丰富的等待场景。
常用动态等待条件(方法):
title_is():判断当前页面的标题是否等于某个字符串,相等则条件成立,成立返回bool值,如果在设置的等待时间内条件一直不成立,则超时报错。
title_contains():判断当前页面的标题是否包含某个字符串,相等则条件成立,成立返回bool值,如果在设置的等待时间内条件一直不成立,则超时报错。

presence_of_element_located():判断某个元素是否出现,传参为元组,例(By.ID,"ID值"),返回值为定位到的元素。
在设置的等待时间内,元素出现则返回元素对象,否则超时报错。

visibility_of_element_located():判断某个元素是否出现且元素为非隐藏且宽和高不为0的元素,传参为元组,例(By.ID,"ID值"),返回值为定位到的元素。
在设置的等待时间内,元素出现则返回元素对象,否则超时报错。

presence_of_all_elements_located():判断多个元素是否出现,传参为元组,例(By.ID,"ID值"),返回值为定位到的元素组成的列表。在设置的等待时间内,元素出现则返回元素对象组成的列表,否则超时报错。

visibility_of_all_elements_located():判断多个元素是否出现且元素为非隐藏且宽和高不为0的元素,传参为元组,例(By.ID,"ID值"),返回值为定位到的元素组成的列表。在设置的等待时间内,元素出现则返回元素对象组成的列表,否则超时报错。

element_to_be_clickable():判断元素是否可以点击,传参为元组,例(By.ID,"ID值"),返回值为定位到的元素。
在设置的等待时间内,元素出现则返回元素对象,否则超时报错。

frame_to_be_available_and_switch_to_it():判断某个框架是否可以切入,可以则直接切入。传参为元组,条件成立
返回bool值,如果设置时间内一直不成立则超时报错。

alert_is_present():判断警告窗口是否出现,出现则返回警告窗口对象。

text_to_be_present_in_element():判断某个元素的文字中是否包含某个字符,传参为一个元组和一个字符串,如果包含
则返回bool值,在设置的等待时间内条件一直不成立则超时报错

text_to_be_present_in_element_value():判断某个元素的value属性值中是否包含某个字符,传参为一个元组和一个字符串,如果包含
则返回bool值,在设置的等待时间内条件一直不成立则超时报错

框架搭建:提升代码的复用性和可维护性,提升工作效率。
搭建框架步骤:
1、规划框架的分层 2、采用什么自动化测试的思想或模式 3、编码
框架分层:
第一层(基础功能层):实现页面动作(AW actionword)的 封装、实现日志输出、测试数据读取、配置数据读取、数据库SQL执行等功能
第二层(页面层):在第一层的基础上,基于第一层所封装的方法或函数,采用po模式,将每个页面看做一个独立
的对象,把页面上的操作步骤进行封装。
第三层(业务流程层):在第二层基础上,组合不同页面上的操作步骤方法,形成不同的业务流程。
基于第三层编写用例。

po(page object)模式:把每一个页面看做一个独立对象,将页面上元素的定位方式定义为属性,页面上的操作步骤
封装为方法。
数据驱动:测试数据记录在excecl文件中,自动化测试脚本按照测试数据编写,最终的体现就是脚本是按照数据执行。

pytest框架:
是一个第三方的python单元测试框架,适用于python的单元测试,也适用于自动化测试。可以通过插件扩展功能。
安装pytest:pip install pytest

pytest框架用例编写规则:
1、.py格式用例文件命名时必须以test_开头或以_test结尾。
2、测试用例类命名必须以Test开头
3、测试用例函数和测试用例方法命名必须以test_开头
(测试用例在pytest框架下,可以定义为函数也可以定义为方法)
4、pytest框架下,断言使用assert。

需要定义前置方法和后置方法:
前置方法setup():定义所有用例执行前的公共的操作,例如:驱动浏览器,实例化某些类的对象
后置方法teardown():定义所有用例执行后的公共的操作,例如:关闭浏览器

在.py文件中执行用例,可以使用
pytest.main(['-s','XXXXXXX.py']),-s:允许用例执行时输出一些执行信息。-q:简单化输出执行信息

断言的机制:
当用例执行完成,如果系统中没有捕获到任何异常,则用例pass,如果系统捕获到AssertionError异常,
用例被标识为failed。如果用例执行失败,系统捕获到非AssertionError异常,用例标识为error。

pytest框架下的前置方法和后置方法:
setup_module(),teardown_module():整个模块中的用例执行前和执行后只执行一次
setup_function(),teardown_function():每一个定义为函数的测试用例执行前和执行后各执行一次
setup_class(),teardown_class():整个类中的用例执行前和执行后只执行一次
setup(),teardown():类中的用例每个用例执行前和执行后各执行一次
setup_method(),teardown_method():类中的用例每个用例执行前和执行后各执行一次

pytest插件网站:https://docs.pytest.org/en/latest/reference/plugin_list.html

1、pytest 控制用例执行顺序
在用例上使用装饰器来控制用例执行顺序
插件名称:pytest-ordering
安装:pip install pytest-ordering
使用方法:在测试用例上添加装饰器@pytest.mark.run(order=x)
order参数的值决定用例的执行顺序,可以是正数可以是负数,
正负数都有的情况下优先执行正数。
执行优先级:正数>没有设置优先级>负数,值越小执行优先级越高。

2、跳过部分用例执行
使用方法:通过装饰器控制
@pytest.mark.skip(reason=None)#无条件跳过
@pytest.mark.skipif(condition=xxx,reason=None)#有条件跳过
condition:跳过条件,True则跳过 reason:跳过的原因
当在skipif中设置了跳过条件后,必须设置reason=xxx

3、用例执行失败重新执行一定的次数
需要导入插件:pip install pytest-rerunfailures
1、在用例上添加装饰器:@pytest.mark.flaky(reruns=3)
控制单个用例重新执行

 2、在pytest.ini文件中添加参数 -- reruns x  # x就是重新执行的次数
     

4、标记用例执行(指定哪些用例执行)
使用方法:添加装饰器 pytest.mark.标签名 #标签名由自己定义
标签名需要在pytest.ini文件中提前配置:
markers =
标签1
标签2
标签3
执行用例时pytest命令后加-m参数
例:pytest -m 标签名
pytest -m "标签1 and 标签2"
pytest -m "标签1 or 标签2"

5、pytest测试用例参数化
使用方法:添加装饰器
@pytest.mark.parametrize(arguments,argvalue)
arguments:参数名 argvalue:参数值
有几组参数用例就会执行几次

6、pytest下fixture函数(锚定函数,固定装置函数):

 fixture函数功能类似于前置方法和后置方法,相对于setup teardown有明显的优点:
 1、有独立的命名,通过声明它从测试函数、模块、类、整个项目中使用
 2、每个fixture函数可以互相调用
 3、可以对fixture函数设置参数,可以跨类、函数、模块使用
 
 
 

定义fixture函数规则:
fixture函数命名不能以test_开头,要跟用例区分
在函数上添加装饰器@pytest.fixture(),来声明这个函数是一个fixture函数
fixture函数必须定义在conftest.py文件中,conftest.py文件名称是固定的,pytest会自动识别该文件,
该文件放大哪个目录下,就对该目前及其子目录起作用。例如放到项目的根目录下,就会对整个项目起到全局的作用。
fixture函数使用yield关键字返回值,没有返回值的化默认返回None

在fixture函数中使用yield关键字区分前置代码和后置代码,yield之前的是前置代码,之后是后置代码

fixture函数使用:
1、在测试用例上添加装饰器@pytest.mark.usefixtures("fixture函数名称")使用使用
2、fixture函数作为用例的参数使用

如果fixture函数需要定义形参,使用request作为形参来接收实参
如何给fixture函数传参:
使用parametrize()装饰器,将fixture函数名作为参数,即可传参
例:@pytest.mark.parametrize('fixture函数名',[参数值],indirect=True)

fixture函数的作用范围:
在fixture函数中有个参数scope可以控制fixture函数的作用范围:
scope参数的值分别是:session、module、class、function(默认值)
session:一次会话中所有的用例执行前和执行后执行一次前置代码和后置代码,可以跨.py文件使用
module:每一个.py文件中所有的用例执行前和执行后执行一次前置代码和后置代码
class:每一个类中所有的用例执行前和执行后执行一次前置代码和后置代码
function:每个函数或方法执行前和执行后执行一次前置代码和后置代码

Allure测试报告:
allure是一个独立的测试报告库,可以生成美观易懂的测试报告
安装:
1、导入alllure包:pip install allure-pytest
2、下载allure的zip包,allure下载地址:https://github.com/allure-framework/allure2/releases
下载后将zip包解压,将解压后的bin目录添加的path变量中

allure报告生成:先生成json格式的文件,再将json格式文件转换为html格式。
可以在pytest.ini文件中添加allure报告生成的参数及文件生成路径: --alluredir json格式文件生成路径

json格式报告查看:allure serve json格式文件所在目录
将json格式报告转换为html格式:
allure generate json格式文件所在目录 -o html文件所在目录 --clean
html格式报告查看:allure open html文件所在目录

标签: selenium pytest python

本文转载自: https://blog.csdn.net/Miss__xxzz/article/details/127227597
版权归原作者 Miss__xxzz 所有, 如有侵权,请联系我们删除。

“自动化测试笔记(selenium+pytest+Allure)”的评论:

还没有评论