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

playwright自动化项目搭建

2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)【持续更新最新版】-CSDN博客

具备功能

关键技术:

  • pylaywright测试库
  • pytest单元测试框架
  • pytest-playwright插件

非关键技术:

  • pytest-html插件
  • pytest-rerunfailures插件
  • seldom 测试框架

实现功能:

  • 元素定位与操作分离
  • 失败自动截图并保存到HTML报告
  • 失败重跑
  • 可配置不同的浏览器执行
  • 可配置headless/headful 模式
  • 实现参数化读取数据文件

一个自动化具备的基本功能差不多就这些了。其实主要是使用了一堆框架和插件,主要是整合能力。

使用方式

  • 安装依赖
$ pip install -r requirements.txt

注:安装requirements.txt指定依赖库的版本,这是经过测试的,有时候新的版本可会有错。

  • 配置

在 config.py 文件配置

class RunConfig:"""运行测试配置"""# 运行测试用例的目录或文件cases_path = "./test_dir/test_parametrize.py"# 配置浏览器驱动类型(chromium, firefox, webkit)。browser = "chromium"# 运行模式(headless, headful)mode = "headful"# 配置运行的 URLurl = "https://www.baidu.com"# 失败重跑次数rerun = "0"# 当达到最大失败数,停止执行max_fail = "5"
  • 运行

运行测试

$ python run.py

设计细节

  • 关于page object设计模式

page object是自动化测试最常用的设计模式。

但 playwright 中的只提供了操作方法,元素定位测试数据都只是参数。

# 输入
page.type('#kw', "playwright")
# 点击
page.click('#su')

我们依然,可以将元素定位单独封装一层。

class BaiduElem:search_input = "#kw"  # 搜索框search_button = "#su"  # 搜索按钮settings = "#s-usersetting-top"  # 设置search_setting = "#s-user-setting-menu > div > a.setpref"  # 搜索设置save_setting = 'text="保存设置"'  # 保存设置

在测试用例中的使用

from element.baidu_element import BaiduElem
from playwright.sync_api import Pagedef test_baidu_search(page: Page, base_url):""""""page.goto(base_url)page.type(BaiduElem.search_input, text="playwright")page.click(BaiduElem.search_button)sleep(2)assert page.title() == "playwright_百度搜索"

这肯定不是什么好的设计。用例层写起来会比较啰嗦, 最好可以page.elem.type("playwright") 的语法实现,这就需要在playwright的基础上再封装一套API, 看playwright 源码还是有些复杂的,主要是用了很多就异步,成本比较大,暂时先这么用。

  • 关于自动截图

自动截图需要 pytest/pytest-html 和 playwright 配合完成, pytest/pytest-html 判断用例实现,并把图片插入到报告中。 playwright 实现截图动作。

@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):"""用于向测试用例中添加用例的开始时间、内部注释,和失败截图等.:param item:"""pytest_html = item.config.pluginmanager.getplugin('html')outcome = yieldreport = outcome.get_result()report.description = description_html(item.function.__doc__)extra = getattr(report, 'extra', [])page = item.funcargs["page"]if report.when == 'call':xfail = hasattr(report, 'wasxfail')if (report.skipped and xfail) or (report.failed and not xfail):case_path = report.nodeid.replace("::", "_") + ".png"if "[" in case_path:case_name = case_path.split("-")[0] + "].png"else:case_name = case_pathcapture_screenshots(case_name, page)img_path = "image/" + case_name.split("/")[-1]if img_path:html = '<div><img src="%s" alt="screenshot" style="width:304px;height:228px;" ' \'onclick="window.open(this.src)" align="right"/></div>' % img_pathextra.append(pytest_html.extras.html(html))report.extra = extradef capture_screenshots(case_name, page):"""配置用例失败截图路径:param case_name: 用例名:return:"""global driverfile_name = case_name.split("/")[-1]if RunConfig.NEW_REPORT is None:raise NameError('没有初始化测试报告目录')else:image_dir = os.path.join(RunConfig.NEW_REPORT, "image", file_name)page.screenshot(path=image_dir)

通过page = item.funcargs["page"] 拿到playwright的驱动,截图判断逻辑有点复杂,不过我已经实现了。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

相关文章:

  • laravel(源码笔记)服务绑定和解析(依赖注入-反射,控制反转)
  • 【DFS+贪心】第十四届蓝桥杯省赛C++ B组《飞机降落》(C++)
  • wordpress给指定ID分类添加特定的字段
  • 【skimage包如何安装】
  • CentOS7使用Docker部署.net Webapi
  • python云上水果超市的设计与实现flask-django-php-nodejs
  • C/C++代码性能优化——数据结构和算法
  • 云手机为电商提供五大出海优势
  • 企业数字化转型:是竞争力的关键,还是行业炒作?
  • web自动化测试框架都是有哪些?
  • vim | 介绍vim以及配置vimrc文件
  • 【C语言】C语言运算符优先级详解
  • 汽车制造产生的污废水如何处理排放
  • 简述从浏览器发出请求到数据返回的全过程
  • 洛谷 1679.神奇的四次方数
  • @jsonView过滤属性
  • Android Volley源码解析
  • Angular4 模板式表单用法以及验证
  • hadoop集群管理系统搭建规划说明
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • javascript 总结(常用工具类的封装)
  • java中的hashCode
  • Mocha测试初探
  • MQ框架的比较
  • PHP 的 SAPI 是个什么东西
  • python_bomb----数据类型总结
  • python3 使用 asyncio 代替线程
  • Webpack入门之遇到的那些坑,系列示例Demo
  • Zsh 开发指南(第十四篇 文件读写)
  • 两列自适应布局方案整理
  • 前端学习笔记之观察者模式
  • 手写一个CommonJS打包工具(一)
  • 用Visual Studio开发以太坊智能合约
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #android不同版本废弃api,新api。
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $NOIp2018$劝退记
  • (3)nginx 配置(nginx.conf)
  • (52)只出现一次的数字III
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (七)c52学习之旅-中断
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (循环依赖问题)学习spring的第九天
  • (一) springboot详细介绍
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .aanva
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET应用架构设计:原则、模式与实践 目录预览