playwright自动化项目搭建
这是关于playwright系列介绍的最后一篇。搭建基于 playwright 的自动化项目。
GitHub地址: https://github.com/defnngj/playwright-pro
具备功能
关键技术:
- 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"
# 配置运行的 URL
url = "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 Page
def 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 = yield
report = 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_path
capture_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_path
extra.append(pytest_html.extras.html(html))
report.extra = extra
def capture_screenshots(case_name, page):
"""
配置用例失败截图路径
:param case_name: 用例名
:return:
"""
global driver
file_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的驱动,截图判断逻辑有点复杂,不过我已经实现了。
总结
- playwright还不稳定,我在使用的时候时常报一些错误,错误日志也不友好。计划在正式项目中使用的谨慎考虑,估计有一些坑要踩。
- 不熟悉playwright的API,可以通过官方文档,或者是项目自带的测试用例,或者阅读项目源码都是很好的学习方式。
playwright自动化项目搭建的更多相关文章
- UI自动化项目搭建(selenium+testng+java+maven)
一 工具准备 selenium chormDriver 二 环境准备 三搭建步骤
- 接口自动化项目搭建(Java+testng+maven+git+springboot)
自动化测试: https://www.bilibili.com/video/av31078661?from=search&seid=16551153777362561361 一工具准备 二 环 ...
- Gulp.js - 简单、直观的自动化项目构建工具
Gulp.js 是一个简单.直观的构建系统.崇尚代码优于配置,使复杂的任务更好管理.通过结合 NodeJS 的数据流的能力,你能够快速构建.通过简单的 API 接口,只需几步就能搭建起自己的自动化项目 ...
- 团队自动化环境搭建与管理--php博弈
我是方少,很开心与大家日后与大家交流技术上面的一些想法和一些业务上的分享.以前从来没写过博客,因为觉得不重要吧,如今觉得有必要沉淀一些想法和回忆.好了费话不多说. 先上图: 业务问题:在每次新伙伴加入 ...
- 接口自动化:HttpClient + TestNG + Java(一) - 接口测试概述+自动化环境搭建
1.1 接口测试简介 1.1.1 什么是接口测试 开始学习接口自动化测试之前,我们先要来了解什么是接口,以及什么是接口测试. 我们都知道,测试从级别上划分可以分为 组件测试 集成测试 系统测试 验收测 ...
- 微信小程序之wepy自动化架构搭建(fly+wepy-plugin-replace)
前言 本文章秉着自动化工程项目的思想搭建的,基础架子完全按照wepy官网搭建,在基础上增加配置达到自动化项目.新增动flxio拦截器自动处理接口,新增根据环境变量来改变运行时的参数. Fly.js 小 ...
- Vue项目搭建流程 以及 目录结构构建
Vue项目搭建流程 以及 目录结构构建 一个小的Vue项目, 基于微信浏览器的移动端, 做了这么多的练习项目, 这一次准备记录下构建的过程, 以方便以后的调高效率 环境准备 操作系统 我的 windo ...
- Java自动化环境搭建笔记(3)
Java自动化环境搭建笔记(3) 自动化测试 自动化的环境已经基本搭建完成,后续可对BaseTester基类以及工具类进行扩展.下面便是持续集成的环境的搭建: Jenkins安装 git安装 源码上传 ...
- Java自动化环境搭建笔记(2)
Java自动化环境搭建笔记(2) 自动化测试 在笔记一中已经完成了一键构建项目.xml指定规划测试集.数据解耦与allure报告生成的开发.接下来便是: 浏览器驱动通过配置启动 页面元素定位解耦,通过 ...
随机推荐
- Flink读写Redis(一)-写入Redis
项目pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...
- C++回调函数的理解与使用
一.回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在 ...
- 程序综合设计实践 :QT实现计算器
程序综合设计实践 :用QT实现简易计算器及贷款计算 1,项目概述 该项目目标是设计开发一个支持连续计算的包括括号( ),求余%四则运算+ - * /的计算器 Calculator 以及贷款计算功能 M ...
- python爬虫之解析链接
解析链接 1. urlparse() & urlunparse() urlparse() 是对url链接识别和分段的,API用法如下: urllib.parse.urlparse(urlstr ...
- MySQL在Windows下压缩包方式安装与卸载
一.MySQL的卸载: 1.停止MySQL服务 2.移除MySQL 二.安装: 1.官网下载压缩版 https://downloads.mysql.com/archives/community/ 2. ...
- SpringCloud 源码系列(5)—— 负载均衡 Ribbon(下)
SpringCloud 源码系列(4)-- 负载均衡 Ribbon(上) SpringCloud 源码系列(5)-- 负载均衡 Ribbon(下) 五.Ribbon 核心接口 前面已经了解到 Ribb ...
- SonarQube - 以Docker方式启动SonarQube
1 - SonarQube镜像 https://hub.docker.com/_/sonarqube/ Dockerfile - 7.9.1-community https://github.com/ ...
- 生成对抗网络(Generative Adversarial Networks, GAN)
生成对抗网络(Generative Adversarial Networks, GAN)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的学习方法之一. GAN 主要包括了两个部分,即 ...
- 【vue】入门介绍
一.前端开发工具vscode 前端代码编写工具,使用vscode:vscode官网 安装好之后,可以先装如下几个插件,方便后续的开发. 二.编写代码 1.vscode快捷键生成html代码 在vsco ...
- docker 使用笔记
docker 使用笔记 1. 与宿主机之间拷贝文件 docker cp test.html 99f952ac05e6cd879f14aa6c9d0db02aaf498634edc4f6cdc9953c ...