selenium
1、8大元素定位
id name class_name xpath css tag_name link_text partail_link_text
xpath
1)绝对路径定位 以/开头
2)相对路径 以//开头
a) 相对路径+索引定位 找到唯一标签,往下依次找//form/span/input[1]
b) 相对路径+属性定位
//input[@name="wd"] 从input标签中去找唯一的属性定位
c)相对路径+通配符定位
//*[@name="wd"]从当前页面所有标签中去搜索该属性
//*[@*="wd"]从当前页面所有标签和所有属性中去找属性=“wd”的元素
d) 相对路径+部分属性值定位
//input[satrt_with(@name,'w')]查找标签属性name以‘w’开头的元素
//input[substring(@name,1)='d']以XX结尾
//input[contains(@name,'w')包含
e) 相对路径+文本定位
//span[text()="按图片搜索"]
css:
1、绝对路径(不用)
2、通过ID和CLASS定位
3、通过属性定位
4、通过部分属性定位
5、查询子元素定位
6、查询兄弟节点定位
框架:
frame:
进入框架swith_to.frame("frame名称")
跳出框架swith_to.default_content()
下拉选择:
实例化select(元素定位)
sel = select(driver.find_element(By.ID,"xxx"))
sel.select_by_visible(“你好”)文本
sel.select_by_index(“2”)下标
文件上传:
driver.find_element(By.NAME,"xxxxx").send_keys(r"文件路径")
处理弹窗:
alert(只有确定),confirm(有确定也有取消),pormpt(除了确认/取消还可以输入)
实例化弹窗
ale = driver.switch_to.alert
ale.dismiss()取消
ale.accept()确认
ale.text()获取文本
ale.send_keys()输入值
这些操作跟上面的弹窗类型需要一一对应
列表操作元素所有都一样,可以通过find_elements(By.NAME."标签属性")获取一个list,然后通过下标去取值
例子:列表删除操作
del_list =find_elements(By.NAME."标签属性")
if len(del_list) > 0:
del_list.click()
else:
print("no messge")
设计模型(框架)
Pom模式+关键字驱动
pom模式:page object model
分三层:
1、基础层:base 主要放selenium原生方法;
2、页面层:po 主要用于放页面原素和页面的动作;
3、用例层:testcase 存放测试用例及测试数据
页面层调用基础层;用例层调用页面层
unittest前后置处理(夹具)
setup在测试用例之前的准备工作
teardown在测试用例结束后的收尾工作
断言:
self.assertEqual() 判断两个值是否相等
self.assertTrue() 判断一个值是否为True
self.assertIn() 包含,判断一个值是否在另一个值里边
一、DDT+EXCEL数据驱动
DDT使用方法
@ddt 装饰类,作用是申明当前类使用DDT数据驱动
@data 装饰函数,作用是给函数传值
@unpack 装饰函数,作用是数据解包
@file_data 装饰函数,作用是直接读取yaml、json文件
二、pytest
默认规则:
1、模块名必须以test_开头,或者_test结尾;
2、测试类必须以Test开头,并且不能有init方法;
3、测试方法必须以test开头
pytest主文件运行及allure报告生成
# 生成json格式临时文件
pytest.main(['-vs', './testcase', '--alluredir', './temp', '--clean-alluredir'])
# 根据json格式临时文件生成allure报告
os.system('allure generate ./temp -o ./report --clean')
pytest.ini文件 核心配置文件
1、位置:项目根目录
2、编码:必须是ANSI,可以使用notpad++修改编码模式
3、作业:改不pytest的默认行为
4、运行规则:不管是主函数的模式运行,还是命令行模式运行,都会去读取这个配置文件
[pytest]
addopts = -vs #命令行参数,用空格分隔
testpaths = ./testcase #测试用例的路径
python_files = test_*.py #模块的命名规则
python_calsses = Test* #类名的命名规则
python_funtions = test #方法的命名规则
分布式执行:
pytest -s -n auto test_xdist.py
- -n auto:可以自动检测到系统的CPU核数;
- 使用auto利用了所有CPU来跑用例;
- 也可以指定使用几个CPU来跑用例:
pytest执行顺序
1、unittest ascll的大小来执行[0-9][A-Z][a-z]
2、pytest默认从上到下 改不默认顺序:使用mark标记
@pytest.mark.run(order=2)
分组执行:(冒烟,分模块执行,分接口和WEB执行)
示例:
在pytest.ini文件增加
smokes =
smoke:冒烟用例
api:接口用例
代码:
@pytest.mark.smoke
def test_01():
print("123")
执行命令:
pytest -vs "smoke" 单个
pytest -vs "smoke" or “api” 多个用例用"or"连接
跳过测试用例:
@pytest.mark.skip(resason="xxxx")无条件跳过
@pytest.mark.skipif() 根据条件跳过