Playwright:新一代自动化测试工具实践指南 [1]

devtools/2024/10/19 2:22:40/

引言

自动化测试是软件开发中的重要环节,它确保了代码的稳定性和产品质量。Playwright,由微软开发,是一个针对现代Web应用的端到端测试工具,以其跨浏览器、跨平台和高效的特性而备受瞩目。本文将深入探讨Playwright的使用方法,最佳实践,以及如何将其与各种语言和测试框架集成。

1. 为什么选择Playwright

  • 简洁的安装:Playwright的安装过程简单,无需安装各种Driver,且支持异步/同步编程。
  • 跨平台支持:在Windows、Linux和macOS上本地或CI环境中运行,支持无头和有头测试。
  • 多语言支持:包括TypeScript、JavaScript、Python、.NET和Java。
  • 原生移动模拟:适用于Android的Google Chrome和Mobile Safari。
  • 自动等待:元素可操作性检查,消除人为超时的需要。
  • 网络优先断言:动态网络测试,自动重试直到满足条件。
  • 强大的追踪功能:配置重试策略,捕获执行轨迹、视频和屏幕截图。
  • 浏览器隔离:每个测试使用独立的浏览器上下文,提供零开销隔离。

2. Playwright使用

2.1 安装

  • 使用Python的pip安装Playwright库:
    pip install playwright
    
  • 安装内置浏览器驱动:
    python -m playwright install
    
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch()  # 启动 Chromiumcontext = browser.new_context()  # 新建一个上下文page = context.new_page()       # 在上下文中新建一个页面page.goto('https://example.com') # 导航到指定的 URL

上面的例子使用了 sync_playwright() 来获取一个同步的可用的 Playwright 实例。在这个例子中,browsercontextpage 都是同步对象,这意味着代码会在这些对象准备就绪后再继续执行。

2.2 自动录制

  • 查看命令行选项:
    python-mplaywright codegen --help
    
  • 从指定URL开始录制:
    python-mplaywright codegen https://xingzheai.cn/
    
  • 使用Chromium驱动,保存为Python脚本:
    python-mplaywright codegen --target python -o 'my.py' -b chromium https://xingzheai.cn/
    

2.3 定制编写

  • 使用选择器定位元素:
    • CSS选择器:querySelector(engine=body)
    • XPath选择器:querySelectorAll(engine=body)
    • 等待元素:waitForSelector(engine=body)
  • 事件交互:
    • 下拉选择:selectOption, value, label, index
    • 文件上传:setInputFiles, 单个或多个文件
    • 鼠标操作:click, dbclick, down, up, move, tag
    • 键盘操作:press
    • 屏幕截图和录屏:screenshot, recordVideo
      Playwright 提供了多种方式来查找和操作页面上的元素:
# 根据标签名查找第一个元素
elem = page.query_selector('div')# 根据 CSS 选择器查找所有的元素
elems = page.query_selector_all('li')# 等待元素的出现
await page.wait_for_selector('input')# 点击元素
await elem.click()# 填写表单元素
await elem.fill('some text')

2.4 网络拦截

  • 使用page.route来拦截和处理网络请求。

2.5 同步与异步执行

  • 使用sync_playwrightasync_playwright配合with语句进行同步或异步测试。
    Playwright 也支持异步编程风格,使用 async with 关键字:
import asyncio
from playwright.async_api import async_playwrightasync def main():async with async_playwright() as p:browser = await p.chromium.launch()context = await browser.new_context()page = await context.new_page()await page.goto('https://example.com')asyncio.run(main())

在上面的例子中,browsercontextpage 都是异步对象,它们的操作需要通过 await 关键字来等待完成。

2.6 Pytest结合

  • 安装pytest-playwright:
    pip install pytest-playwright
    
  • 编写测试用例:
    import pytest
    from playwright import sync_playwrightdef test_playwright(page):page.goto("https://xingzheai.cn/")with page.expect_popup() as popup_info:page.click('text="智能内容审核"')assert "智能内容审核" == popup_info.value().textContent()
    

2.7 移动端操作

  • 使用playwright.devices模拟移动设备。

3. 高级特性

1. 模拟用户行为

Playwright 可以模拟用户的鼠标、键盘和触控板操作:

# 鼠标点击
await elem.click()# 双击
await elem.double_click()# 右键点击
await elem.context_menu()# 按下键盘键
await page.keyboard.press('ArrowDown')# 输入文本
await elem.type('Hello World!')# 清空输入
await elem.clear()
2. 网络请求拦截

Playwright 允许你拦截和修改网络请求:

# 定义一个拦截器
def intercept(route):response = route.responseresponse.status = 200response.set_header('Content-Type', 'application/json')response.send({'msg': 'success'})# 应用拦截器
page.on('request', lambda route: intercept(route))
3. 跨域问题解决

Playwright 提供了一种简单的跨域解决方案:

# 在服务器端开启 CORS
Access-Control-Allow-Origin: *# 在客户端设置上下文参数
options = {'enableNetworkEmulation': True, 'networkConditions': {}}
context = browser.new_context(extra_args=['--disable-blink-features=OutOfBlanket'])

4. Playwright最佳实践

  • 隔离测试:每个测试独立运行,避免依赖其他测试。
  • 避免测试第三方依赖:只验证你控制的代码。
  • 使用定位器:优先考虑用户可见的属性。
  • 生成定位器:利用Playwright的codegen工具。
  • 网络优先断言:使用toBeVisible等断言。
  • 配置调试:使用Playwright的跟踪功能。
  • 利用工具:使用Playwright的测试工具提升效率。
  • 跨浏览器测试:确保在所有支持的浏览器上测试。
  • 保持依赖最新:定期更新Playwright版本。

持续更新…


http://www.ppmy.cn/devtools/41183.html

相关文章

在IDEA中使用 Spring Initializr 新建 spring boots 项目

【在IDEA中使用 Spring Initializr 新建 spring boots 项目 - CSDN Apphttp://t.csdnimg.cn/mVs5P Spring Initializr 创建spring boots项目 添加到pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connec…

Android XML的使用详解

一、布局文件&#xff1a; 在layout目录下&#xff0c;使用比较广泛&#xff1b;我们可以为应用定义两套或多套布局&#xff0c;例如&#xff1a;可以新建目录layout_land(代表手机横屏布局)&#xff0c;layout_port(代表手机竖屏布局)&#xff0c;系统会根据不同情况自动找到…

如何查看MySQL binlog日志

1、查看MySQL是否开启binlog日志 SQL&#xff1a;show variables like ‘%log_bin%’; log_bin:on 是开启状态 若是OFF&#xff0c;则需要开启binlog日志。 开启方式&#xff1a;打开mysql配置文件my.cnf&#xff0c;在[mysqlId]下面增加 log-binmysql-bin 查看binlog日志 …

牛客热题:二叉树的前序遍历

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;二叉树的前序遍历题目链接方法一…

YOLOv8_seg训练流程-原理解析[实例分割理论篇]

本篇将介绍一下YOLOv8实例分割网络的训练流程,同样在看此篇文章之前先去看一下预测流程YOLOv8_seg预测流程-原理解析[实例分割理论篇]-CSDN博客 ,还有目标检测任务的训练流程YOLOv8训练流程-原理解析[目标检测理论篇]-CSDN博客 ,这两篇都是前置课程,下图是YOLOv8实例分割的…

【易错题】第六章-业务数据分析 #CDA Level 1

目录 一. 指标作用与理解 二. 基本指标 1&#xff09;求和类&#xff08;常规求和、累计求和&#xff09; 2&#xff09;*比较类&#xff08;均比、同比、环比、定基比、标准比&#xff09; 三. 场景指标 1&#xff09;*流量相关指标&#xff08;访客数UV、浏览量PV、访问…

datagridview合并单元格

private void dataGridView5_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { DataGridView dataGridView this.dataGridView5; // 假设你的DataGridView有至少三行三列 if (e.RowIndex 2 && e.ColumnIndex 2) //合并第三行最后两…

QCC---Aptx Lossless验证

因为aptx Lossless属于高通骁龙声音的一部分&#xff0c;一般支持高通骁龙声音的设备会支持到&#xff0c;比如说手机&#xff0c;而且还要支持最新的aptx adaptive协议R2.2版本。但是如果手上没有这样的手机的话&#xff0c;有source芯片也可以去做测试验证。在最新的784.1版本…