news 2026/5/8 15:23:11

告别录屏与浏览器孤岛,Playwright以原生AI能力重塑测试工作流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别录屏与浏览器孤岛,Playwright以原生AI能力重塑测试工作流

📝面试求职:「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)

📝职场经验干货:

软件测试工程师简历上如何编写个人信息(一周8个面试)

软件测试工程师简历上如何编写专业技能(一周8个面试)

软件测试工程师简历上如何编写项目经验(一周8个面试)

软件测试工程师简历上如何编写个人荣誉(一周8个面试)

软件测试行情分享(这些都不了解就别贸然冲了.)

软件测试面试重点,搞清楚这些轻松拿到年薪30W+

软件测试面试刷题小程序免费使用(永久使用)


Playwright 1.59 于近期正式发布。作为面向测试工程师的重大版本,这一版带来了多项关键更新:全新 Screencast API 让录屏不再难用、browser.bind()打通了 AI Agent 与浏览器的连接通道、await using彻底终结了资源泄漏的噩梦……本文将逐一解析,带你用好这些新能力。


一、写在前面:为什么 1.59 值得关注?

很多测试 同学可能还停留在「Playwright 就是一个更快的 Selenium」这个认知上。

实际上,从 1.49 到 1.59,Playwright 正在悄然完成一次战略转型:从 Web 自动化测试工具,演变为 AI 驱动的测试平台

体现在几个关键动作上:

版本

标志性事件

1.49

MCP(Model Context Protocol)协议支持

1.52

AI 可描述定位器(Describable Locators)

1.57

编码代理(Coding Agent)正式登场

1.59Screencast API + browser.bind()

如果你正在做 AI + 测试的探索,1.59 是必须关注的一个版本。如果你只是做常规 UI 自动化,这一版的await using改进和_locator 增强同样值得升级。


二、Screencast API:终于,录屏变得好用了

2.1 痛点回顾

在 1.59 之前,如果你想在 Playwright 测试中录制视频,方案相当原始:

  1. 用系统录屏工具手动录

  2. 用 FFmpeg 配合 Xvfb(Linux 无头环境)

  3. 自己写一个 Canvas + MediaRecorder 封装

每一种都不优雅,且无法与测试上下文关联。

2.2 核心 API

新版引入page.screencast,提供完整的录屏能力:

import asyncio from playwright.async_api import expect ''' @Author : TesterRoad @Time : 2026/4 @Desc : 公众号:测试工程师成长之路 @Software: PyCharm ''' async def test_submit_order(page): # 基础录制:保存为 WebM video_path = "./test-results/demo.webm" await page.screencast.start(path=video_path) # 执行测试操作 await page.get_by_role("button", name="提交订单").click() await expect(page.get_by_text("下单成功")).to_be_visible() # 停止录制 await page.screencast.stop() print(f"视频已保存: {video_path}")

2.3 动作标注:录屏里的操作轨迹

这是最实用的功能之一——录屏中自动高亮显示鼠标点击、键盘输入等操作:

await page.screencast.start( path="annotated.webm", # 显示操作标注 show_actions={ "position": "top-right", # 标注出现在右上角 "font_size": 14, }, ) # 每次点击/输入会自动记录并显示在录屏上 await page.get_by_placeholder("搜索商品").fill("iPhone 16")

标注支持以下位置:top-lefttoptop-rightleftrightbottom-leftbottombottom-right

2.4 章节叠加:让视频自带叙事结构

你可以给录屏添加章节标记,适合生成报告或事后回放:

''' @Author : TesterRoad @Time : 2025/7 @Desc : 公众号:测试工程师成长之路 @Software: PyCharm ''' await page.screencast.start(path="chaptered.webm") # 章节 1:进入商品页 await page.screencast.show_chapter( "进入商品详情页", description="点击商品卡片", duration=2000, # 持续 2 秒 ) await page.get_by_role("link", name="iPhone 16 Pro").click() # 章节 2:加入购物车 await page.screencast.show_chapter( "加入购物车", description="点击加入按钮", duration=1500, ) await page.get_by_role("button", name="加入购物车").click() await page.screencast.hide_chapter() await page.screencast.stop()

2.5 实时帧流:为 AI 视觉模型而生

如果你在做 AI Agent 相关的测试,需要实时将画面传给视觉模型处理:

async def handle_frame(frame_data: bytes): # frame_data 为 JPEG 编码的帧数据 await send_to_vision_model(frame_data) await page.screencast.start( on_frame=handle_frame, size={"width": 800, "height": 600}, # 降低分辨率以节省带宽 )

这个 API 的典型应用场景:

  1. AI Agent 视觉反馈循环测试

  2. 实时监控页面状态变化

  3. 截图驱动的自动化决策

2.6 代理视频回执

编码代理(Playwright Codegen Agent)现在可以生成带丰富标注的工作视频记录, 测试同学可以直接用录屏来审查 AI Agent 的执行过程。


三、browser.bind():浏览器成了可共享的资源

3.1 解决了什么问题?

在之前的架构里,每个Playwright脚本都需要自己启动和管理浏览器进程。如果你有多个工具(playwright-cli、MCP Server、测试脚本)想同时连接同一个浏览器实例,基本不可能。browser.bind()彻底解决了这个问题。

3.2 基础用法

# 在主测试脚本中绑定浏览器 result = await browser.bind("my-session", workspace_dir="/my/project") endpoint = result["endpoint"] print(f"绑定端点: {endpoint}") # 输出示例: ws://localhost:53321/session/my-session # 这个 endpoint 可以分享给其他客户端连接

3.3 连接方式

绑定后,以下客户端都可以连接到同一个浏览器实例:

# 方式 1:playwright-cli playwright-cli attach my-session # 方式 2:@playwright/mcp(AI Agent) # 在 MCP 配置中使用 endpoint # 方式 3:Playwright 客户端 SDK const client = await chromium.connect(endpoint);

3.4 实际应用场景

场景一:AI Agent 接管浏览器会话

# 测试脚本预先打开目标页面并绑定 await page.goto("https://your-app.com/dashboard") await browser.bind("agent-session") # AI Agent 通过 MCP 连接后,可以直接操作同一浏览器 # 无需重新登录,因为 Cookie 和会话状态已就绪

场景二:调试与测试共用一个浏览器

# 开发阶段:绑定浏览器,用 playwright-cli 手动调试 await browser.bind("dev-debug") # 测试阶段:测试脚本 attach 到同一浏览器执行断言 # 两个工具共享同一个 Chrome DevTools Protocol 连接

四、上下文管理器:资源泄漏的终结者

4.1 旧世界的问题

在 Python 中使用page.route()add_init_script()这类临时性 API 时,最让人头疼的就是清理

# ❌ 旧写法:容易遗漏清理 import pytest ''' @Author : TesterRoad @Time : 2025/7 @Desc : 公众号:测试工程师成长之路 @Software: PyCharm ''' route_handler = None @pytest.fixture(autouse=True) async def block_ads(page): global route_handler async def handler(route): if "ads.doubleclick" in route.request.url: await route.abort() else: await route.continue_() route_handler = handler await page.route("**/*", route_handler) yield # ⚠️ 容易忘写,导致测试间互相污染 await page.unroute("**/*", route_handler)

多了容易漏,少了会导致下一个测试继承了上一个的拦截逻辑——间歇性 bug 的经典来源

4.2 新写法:自动 Cleanup

Playwright Python 1.59 中,page.route()等 API 支持async with上下文管理器语法,离开作用域自动释放:

import pytest @pytest.mark.asyncio async def test_block_ads(page): # ✅ 新写法:离开作用域自动清理 async with page.route("**/*", lambda route: route.abort() if "ads" in route.request.url else route.continue_()) as route: # 作用域内的所有操作都生效 await page.goto("https://news.example.com") # 测试结束,route 自动 unroute,无需手动清理

说明:Playwright Python 的上下文管理器模式是标准async with语法,无需额外依赖。相比 TypeScript 的await using(TC39 显式资源管理提案),Python 的写法更加成熟稳定,是 Python 异步编程的最佳实践。


五、Locator 增强:更精准,更灵活

5.1 locator.normalize() — 定位器最佳实践转换

这个方法可以把你写的定位器转换成 Playwright 推荐的标准写法:

# 假设你写了这样的选择器 locator = page.locator('[data-testid="submit-btn"]') # 调用 normalize 后,会返回 Playwright 推荐的最佳定位器 best_practice = await locator.normalize() print(best_practice) # 输出可能是: get_by_role('button', name='提交')

用途:

  1. 代码审查时检查定位器质量

  2. 自动发现脆弱的 CSS 选择器

  3. 团队统一定位器规范

5.2 page.pick_locator()— 交互式选择元素

如果你不想在代码里写死定位器,这个方法允许你在页面上直接点击选择元素

# 启动交互式选择器(终端会显示提示) locator = await page.pick_locator() # 在浏览器中点击你想定位的元素 # 按 Escape 确认选择 await locator.click() # 使用刚才选择的定位器

这个功能在录制脚本或现场调试时非常有用。

5.3locator.aria_snapshot()增强

# 深度限制:只获取前两层结构 snapshot = await locator.aria_snapshot(depth=2) # 模式选择:隐藏还是显示隐藏元素 snapshot_with_hidden = await locator.aria_snapshot(mode="all") # "all" | "accessible"

六、可观测性:Trace 分析进入命令行时代

6.1 playwright-cli show仪表板

新版命令行可以启动一个交互式仪表板:

npx playwright-cli show

仪表板功能:

  1. 查看所有browser.bind()创建的浏览器会话

  2. 实时查看各浏览器状态

  3. 直接在仪表板中操作浏览器

6.2 命令行 Trace 分析

之前分析 trace 文件必须打开 Playwright 的 Web UI,现在可以在终端里完成:

# 查看所有 action 列表 npx playwright trace actions test-results/trace.zip # 过滤特定 action npx playwright trace actions --grep="expect" test-results/trace.zip # 查看单个 action 详情 npx playwright trace action 9 test-results/trace.zip

这对于 CI/CD 环境中自动化分析 trace 报告非常有用。

6.3 tracing.start()新增 live 选项

await context.tracing.start( live=True, # 实时上传 trace 数据到 Playwright 服务器 title="Checkout Flow Test", )

配合browser.bind()使用,团队成员可以实时看到测试执行的 trace。


七、其他值得关注的更新

7.1 存储状态管理增强

# 清除并重置存储状态 await context.set_storage_state(paths=[]) # 相当于清空所有 cookie/storage # 之前需要手动循环删除,现在一行搞定

7.2 控制台和错误清理

# 清除控制台消息(测试间隔离) await page.clear_console_messages() # 清除页面错误(避免错误状态泄漏) await page.clear_page_errors() # 获取消息时间戳(新增 API) msgs = await page.wait_for_console_messages() if msgs: print(f"消息时间: {msgs[0].timestamp}") # ISO 8601 格式

7.3 request.existing_response()不等待直接返回

# 之前:必须等待响应返回 response = await request.fetch(url) # 现在:如果响应已存在,直接返回,不等待 existing = await request.existing_response(url) if existing: print(f"响应状态: {existing.status}")

7.4 UI Mode 改进

  1. 新增仅显示受源代码变更影响的测试选项(--only-changed)改进操作过滤逻辑

  2. HTML Reporter 支持按测试步骤过滤


八、升级注意事项(破坏性变更)

macOS 14 WebKit 支持移除

如果你的 CI 环境还在用 macOS 14 + WebKit,请注意:1.59 已移除该平台支持。

# 检查你的 CI 配置 # macos-13(Ventura)及以下版本 + WebKit 仍然支持 # macos-14(Sonoma)+ WebKit 已不支持

建议:迁移到 Linux Docker 或 macOS 15。

@playwright/experimental-ct-svelte移除

如果你在使用 Svelte 组件测试的实验性包,需要迁移到正式版本或改用其他框架。


九、总结:1.59 到底值不值得升?

场景

推荐程度

理由

AI Agent + 自动化测试

⭐⭐⭐⭐⭐ 强烈推荐

Screencast API + browser.bind() 是为此场景量身打造

常规 UI 自动化

⭐⭐⭐⭐ 推荐

await using + locator 增强直接改善开发体验

录屏生成测试报告

⭐⭐⭐⭐⭐ 强烈推荐

Screencast 终于原生支持,效果比 FFmpeg 方案好太多

CI/CD 稳定性优先

⭐⭐⭐ 观望一周

可先在 staging 环境验证,确认无 regression 再上生产

安装升级

# 升级 Playwright(Python) pip install playwright --upgrade # 安装/升级浏览器 playwright install

十、下一步建议

  1. 先跑一遍回归测试:升级后用npx playwright test跑一遍现有用例,确认无破坏性影响

  2. 试试 Screencastpage.screencast足够成熟,可以替换现有的录屏方案了

  3. 迁移到 await using:检查你的测试代码中routeaddInitScript的清理逻辑,有则改之

  4. 关注 AI 方向:如果你在探索 AI + 测试,browser.bind()+ MCP 是目前最顺滑的接入路径

你在使用 Playwright 过程中遇到的最大痛点是什么?欢迎在评论区聊聊,说不定下一版的功能就是为你而写。

如果觉得这篇文章有帮助,转发给你身边做测试的同学,一起跟上 Playwright 的迭代节奏。

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 20:23:09

Minikube国内镜像终极方案:一键解决k8s.gcr.io拉取失败

Minikube国内镜像加速全攻略:从原理到实战 在本地搭建Kubernetes学习环境时,Minikube无疑是最便捷的选择之一。然而对于国内开发者来说,镜像拉取速度慢甚至失败的问题一直是个痛点。本文将深入解析Minikube的镜像加速机制,并提供一…

作者头像 李华
网站建设 2026/4/17 22:01:42

深入理解Jmeter的Keep Alive选项:如何避免端口耗尽导致压测失败

深入理解Jmeter的Keep Alive选项:如何避免端口耗尽导致压测失败 在进行高并发压测时,很多Jmeter用户都遇到过Address already in use: connect这个令人头疼的错误。这通常不是被测系统的问题,而是压力机本身的TCP/IP端口资源被耗尽导致的。本…

作者头像 李华
网站建设 2026/4/17 20:09:40

Gitee:以本土化优势重塑企业研发协作生态体系

在数字经济蓬勃发展的背景下,项目管理软件作为企业数字化转型的核心引擎,正在经历前所未有的变革与创新。Gitee(码云)凭借其深耕本土市场的独特优势,不仅成为国内开发者的首选平台,更在国际舞台上展现出中国…

作者头像 李华
网站建设 2026/4/18 1:09:41

从QGIS到网页地图:qgis2web插件让你的GIS项目5分钟上线

从QGIS到网页地图:qgis2web插件让你的GIS项目5分钟上线 【免费下载链接】qgis2web QGIS plugin to export your project to an OpenLayers or Leaflet webmap. No server-side software required. 项目地址: https://gitcode.com/gh_mirrors/qg/qgis2web 你是…

作者头像 李华