playwright在python 3.10中可完全替代selenium,启动更快、api更一致,内置自动等待与重试机制,无需手动配置webdriverwait或chromedriver;安装只需pip install playwright和playwright install chromium firefox,并须用with sync_playwright() as p:管理上下文以避免僵尸进程。

Playwright 在 Python 3.10 中完全可以替代 Selenium,而且启动更快、API 更一致、默认支持等待和自动重试,不用自己写 WebDriverWait 或 expected_conditions。
安装与浏览器驱动无需手动管理
Playwright 自带浏览器二进制(Chromium/Firefox/WebKit),安装时自动下载,不依赖系统环境变量或手动配置 chromedriver。
执行以下命令即可完成全部依赖安装:
pip install playwright<br>playwright install chromium firefox
注意:playwright install 默认只装 Chromium;如果需要多浏览器测试,得显式指定,比如 playwright install firefox。漏掉这步会导致运行时报错 BrowserType.connect_over_cdp: Browser closed 或找不到 browser 实例。
sync_playwright() 的上下文管理必须用 with
Playwright 的同步 API 要求必须用 with sync_playwright() as p: 包裹整个流程,否则浏览器进程不会被正确释放,多次运行会累积僵尸进程。
常见错误写法:
# ❌ 错误:没用 with,或提前 exit/return 导致 browser.close() 不执行<br>p = sync_playwright().start()<br>browser = p.chromium.launch()<br>page = browser.new_page()<br>page.goto("https://example.com")<br># 缺少 browser.close() 和 p.stop()
正确写法(推荐):
from playwright.sync_api import sync_playwright<br><br>with sync_playwright() as p:<br> browser = p.chromium.launch(headless=True)<br> page = browser.new_page()<br> page.goto("https://example.com")<br> print(page.title())<br> # with 块退出时自动调用 browser.close() 和 p.stop()
要点:
-
headless=True是默认值,可省略;设为False时能看见浏览器窗口,适合调试 - 不要在
with外引用page或browser,它们生命周期严格绑定上下文 - 异步场景用
async_playwright()+async with,语法类似但不能混用
元素定位和等待逻辑天然内建,不用手写显式等待
Selenium 里常要写 WebDriverWait(driver, 10).until(EC.presence_of_element_located(...)),Playwright 全部内置在 page.locator() 和 page.wait_for_selector() 里,且默认超时 5 秒(可全局设 timeout=30000)。
例如,等一个按钮出现并点击:
# ✅ Playwright:一行到位,自动等、自动滚动、自动重试<br>page.get_by_role("button", name="Submit").click()<br><br># ⚠️ 注意:get_by_role 是推荐方式,比 query_selector 更健壮<br># 它基于 ARIA role 和 accessible name,抗 HTML 结构变化能力强
对比 Selenium 常见痛点:
- 用
page.query_selector("button.submit-btn")类似find_element(By.CSS_SELECTOR, ...),但失败时抛TimeoutError而非NoSuchElementException -
page.locator()返回 locator 对象,不立即执行查找,延迟到后续动作(如.click())才触发,支持链式等待 - 所有动作(
.fill()、.select_option()、.press())都自带等待逻辑,不需要额外wait_for_*调用
处理文件上传、新标签页、弹窗需显式启用对应选项
Playwright 默认不支持某些交互场景,必须提前声明能力,否则会静默失败或报错。
常见三类场景及写法:
-
文件上传:需先
set_input_files(),且<input type="file">必须可见(Playwright 不支持隐藏 input 的send_keys)
→ 正确做法:page.locator('input[type="file"]').set_input_files("/path/to/file.txt") -
新标签页(target="_blank"):需监听
page.on("popup", ...)或用context.expect_page()
→ 示例:with context.expect_page() as new_page_info:<br> page.get_by_text("Open").click()<br> new_page = new_page_info.value -
alert/confirm/prompt 弹窗:需提前用
page.on("dialog", lambda dialog: dialog.accept())监听,否则页面会卡住
这些不是“高级功能”,而是日常测试中大概率遇到的边界情况;忽略它们会导致脚本在 CI 环境下随机失败,尤其在 headless 模式中更难排查。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











