避开 Playwright 常见陷阱,让你的 UI 测试更快更稳
做UI自动化测试的朋友应该都有过这种体验——本地跑得好好的一上CI就挂周一全绿周二莫名其妙红一片加了sleep能过不加就报元素找不到。如果你也遇到过这些情况别急着怀疑是自己的代码写得不够好。很多时候问题出在“习惯”上——把Selenium时代的老经验照搬到Playwright里或者没搞清楚Playwright的底层机制就开始写用例。下面这8个坑是我和团队在过去一年里一个一个踩过来的。整理出来希望能帮你少走点弯路。坑1还在用waitForTimeout /sleep 硬等这是新手最容易犯的错误没有之一。很多人习惯了Selenium里那种Thread.sleep(3000) 的写法到了Playwright还是改不掉。动不动就page.wait_for_timeout(5000)觉得“等5秒总该加载完了吧”。问题在哪 固定等待时间就像刻舟求剑——网络快的时候浪费5秒网络慢的时候5秒还不够。测试要么跑得慢要么时好时坏。正确的做法Playwright自带自动等待机制执行click()、fill() 这些操作之前它会自动等待元素可见、可操作、稳定。你什么都不用写。❌ 错误示范page.wait_for_timeout(3000)page.locator(“#submit”).click()✅ 正确示范——Playwright自己会等page.locator(“#submit”).click() # 自动等待按钮可点击如果确实需要等待某个特定条件比如API返回数据用wait_for_response 或wait_for_selector绑定到明确信号上。什么时候可以用 wait_for_timeout 说实话90%的场景用不上。只有在调试阶段或者等待第三方非交互内容加载时才把它当作最后手段。坑2定位器写得“太聪明”复杂CSS选择器、依赖文本内容的选择器、XPath——这些东西写的时候觉得很爽一改版全废。比如你写了个page.locator(‘#main-content div:nth-child(3) button’)开发同事把页面结构调整了一下你的测试就挂了。正确的做法优先用data-testid。让开发在核心UI元素上加上测试专用的属性这是代码和测试之间的“契约”。❌ 脆弱的选择器page.locator(‘#app div.container button.btn-primary’)✅ 稳定的选择器page.locator(‘[data-testid“submit-button”]’)如果项目里暂时没有data-testid退而求其次可以用get_by_role 或get_by_text但尽量选择不容易变动的属性。坑3自动等待“撞上”组件重渲染这个坑比较隐蔽很多人都没意识到。Playwright的自动等待机制是这样的它检查元素是否可见、稳定、可操作检查通过之后立即执行操作。但如果就在“检查通过”和“执行操作”之间的那个瞬间你的组件正好重新渲染了——按钮被替换成了一个新按钮——点击就会失败报错Element is not attached to the DOM。典型场景点击保存按钮按钮变成“保存中…”的禁用状态保存完成后再变回可点击状态。第二次点击就可能撞上重渲染。解决方案方案一用>方案二点击前先显式等待一下save_button.wait_for(state“visible”)save_button.click()或者更干脆——在测试环境里把动画效果关掉减少重渲染的触发。坑4每个测试都从头登录一套测试用例几十上百个每个用例都打开登录页、输用户名密码、点登录——慢不说万一登录接口挂了所有测试全崩。解决方案用storageState 保存登录态。先跑一次登录保存登录状态到文件在 playwright.config.py 里配置use {“storage_state”: “auth.json”}这样每个测试启动时就已经是登录状态了又快又稳。坑5测试之间“互相传染”这个坑特别恶心——单个用例跑全过一起跑就随机挂。问题出在测试之间共享了可变状态。比如你在模块级别定义了一个page 对象用例A把它导航到了页面A用例B以为它还在首页结果就挂了。解决方案每个测试用独立的page 或context。Playwright的fixture机制天然支持这一点✅ 每个测试都有自己的 page互不干扰def test_something(page):page.goto(“/page-a”)# …def test_something_else(page):page.goto(“/page-b”) # 干净的页面不受上一个用例影响# …如果确实需要共享某些只读数据比如配置用beforeAll 没问题但不要共享可变对象。坑6滥用networkidle 等待page.wait_for_load_state(“networkidle”) 看起来很美——“等所有网络请求都结束了再继续”。但问题在于单页应用SPA里网络请求可能永远停不下来——轮询、WebSocket、长连接这些东西会让networkidle 一直等下去。解决方案不要等“所有请求结束”等“你关心的那个请求结束”。❌ 可能永远等不完page.wait_for_load_state(“networkidle”)✅ 只等数据接口返回with page.expect_response(“**/api/orders”) as response_info:page.locator(“#load-orders”).click()response response_info.value这样既精准又高效。坑7Trace/视频全程开着Trace和视频确实好用出问题的时候能帮你快速定位。但全程开着会严重拖慢测试速度CI上跑一次多花好几分钟。解决方案只在失败时开启。playwright.config.pyuse {“trace”: “on-first-retry”, # 只在重试时录trace“video”: “on-first-retry”,}这样大部分通过的测试跑得快失败的测试也有足够的现场信息供排查。坑8盲目加并发“测试跑得慢加worker”——这个思路听起来没毛病但实际上并发不是越高越好。并发太高会导致CPU、内存、数据库连接池资源竞争测试反而更慢甚至出现莫名其妙的超时失败。解决方案先profile再调参。先跑一遍看看瓶颈在哪——是CPU满了数据库连接不够还是网络带宽受限找到真正的瓶颈再决定要不要加worker加几个。一张表总结坑核心问题解决方案硬编码等待用sleep/固定超时依赖Playwright自动等待 web-first断言脆弱定位器依赖CSS层级/文本优先data-testid 或get_by_role自动等待撞重渲染组件在操作瞬间被替换用稳定定位器 显式wait_for重复登录每个用例都走登录流程用storageState 复用登录态测试间状态污染共享可变对象每个用例独立page/context滥用networkidleSPA里请求停不下来等特定API响应不等全部Trace全程开拖慢测试速度只在失败/重试时开启盲目加并发资源竞争反而更慢先找瓶颈再调worker数最后说两句上面这些坑大多数不是Playwright本身的问题而是使用方式的问题。它提供的工具都是好工具关键看你怎么用。如果你刚接触Playwright不久建议从“坑3”自动等待撞重渲染和“坑6”networkidle这两个入手重点看一下——这两个是最容易让人困惑、也最不容易自己琢磨明白的。如果你的测试套件已经有一定规模了建议优先排查“坑4”重复登录和“坑5”测试间污染这两个对稳定性和速度的影响最大。你有什么踩过的坑上面没提到的欢迎评论区补充大家一起避雷。

相关新闻

AI Agent Skills:从代码补全到智能开发的效率革命

AI Agent Skills:从代码补全到智能开发的效率革命

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你还在用 AI 编程助手只是让它帮你补全代码行,那你可能只发挥了它 10% 的潜力。真正的效率革命,发生在你教…

2026/7/6 2:57:57 阅读更多 →
SONiC 2024 容器化架构解析:10个核心Docker容器如何驱动网络转发

SONiC 2024 容器化架构解析:10个核心Docker容器如何驱动网络转发

SONiC 2024容器化架构深度解析:10个核心容器如何构建下一代云网络1. 现代网络操作系统的容器化革命当微软在2016年首次开源SONiC项目时,很少有人能预料到这个基于Linux的网络操作系统会彻底改变数据中心网络的构建方式。八年后的今天,SONiC已…

2026/7/6 2:55:56 阅读更多 →
QooBot:全栈开源的仿生人操作系统——软硬一体,自由制造

QooBot:全栈开源的仿生人操作系统——软硬一体,自由制造

QooBot:全栈开源的仿生人操作系统——软硬一体,自由制造 摘要:QooBot 是一个面向仿生人的开源全栈生态,涵盖从机械图纸、电路设计到操作系统、AI 算法的完整技术栈。本文从架构全景、大脑核心、推理引擎、开发者生态等维度全面解读…

2026/7/6 2:53:55 阅读更多 →

最新新闻

[实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片

[实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片

本次需要通过TI的TL2518芯片进行ADC采样。该芯片为SPI接口,具有八个通道,可以全部配置成AIN进行采样,本次需要探究如何该如何配置才能将芯片的采样率达到最大。1.TLA2158首先要陈列一下该芯片的一些特性,为节省篇幅,此…

2026/7/6 3:48:11 阅读更多 →
【全文系列目录】风控PM记

【全文系列目录】风控PM记

风控PM记 一:风险认知与识别(入门篇) ① 入门第一课:认识风险,了解风控 ② 入门第二课:业务催生风险,常见的业务风险有哪些? ③ 《电商风控入门:我们到底在“防”什…

2026/7/6 3:48:11 阅读更多 →
基于Databricks的企业级AI Agent生产实践:从架构设计到部署运维

基于Databricks的企业级AI Agent生产实践:从架构设计到部署运维

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在考虑将AI Agent引入企业生产环境,可能会面临这样的困境:在本地开发环境中跑得飞快的Agent原型&…

2026/7/6 3:42:09 阅读更多 →
飞书卡片表格渲染踩坑记:从 Markdown 到原生 table 组件的迁移实战

飞书卡片表格渲染踩坑记:从 Markdown 到原生 table 组件的迁移实战

背景 团队每日通过飞书推送项目晨报和日报,内容从项目管理平台实时拉取,包含任务统计、进度列表、风险项等多维数据,天然需要表格来承载。 最初的实现方案是飞书消息推送 纯文本,格式简陋,阅读体验差。于是决定升级为…

2026/7/6 3:40:09 阅读更多 →
构建AI毒舌投资人:用Prompt工程验证副业想法的可行性

构建AI毒舌投资人:用Prompt工程验证副业想法的可行性

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在折腾各种 AI 工具时,我发现一个挺有意思的现象:很多人拿到一个强大的 AI 模型,比如 DeepSee…

2026/7/6 3:40:09 阅读更多 →
认识安企CMS-系统和模板文件结构

认识安企CMS-系统和模板文件结构

了解安企CMS安装后的完整目录结构,掌握主程序、配置文件、模板目录、附件目录、运行时数据等每个关键目录和文件的具体作用,方便后续日常维护和二次开发。安企CMS 安装后的完整目录结构概览,带你了解每个目录和文件的用途。一、顶层目录结构 …

2026/7/6 3:40:09 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻