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


