【工程实战】第四篇: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。

相关推荐
空中海2 小时前
第二章:UI 开发——View 系统与 Jetpack Compose
android·ui
阿洛学长2 小时前
Hexo+Qexo全自动化博客搭建教程
运维·自动化
程序猿追2 小时前
把手机变成调色盘:用 ArkUI 搓一个带放大镜效果的“UI 灵感色卡取色器”
ui·智能手机
SilentSamsara3 小时前
Shell 脚本进阶:从能跑到写得优雅
linux·运维·服务器·自动化·ssh·bash
Hacker_Nightrain11 小时前
详解Selenium 和Playwright两大框架的不同之处
自动化测试·软件测试·selenium·测试工具·职场和发展
ai_coder_ai14 小时前
在自动化脚本ui编程之webview控件
ui·autojs·自动化脚本·冰狐智能辅助·easyclick
RReality15 小时前
【Unity Shader URP】色带渐变着色(Ramp Shading)实战教程
ui·unity·游戏引擎·图形渲染
北京耐用通信16 小时前
耐达讯自动化CAN转EtherCAT网关:3步配置,赋能电机启动器智能化升级
人工智能·物联网·网络协议·自动化·信息与通信