一、Playwright 架构
- 浏览器和驱动程序的连接: Playwright 通过与浏览器的 DevTools 协议(Chrome DevTools Protocol,CDP)进行通信,控制浏览器的行为。每个浏览器实例(如 Chromium、Firefox 和 WebKit)都有一个对应的驱动程序,用于与 Playwright 的 API 交互。
- 当启动一个浏览器实例时,Playwright 启动并连接到浏览器的调试协议,通过这一协议,它能够控制浏览器的行为。
- 与浏览器页面的交互: Playwright 通过创建页面(Page 对象)来控制浏览器窗口。这些页面模拟的是浏览器中的一个 tab 或浏览器上下文。你可以在页面上执行操作。
- 页面操作会通过 DevTools 协议传递给浏览器,浏览器根据命令进行响应,然后 Playwright 会接收浏览器的反馈并继续执行后续操作。
二、Playwright通信机制
Playwright 通过直接与浏览器的 DevTools 协议 进行通信。DevTools 是浏览器内置的调试和自动化接口,允许外部工具直接控制浏览器的行为。Playwright 不依赖于中间的 WebDriver,而是直接与浏览器的 DevTools API 进行通信。
客户端代码 (Python/JavaScript) <----WebSocket----> Playwright <----DevTools Protocol----> 浏览器
import asyncio
from playwright.async_api import async_playwright
async def run():
# 启动 Chromium 浏览器
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
# 打开一个网页
await page.goto("https://www.google.com")
# 查找页面上的元素并与之交互
await page.fill("input[name='q']", "Playwright communication mechanism")
await page.press("input[name='q']", "Enter")
# 关闭浏览器
await browser.close()
# 运行 Playwright 脚本
asyncio.run(run())
Playwright 的通信步骤:
- 客户端代码调用 p.chromium.launch(),这会启动 Chromium 并通过 DevTools 协议与浏览器建立 WebSocket 连接。
- page.goto() 直接通过 DevTools 协议发送指令到浏览器,要求加载指定的 URL。
- page.fill() 和 page.press() 通过 DevTools 协议发送指令,要求与页面上的元素交互(如输入文本、按下键盘)。
- 浏览器执行这些指令,并通过 WebSocket 连接将结果返回给 Playwright,最终返回到客户端代码。
总结:
Playwright 直接与浏览器的 DevTools 协议 进行通信,绕过了外部的 WebDriver,减少了中间层的延迟。
WebSocket 连接用于客户端与浏览器之间的双向通信,允许实时发送和接收指令以及浏览器状态。