第一章:Selenium 已死,Playwright 当立?
1.1 自动化的'不可能三角'
长期以来,Web 自动化工程师都在速度、稳定性和抗检测性之间做取舍:
- Selenium: 标准兼容好,但太慢,经常出现
ElementNotInteractableException。 - Puppeteer: 快,但原生只支持 Chrome,Python 生态支持一般。
- Cypress: 开发者体验好,但局限于浏览器内部,无法跨 Tab 操作。
Playwright 的出现打破了这个僵局。作为微软开源的神器,它基于 CDP (Chrome DevTools Protocol) 但又不仅限于此,提供了跨浏览器(Chromium, Firefox, WebKit)的统一 API。
1.2 为什么是 Playwright?
- 自动等待(Auto-waiting):告别
time.sleep()。Playwright 会自动等待元素显式、可点击后再执行操作。 - 网络拦截(Network Interception):原生支持修改请求和响应,做 Mock 测试极为方便。
- 浏览器上下文(Browser Context):一个浏览器实例通过'沙箱'隔离,可以毫秒级创建上百个独立的'账号环境',并发测试神器。
- Shadow DOM 穿透:原生的 CSS 选择器即可穿透 Shadow DOM,这是 Selenium 的噩梦。
Playwright Script (Playwright 脚本)
|
v
Browser Server (浏览器服务)
|
+-- Context 1 (Profile A) (上下文 1 - 配置文件A)
| |
| +-- Page 1 (页面 1)
| +-- Page 2 (页面 2)
|
+-- Context 2 (Profile B) (上下文 2 - 配置文件B)
|
+-- Page 1 (页面 1)
第二章:Playwright 核心实战:不仅仅是点点点
2.1 异步与并发的最佳实践
在 Python 中,建议使用 async_playwright 来最大化性能。
import asyncio
from playwright.async_api import async_playwright
async def run():
async with async_playwright() p:
browser = p.chromium.launch(headless=)
context = browser.new_context(
viewport={: , : },
user_agent=
)
page = context.new_page()
page.goto()
page.click()
page.click()
page.locator().fill()
page.screenshot(path=)
browser.close()
asyncio.run(run())


