web自动化笔记(二)
文章目录
- 一、参数化测试
- 1.pytest命令
- 2.实现参数化测试
- 3.填写地址测试
- 4.生成Allure测试报告
- 5.关键字驱动
- 二、案例
- 1.实现后台登录
- 1.1登录
- 1.2.处理验证码
- 1.3.封装识别验证码函数
- 2.通过cookie保持登录
- 2.1给页面添加cookie
- 2.2获取页面的cookie
- 2.3自动化获取cookie
- 三、excel进行数据加载
- 1.安装第三方工具
- 2.封装函数
- 3.使用数据
- 注
一、参数化测试
对于相似的测试用例,实现代码重用,减少代码量,提高维护性。
让一份代码,执行多个用例,每组参数都独立执行一次。
1.pytest命令
#查看版本
pytest --version
#运行特定的测试函数
(1)显式指定函数名,通过::标记,比如命令pytest test_a.py::test_b,则只会运行test_a.py中的test_b函数
(2)使用模糊匹配,使用 -k 选项标识,比如命令pytest -k sqrt test_a.py
(3)使用pytest.mark在函数上进行标记。
#使用装饰器跳过指定的测试函数
@pytest.mark.skip()
#使用装饰器实现预见错误功能
@pytest.mark.xfail()
#参数
-v #输出详细信息
-m #选择标记的测试函数
2.实现参数化测试
import pytest
def test_a():
print("这是一个测试用例")
@pytest.mark.parametrize(
"i", #参数名
range(5), #参数值
)
def test_b(i):
print(f"这是{i}个测试用例")
3.填写地址测试
import pytest
from webdriver_helper import get_webdriver
from pages import *
from test_a import driver
#整个测试会话只执行一次
@pytest.fixture(scope='session')
def user_driver():
#完成登录操作
driver=get_webdriver()
driver.maximize_window()
driver.get('登录页面网址(自己填)')
#login_page函数在上次已完成,在这里直接使用
login_page=LoginPage(driver)
login_page.login("账号","密码")
assert login_page.msg.text =='登录成功'
yield driver
driver.quit()
@pytest.mark.parametrize(
"name,tel,sheng,shi,qu,address,msg"
[
["", "", "", "", "", "", "提示信息"],
["姓名", "", "省", "市", "区", "地址", "提示信息"],
["姓名", "电话", "", "市", "区", "地址", "提示信息"],
["姓名", "电话", "省", "", "区", "地址", "提示信息"],
["姓名", "电话", "省", "市", "", "地址", "提示信息"],
["姓名", "电话", "省", "市", "区", "", "提示信息"],
["姓名", "电话", "省", "市", "区", "地址", "操作成功"],
],
)
def test_new_address(user_driver,name,tel,sheng,shi,qu,address,msg):
user_driver.get("新增地址页面网址")
page=AddressPage(user_driver)
page.click_new()
page.input_info(
name,
tel,
sheng,
shi,
qu,
address,
)
page.click_save()
assert page.msg.text ==msg
4.生成Allure测试报告
安装
pip install allure-pytest
启用插件
创建pytest.ini文件
写入:
[pytest]
addopts= --alluredir=./.allure_results
log_file_level =info
执行用例,生成结果
pytest
生成测试报告
截图
allure.attach(self._driver.get_screenshot_as_png(),)
5.关键字驱动
页面的样式和功能无线,但是用户操作有限,配合excel完成测试。
1.流程
1.1在excel列出用户动作(关键字)
2.框架读取,执行关键字
3.加载其他插件,实现并行测试,失败重试,HTML报告。
二、案例
1.实现后台登录
1.1登录
import time
from os import times
from selenium import webdriver
from selenium.webdriver.common.by import By
#创建驱动对象
driver=webdriver.Chrome()
#访问被测页面
driver.get("网址")
#页面最大化
driver.maximize_window()
#登录
driver.find_element(By.XPATH,'账号的xpath').send_keys("账号")
driver.find_element(By.XPATH,'密码的xpath').send_keys("密码")
driver.find_element(By.XPATH,'验证码的xpath').send_keys("验证码")
driver.find_element(By.XPATH,'登录按钮xpath').click()
time.sleep(5)
#关闭驱动
driver.quit()
1.2.处理验证码
验证码常用处理方式:
(1)关闭验证码功能
(2)设置万能验证码
(3)通过第三方
3.1获取验证码图片:使用selenium提供的截图方法获取验证码图片。
3.2通过第三方接口发送请求识别验证码内容。
3.3从返回结果的字典中提取验证码结果。
admin_login.py:
import time
from importlib.metadata import files
from os import times
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from urllib3 import request
#创建驱动对象
driver=webdriver.Chrome()
#访问被测页面
driver.get("网址")
#页面最大化
driver.maximize_window()
#截图验证码图片
driver.find_element(By.XPATH,'验证码xpath').screenshot("截图名称.png")
#通过第三方接口发送请求识别验证码内容
url="第三方链接"
#传递参数信息:用户名、密码、用户id、验证码编号
data={
"user":"用户名",
"pass":"密码",
"sofid":"用户id",
"codetype":1902
}
#提取验证码图片
files={"userfile":open("截图名称.png","rb")}
#发送接口请求识别验证码
resp=requests.post(url,data=data, files=files)
#查看响应结果:
res=resp.json()
print(res)
if res["err_no"]==0:
code=res["pic_str"]
else:
print("验证码识别失败")
#登录
driver.find_element(By.XPATH,'账号的xpath').send_keys("账号")
driver.find_element(By.XPATH,'密码的xpath').send_keys("密码")
driver.find_element(By.XPATH,'验证码的xpath').send_keys("code")
driver.find_element(By.XPATH,'登录按钮xpath').click()
time.sleep(5)
#关闭驱动
driver.quit()
1.3.封装识别验证码函数
在utils模块中定义一个函数进行识别验证码:
1.发送接口请求,携带对应的参数信息
2.获取返回结果,提取验证码信息
3.返回验证码实际值
utils.py:
import requests
def img_code():
url = "第三方链接"
data = {
"user": "用户名",
"pass": "密码",
"sofid": "用户id",
"codetype": 1902
}
files = {"userfile": open("截图名称.png", "rb")}
resp = requests.post(url, data=data, files=files)
res = resp.json()
if res["err_no"] == 0:
code = res["pic_str"]
print(f"验证码识别成功:{code}")
return code
else:
print("验证码识别失败")
return False
进行调用函数使用验证码的值:(admin_login.py:)
#调用验证码识别函数获取验证码
code=img_code()
2.通过cookie保持登录
需要保持登录状态的方式:
1.通过cookie信息的唯一标识符id进行验证
2.让标识符id一直保持登录的状态,那么再次访问就是已登录状态
3.通过cookie的机制原理先获取已登录的id,然后在未登录的页面进行使用并且刷新清除缓存
需要退出登录状态方式:
1.关闭整个浏览器:自动清除cookie信息
2.删除已登录的标识符id:刷新页面,自动退出登录状态
注意点:cookie值修改完成之后,一定要进行清除缓存才能生效
2.1给页面添加cookie
使用selenium提供的方法,需要添加的cookie的内容是键值对的方式。
通过手动添加已登录的cookie信息,绕过登录操作流程,直接保持登录状态。
#给页面添加cookie
driver.add_cookie(
{"name":"cookie名称","value":"值"}
)
#刷新页面清除缓存
driver.refresh()
2.2获取页面的cookie
cookies=driver.get_cookies()
for i in cookies:
print(i)
2.3自动化获取cookie
在第一次登录完成之后,把页面的已登录的cookie信息进行保存,后续直接使用已登录的cookie信息。
获取和使用cookie信息:
#保存cookie信息
def save_cookies(driver):
cookies=driver.get_cookies()
#将cookies的信息转换成json的格式写入到cookies.json文件中
with open("cookies.json","w") as f:
f.write(json.dumps(cookies))
#使用cookie信息
def load_cookies(driver):
#从cookies.json文件中读取cookie信息:
#将JSON格式的字符串解析为Python对象
try:
with open("cookies.json") as f:
cookies=json.loads(f.read())
#获取cookie信息
for cookie in cookies:
driver.add_cookie(cookie)
else:
#刷新
driver.refresh()
except:
pass
判断是否登录:
def is_login(driver):
if "管理员登录" in driver.title:
print("未登录")
return True
else:
print("已登录")
优化代码:
#自己导入
#创建驱动对象
driver=webdriver.Chrome()
#访问被测页面
driver.get("网址")
#页面最大化
driver.maximize_window()
#使用cookie信息
load_cookies(driver)
if is_login(driver):
#截图验证码图片
driver.find_element(By.XPATH,'验证码xpath').screenshot("截图名称.png")
#调用验证码识别函数获取验证码
code=img_code()
#登录
driver.find_element(By.XPATH,'账号的xpath').send_keys("账号")
driver.find_element(By.XPATH,'密码的xpath').send_keys("密码")
driver.find_element(By.XPATH,'验证码的xpath').send_keys("code")
driver.find_element(By.XPATH,'登录按钮xpath').click()
#保存cookie信息
save_cookies(driver)
time.sleep(5)
#关闭驱动
driver.quit()
三、excel进行数据加载
1.安装第三方工具
#安装
pip install openpyxl
#查看
pip list
2.封装函数
from openpyxl import load_workbook
#读取excel数据
def read_excel(path):
#打开文件
wb=load_workbook(path)
#获取默认的工作表:第二行开始为数据
ws=wb.active
for d in ws.iter_rows(min_row=2,values_only=True):
yield d
if __name__=='__main__':
#路径如果抛出unicodeescape错误,使用双反斜杠\\,或者使用正斜杠/,或者加r
data=read_excel('excel表格路径')
for d in data:
print(d)
3.使用数据
@pytest.mark.parametrize(("wd","count"),read_excel('D:\\installer\\Python\\xm\\pythonProject3\\ddt.xlsx'))
注
内容学自b站 码尚软件测试平台 和 巨量质量管理平台