当前位置: 首页 > article >正文

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站 码尚软件测试平台 和 巨量质量管理平台


http://www.kler.cn/a/545849.html

相关文章:

  • MySQL 定时备份与恢复
  • snort3.0 获取注册规则(19000多条)
  • DeepSeek 开放平台无法充值使用 改用其他中转平台API调用DeepSeek-chat模型方法
  • iThenticate有中文版官网吗,是否可信
  • 【鸿蒙开发】第三十六章 状态管理 - V1V2混用和迁移指导
  • Halcon和VisionMaster还有Opencv中旋转矩形的处理
  • 深入了解常见MCU架构:ARM、AVR与其他嵌入式系统
  • DeepseeK自动写作,自动将回答导出文档
  • C++之线程
  • linux 安装nginx
  • JENKINS(全面)
  • 自动化测试实战
  • MG协议转换器:破解暖通设备通讯壁垒的智能钥匙
  • [鸿蒙笔记-基础篇_生命周期篇] Harmony OS
  • HTTP请求Host注入
  • 【原理图PCB专题】自制汉字转码工具,适配Allgero 17版本 Skill
  • 理解WebGPU 中的 GPUDevice :与 GPU 交互的核心接口
  • 图神经网络简介
  • 理解 WebGPU 中的 GPUQueue:GPU 的命令队列
  • 机器学习:朴素贝叶斯