以下是 Playwright(Python)最常用的功能语句汇总,覆盖日常自动化测试与爬虫开发中的核心操作。
🧰 一、启动与页面控制
csharp
python
编辑
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 启动浏览器(headless=False 可见模式)
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 打开网页
page.goto("https://example.com")
# 设置视口大小
page.set_viewport_size({"width": 1920, "height": 1080})
# 等待页面加载完成
page.wait_for_load_state("networkidle") # 或 "load", "domcontentloaded"
browser.close()
🔍 二、元素定位(Locator)
Playwright 推荐使用 page.locator()(比 page.click(selector) 更强大)
makefile
python
编辑
# 常用选择器
page.locator("#id") # ID
page.locator(".class") # 类名
page.locator("text=按钮文本") # 文本匹配(智能)
page.locator("input[name='email']")# 属性
page.locator("button:has-text('提交')") # 包含指定文本的按钮
page.locator("div >> text=内容") # 组合选择器(CSS + 文本)
# 获取多个元素
items = page.locator(".item")
count = items.count()
first_item = items.first
last_item = items.last
third_item = items.nth(2) # 从0开始
✏️ 三、交互操作
bash
python
编辑
# 点击
page.locator("button").click()
page.click("text=登录") # 简写(不推荐复杂场景)
# 输入文本
page.locator("#username").fill("admin") # 清空后输入(推荐)
page.locator("#comment").type("Hello") # 模拟逐字输入(慢)
# 清空输入框
page.locator("#search").clear()
# 悬停
page.locator(".menu-item").hover()
# 双击 / 右键
page.locator("#target").dblclick()
page.locator("#target").click(button="right")
# 按键(在输入框中按回车)
page.press("#search", "Enter")
page.keyboard.press("Tab")
📥 四、表单与下拉框
标准 <select> 下拉框:
ini
python
编辑
# 选择第一个选项
page.locator("select#country").select_option(index=0)
# 按 value 选
page.locator("select").select_option(value="CN")
# 按可见文本选
page.locator("select").select_option(label="中国")
自定义下拉(div 模拟):
makefile
python
编辑
dropdown = page.locator("#city-selector")
dropdown.locator(".trigger").click()
dropdown.locator("text=上海").click() # 在容器内找
文件上传:
css
python
编辑
page.set_input_files("input[type='file']", "path/to/file.pdf")
复选框 / 单选框:
bash
python
编辑
page.check("#agree") # 勾选
page.uncheck("#news") # 取消勾选
page.is_checked("#agree") # 判断是否选中
⏳ 五、等待(Wait)
perl
# 等待元素出现(推荐)
page.wait_for_selector("text=成功", timeout=5000)
# 等待元素可点击
page.wait_for_selector("button#submit", state="visible")
page.locator("button#submit").wait_for(state="enabled")
# 等待网络请求完成
page.wait_for_load_state("networkidle")
# 等待特定 URL
page.wait_for_url("**/dashboard")
# 等待弹窗(alert/confirm)
page.on("dialog", lambda dialog: dialog.accept())
📡 六、网络与请求拦截
vbscript
# 拦截 API 请求并修改响应(Mock)
def handle_route(route):
if "api/user" in route.request.url:
route.fulfill(json={"name": "Mock User"})
else:
route.continue_()
page.route("**/api/**", handle_route)
# 监听请求/响应
page.on("request", lambda request: print(">>", request.method, request.url))
page.on("response", lambda response: print("<<", response.status, response.url))
📸 七、截图与录屏
ini
# 截图整个页面
page.screenshot(path="full.png", full_page=True)
# 截图某个元素
page.locator("#chart").screenshot(path="chart.png")
# 录屏(需启动时开启)
browser = p.chromium.launch(record_video_dir="videos/")
page = browser.new_page()
# ...操作...
page.video.path() # 获取视频路径
🌐 八、多页面与弹窗处理
ini
# 等待新页面打开
with page.expect_popup() as popup_info:
page.click("a[target='_blank']")
new_page = popup_info.value
# 切换到 iframe
frame = page.frame_locator("iframe[name='myframe']")
frame.locator("#inside-input").fill("hello")
# 关闭当前页
page.close()
🍪 九、Cookie 与 Storage
bash
# 设置 Cookie
page.context.add_cookies([{"name": "token", "value": "abc123", "url": "https://example.com"}])
# 获取 Cookie
cookies = page.context.cookies()
# 本地存储
page.evaluate("localStorage.setItem('theme', 'dark')")
theme = page.evaluate("localStorage.getItem('theme')")
🧪 十、断言(配合 pytest)
python
# 元素存在
assert page.locator("text=欢迎").is_visible()
# 文本内容
assert page.locator("#title").inner_text() == "首页"
# URL 包含
assert "success" in page.url
# 元素数量
assert page.locator(".item").count() == 5
💡 小技巧
-
自动等待 :Playwright 的
click()、fill()等操作会自动等待元素可操作,通常无需手动加wait。 -
选择器调试 :在浏览器 DevTools Console 中用
$$(selector)测试 CSS 选择器。 -
录制脚本:用官方工具生成代码(bash):
arduinoplaywright codegen https://example.com
✅ 最佳实践建议
- 优先使用
locator而非全局选择器; - 避免
time.sleep(),用 Playwright 内置等待; - 对自定义组件封装成函数 (如
select_dropdown(page, label, option)); - 用
has_text=、has=提高定位精准度。