【工程实战】第四篇:UI 自动化 —— Playwright 异步模式深度实战:告别 Selenium 的“脆”与“慢”

专栏进度:04 / 10 (自动化实战专题)

Playwright 的核心优势在于它直接通过浏览器的 CDP(Chrome DevTools Protocol) 协议进行通信,而不是像 Selenium 那样通过中间商 WebDriver,这让它的速度和稳定性有了质的飞跃。

一、 环境准备:三分钟起步

Playwright 的安装非常简单,它会自动下载对应的浏览器内核(Chromium, Firefox, WebKit)。

Bash

bash 复制代码
#安装 playwright 库和 pytest 插件

pip install playwright pytest-playwright

# 安装浏览器驱动(只需执行一次)
playwright install

二、 核心特性:为什么它是"下一代"?

自动等待 (Auto-waiting):你不再需要写 time.sleep()。Playwright 会在点击前自动检查元素是否可见、是否可点击。

多上下文隔离 (Browser Contexts):一个浏览器实例可以开启多个互不干扰的上下文,模拟多个用户同时登录,无需反复启停浏览器。

强大的调试器 (Codegen):支持录制生成代码,甚至可以录制你的操作并生成 Python 脚本。

网络拦截:可以像 Fiddler 一样拦截、Mock 接口请求,实现 UI 与接口的混合测试。

三、 实战:编写第一个异步 UI 测试脚本

我们将演示如何通过 Playwright 异步模式打开百度并进行搜索。

  1. 基础脚本 tests/test_ui_basic.py
    Python
python 复制代码
import asyncio
from playwright.async_api import async_playwright

async def run():
    async with async_playwright() as p:
        # 启动浏览器(headless=False 表示看得到界面)
        browser = await p.chromium.launch(headless=False)
        # 开启一个新的上下文
        context = await browser.new_context()
        # 打开页面
        page = await context.new_page()
        
        # 访问百度
        await page.goto("https://www.baidu.com")
        # 输入搜索词(自动等待输入框出现)
        await page.fill("#kw", "Playwright 自动化测试")
        # 点击搜索按钮
        await page.click("#su")
        
        # 等待结果加载
        await page.wait_for_timeout(2000)
        # 截图存证
        await page.screenshot(path="baidu_search.png")
        
        await browser.close()

# 运行异步任务
# asyncio.run(run())
  1. 结合 Pytest 运行
    如果你安装了 pytest-playwright 插件,可以直接使用内置的 page 对象,代码会极致精简:

Python

python 复制代码
def test_baidu_search(page):
    page.goto("https://www.baidu.com")
    page.fill("#kw", "pytest-playwright")
    page.click("#su")
    assert "pytest-playwright" in page.title()

四、 进阶:录制你的第一段代码

如果你面对复杂的定位符无从下手,可以使用 Playwright 的命令行录制工具:

Bash

bash 复制代码
playwright codegen https://www.baidu.com

这会弹出一个浏览器和你操作的记录窗口。你在页面上的每一次点击、输入,都会实时生成 Python 代码。

五、 避坑指南:UI 自动化的"生存法则"

拒绝死等:严禁使用 time.sleep()。如果 Playwright 默认等待失效,请使用 page.wait_for_selector() 指定具体元素。

定位符优先序:优先使用 id 或 name,其次是 css selector,最后才是脆弱的 xpath。Playwright 推荐使用 get_by_role 或 get_by_text,这些更符合真实用户行为。

Headless 陷阱:有些网站会检测爬虫。如果无界面模式(Headless)报错,尝试开启 channel="chrome" 使用真实浏览器,或添加 user_agent。

相关推荐
小程故事多_8017 小时前
从想法到落地零返工,AI Agent六阶段自动化开发全流水线实践
运维·人工智能·自动化
UnicornDev17 小时前
【Flutter x HarmonyOS 6】设置页面的UI设计
flutter·ui·华为·harmonyos·鸿蒙
ZC跨境爬虫17 小时前
跟着 MDN 学CSS day_31:(精通链接样式,从伪类到导航菜单)
前端·javascript·css·ui·交互
发现你走远了17 小时前
前端多环境自动化部署实战:GitHub Actions + Azure Blob + Cloudflare
前端·自动化·github
lzp079119 小时前
元数据驱动开发 - 面向对象编程思想的补充(上)
spring boot·后端·ui
ZGi.ai1 天前
人工审查节点:让自动化工作流多一步人工把关
运维·人工智能·自动化·人机协同·智能体工作流·人工审查
企服AI产品测评局1 天前
Agent适配信创环境实测:企业级自动化如何实现国产操作系统与数据库全兼容?
运维·数据库·人工智能·ai·chatgpt·自动化
盖小雅1 天前
自动化排班如何破解劳动法合规难题:从规则冲突到可追溯的排班表
大数据·运维·机器学习·自动化
NiceCloud喜云1 天前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书
Ulyanov1 天前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真