跳到主要内容

Playwright CodeGen Python 完整指南

概述

python -m playwright codegen --target=python -b chromium 是 Playwright 提供的强大命令,专门用于生成 Python 语言的自动化测试代码。通过录制用户在 Chromium 浏览器中的操作,自动生成对应的 Python Playwright 测试脚本。

命令详解

python -m playwright codegen --target=python -b chromium

参数说明

  • python -m playwright codegen: 启动 Playwright 代码生成器
  • --target=python: 指定生成的代码语言为 Python
  • -b chromium: 指定使用 Chromium 浏览器进行录制

环境准备

安装 Playwright

# 安装 Playwright
pip install playwright

# 安装浏览器
python -m playwright install

验证安装

python -m playwright --version

基础使用

1. 启动录制

# 基础命令
python -m playwright codegen --target=python -b chromium

# 指定起始网址
python -m playwright codegen --target=python -b chromium https://example.com

# 保存到文件
python -m playwright codegen --target=python -b chromium --output=test_script.py

2. 录制界面介绍

启动命令后,会打开两个窗口:

  1. 浏览器窗口:用于执行操作的 Chromium 浏览器
  2. Playwright Inspector:显示生成的代码和控制录制

高级选项

设备模拟

# 模拟移动设备
python -m playwright codegen --target=python -b chromium --device="iPhone 12"

# 模拟平板设备
python -m playwright codegen --target=python -b chromium --device="iPad Pro"

# 自定义视窗大小
python -m playwright codegen --target=python -b chromium --viewport-size=1280,720

网络和性能选项

# 模拟慢速网络
python -m playwright codegen --target=python -b chromium --timezone="Asia/Shanghai"

# 设置语言
python -m playwright codegen --target=python -b chromium --lang="zh-CN"

# 禁用图片加载
python -m playwright codegen --target=python -b chromium --load-storage=auth.json

生成的代码结构

典型的生成代码如下:

import re
from playwright.sync_api import Playwright, sync_playwright, expect

def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()

# 导航到页面
page.goto("https://example.com")

# 点击操作
page.click("button[type='submit']")

# 输入操作
page.fill("input[name='username']", "test_user")

# 断言
expect(page.locator("h1")).to_contain_text("Welcome")

# 关闭浏览器
context.close()
browser.close()

with sync_playwright() as playwright:
run(playwright)

实用技巧

1. 录制技巧

  • 慢速操作:录制时动作要相对缓慢,确保所有操作都被捕获
  • 等待加载:等待页面完全加载后再进行下一步操作
  • 明确点击:确保点击的元素清晰可见
  • 避免重复:避免不必要的重复操作

2. 断言添加

在录制过程中,可以通过以下方式添加断言:

  1. 在 Inspector 中点击 "Assert" 按钮
  2. 在浏览器中选择要验证的元素
  3. 选择断言类型(文本、可见性、属性等)

3. 选择器优化

生成的代码可能包含以下类型的选择器:

# 优先使用的选择器(按优先级排序)
page.click("data-testid=submit-button") # 测试ID
page.click("role=button[name='Submit']") # 角色和名称
page.click("text=Submit") # 文本内容
page.click("#submit-btn") # ID选择器
page.click(".btn-primary") # 类选择器
page.click("button:nth-child(2)") # CSS选择器

常见使用场景

1. 表单填写测试

# 录制表单填写流程
python -m playwright codegen --target=python -b chromium --output=form_test.py https://forms.example.com

2. 登录流程测试

# 录制登录流程
python -m playwright codegen --target=python -b chromium --output=login_test.py https://app.example.com/login

3. 电商购物流程

# 录制购物流程
python -m playwright codegen --target=python -b chromium --output=shopping_test.py https://shop.example.com

代码优化建议

1. 添加错误处理

def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()

try:
page = context.new_page()
page.goto("https://example.com")
# 你的测试代码

except Exception as e:
print(f"测试执行出错: {e}")
finally:
context.close()
browser.close()

2. 使用页面对象模式

class LoginPage:
def __init__(self, page):
self.page = page
self.username_input = page.locator("input[name='username']")
self.password_input = page.locator("input[name='password']")
self.submit_button = page.locator("button[type='submit']")

def login(self, username: str, password: str):
self.username_input.fill(username)
self.password_input.fill(password)
self.submit_button.click()

3. 添加等待和重试

# 等待元素可见
page.wait_for_selector("button[type='submit']", state="visible")

# 等待网络空闲
page.wait_for_load_state("networkidle")

# 等待特定条件
page.wait_for_function("() => document.readyState === 'complete'")

调试技巧

1. 启用调试模式

# 启用调试模式
PWDEBUG=1 python test_script.py

2. 慢速执行

browser = playwright.chromium.launch(headless=False, slow_mo=1000)  # 每个操作延迟1秒

3. 截图调试

# 在关键步骤截图
page.screenshot(path="debug_screenshot.png")

注意事项

  1. 选择器稳定性:生成的选择器可能不够稳定,需要手动优化
  2. 动态内容:对于动态加载的内容,可能需要添加适当的等待
  3. 环境差异:在不同环境中运行可能需要调整配置
  4. 数据清理:测试前后要注意数据的准备和清理
  5. 并发执行:多个测试并发执行时要注意资源竞争

最佳实践

  1. 模块化代码:将生成的代码重构为可复用的函数或类
  2. 参数化测试:使用参数化来测试不同的数据组合
  3. 持续集成:集成到CI/CD流程中实现自动化测试
  4. 定期维护:随着应用更新,及时维护测试代码
  5. 文档记录:为生成的测试用例添加清晰的文档说明

总结

python -m playwright codegen --target=python -b chromium 是一个非常实用的工具,可以大大提高测试开发效率。通过合理使用这个工具,结合手动优化和最佳实践,可以创建出稳定、可维护的自动化测试套件。