如何利用Python编写高可用的UI自动化脚本_使用pytest驱动Playwright

Playwright测试失败主因是pytest未管理其生命周期,手动调用sync_playwright()易致进程残留;官方推荐使用pytest-playwright插件的page fixture,实现自动启停、上下文隔离与多浏览器支持。

为什么直接用 playwright.sync_api.sync_playwright 启动浏览器会失败?

因为 pytest 默认不管理 Playwright 的生命周期,手动调用 sync_playwright() 后没正确关闭浏览器或上下文,容易导致进程残留、端口占用、后续测试卡死。更关键的是,Playwright 官方明确建议:不要在测试函数里自己 with sync_playwright() as p: —— 这会绕过其内置的自动清理和复用机制。

实操建议:

  • 弃用手动启动,改用 pytest-playwright 插件提供的 page fixture(它已预配置好 Chromium/Firefox/WebKit 三端支持、自动启动/关闭、上下文隔离)
  • 安装时必须执行 pip install pytest-playwright,再运行 playwright install chromium(否则 page fixture 会报 BrowserType.connect_over_cdp: No browser found
  • 若需指定浏览器,用命令行参数:pytest --browser=firefox,而非在代码里硬编码 p.firefox.launch()

如何让 UI 脚本真正“高可用”?重点不是重试,而是状态感知

单纯加 time.sleep(3) 或用 page.wait_for_timeout(5000) 是反模式。真实页面加载受网络、JS 执行、SPA 路由、动态渲染影响,固定等待既慢又不可靠。高可用的核心是:等“条件”,而不是等“时间”。

实操建议:

  • page.wait_for_selector("text=提交成功", state="visible") 替代 page.wait_for_timeout() —— 它会轮询直到元素出现且可见,超时才抛异常
  • 对异步请求结果做断言时,拦截并等待 API 响应:with page.expect_response(lambda r: "api/order" in r.url and r.status == 200): page.click("button#submit")
  • 避免用 page.query_selector() 判断元素是否存在,改用 page.locator("button[disabled]").count() == 0 检查可交互态,更贴近用户真实操作路径

pytest + Playwright 下,如何稳定处理弹窗、iframe 和多标签页?

Playwright 的 page fixture 默认只绑定主页面,遇到新窗口、iframe 或 alert 会直接报 TimeoutError: Waiting for locator("...") failed,不是 selector 写错了,而是上下文没切对。

Taskade

高颜值AI大纲和思维导图生成,为你的团队建立第二个大脑。

下载

实操建议:

  • 弹窗(new page):用 page.wait_for_event("popup") 获取新页面对象,不能继续用原 page;示例:
    with page.expect_popup() as popup_info:
        page.click("a[target='_blank']")
    new_page = popup_info.value
    new_page.wait_for_load_state("networkidle")
  • iframe:用 page.frame_locator("iframe[title='payment']") 定位,再链式调用 .get_by_role("button", name="确认"),别用 page.frame("name")(已废弃)
  • alert:用 page.on("dialog", lambda dialog: dialog.accept()) 监听并自动处理,而不是等它阻塞后续执行

为什么 CI 环境里脚本总在 headless 模式下失败?

本地能跑通,CI(如 GitHub Actions)报 TimeoutError: Locator("button").click: Timeout 30000ms exceeded,大概率不是 selector 问题,而是 headless 浏览器缺少字体、GPU 加速或系统级依赖,导致页面渲染卡顿、JS 执行延迟、甚至某些 CSS 选择器失效(比如依赖 :hover 状态的按钮)。

实操建议:

  • CI 中启用 --headful 调试(仅限 debug 阶段),配合 record_video_dir="videos/" 查看真实渲染过程
  • page fixture 加全局等待策略:page.set_default_timeout(10000)page.set_default_navigation_timeout(15000),比单个操作加 timeout 更省事
  • 禁用动画提升稳定性:page.add_init_script("document.documentElement.style.animationDuration = '0s';")

最常被忽略的一点:Playwright 的 page fixture 在 pytest 中默认是 function-scoped,但如果你在 conftest.py 里错误地把它改成 class-scoped,多个 test 方法共用一个 page 实例,就会因状态污染(比如登录态、路由、缓存)导致偶发失败——高可用的前提,是每个 test 彼此隔离。

相关推荐:

苹果 iOS 27 现踪迹:iPhone 17 等用户未来可用 Apple 车钥匙解锁小米 SU7/YU7 汽车

感谢网友 对的时间点、顺势而为 的线索投递! 7 月 9 日消息,科技媒体 MacRumors 昨日(7 月 8 日)发布博文,报道称通过挖掘 iOS 27 Beta 3 开发者预览版,在代码中发现了 LCID 和 XIA1 标识符,暗示苹果为 Lucid 和小米汽车添加 Apple 车钥匙支持。注:Apple 车钥匙是苹果在钱包应用与近场通信体系中提供的数字车钥匙功能,用户可通过 iPhone ...

日本 15 岁少年侵入万代南梦宫流媒体平台,利用 ChatGPT 编写自动化脚本注销 4 万余名用户账号

7 月 6 日消息,据日媒 TBS 报道,日本一名 15 岁少年因入侵万代南梦宫旗下动画流媒体平台“万代频道(バンダイチャンネル)”服务器、注销数万名用户账号,近日被警方逮捕。参考报道获悉,涉案人为居住在埼玉县所泽市的一名 15 岁高中一年级学生。其在 2025 年 11 月利用他人会员账号侵入万代频道服务器,批量注销平台 46812 名会员账号,导致运营方 Bandai Namco Filmwo...

《冒险家艾略特的千年奇谭》编写历史成就做法攻略分享

《冒险家艾略特的千年奇谭》中的特殊成就的数量是非常多的,编写历史成就就是其中一个,成就的要求就是集齐所有手记,部分手记只会在你剧情推进到一定程度才会出现,提前去不会有,根据自己玩的流程大概有这么6本。 编写历史成就怎么做 编写历史 集齐所有手记 正常流程中28本,真结局通关后的自由行动时间有3本,分别在大臣家2楼,基友研究室,公主房间 不受剧情进度影响的只有26本。 2本是推进真结局到一定进度时,...

海螺AI怎么用来写短视频脚本让内容结构更紧凑?

海螺AI短视频脚本优化需锚定算法敏感节点:①结构化分段强制输出;②爆款骨架反向填充;③角色绑定+行为指令嵌套;④分镜表格驱动;⑤多版本对比迭代。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您希望借助海螺AI生成结构紧凑、节奏清晰的短视频脚本,但输出内容常出现段落松散、平台适配弱或信息密度低等问题,则可能是由于提示词未锚定算法敏感节点...

怎样用Kimi编写Python脚本实现钉钉自动打卡_结合Kimi代码生成

钉钉打卡接口可用,但需先抓包获取有效Cookie和员工ID;若启用面部/蓝牙等强校验则脚本失效。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 你需要在每天上班前用Python脚本自动向钉钉提交打卡数据,但不熟悉逆向工程、HTTP协议或模拟登录流程,想借助Kimi的代码生成能力快速产出可运行脚本。 确认钉钉打卡接口是否可用 打开钉钉网页版(...
· AI · 181888

DeepSeek写脚本运行示例提示词怎么写,才能复制就能执行

必须以if name == "__main__":开头并调用main(),显式import所有依赖,输入用sys.argv[1]或input(),输出仅print纯文本,禁用可视化和交互语法,脚本可直接python script.py运行。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 要让DeepSeek生成的Python脚本复制后无需修...

Runway生成服装面料动态提示词怎么写成新手可用模板

Runway生成服装面料动态效果需同时包含材质物理参数、受力运动状态和镜头行为指令三类英文提示词,缺一则易出静态图或变形;须用逗号分隔,不可换行,且fabric type须为训练过的常见面料名。 想用runway生成服装面料的动态效果,但提示词写完总出静态图或根本跑偏——这是因为runway对材质运动逻辑、镜头行为和物理属性的描述有强依赖,缺一环就卡在“布料静止”或“扭曲变形”上。 先搞清Runw...
· AI · 303085