网站首页 > 技术文章 正文
一、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 连接用于客户端与浏览器之间的双向通信,允许实时发送和接收指令以及浏览器状态。
猜你喜欢
- 2025-07-03 pytorch v2.7.0震撼发布!Blackwell GPU支持+编译性能狂飙,AI开发
- 2025-07-03 PyWebView:用 Python 构建桌面应用的神器
- 2025-07-03 最受欢迎 Top 12 Python 开源框架,你都用过吗?
- 2025-07-03 Python Web 框架(pythonweb框架django)
- 2025-07-03 用 Python 和 Pywebview 打造现代可视化 GUI 界面
- 2025-07-03 RabbitMQ架构详解(7大架构原理模型图解)
- 2025-07-03 【Python程序开发系列】使用Flask实现前后端分离(案例)
- 2025-07-03 FastUI:用Python构建高性能React应用,告别JavaScript
- 2025-07-03 Python 失宠!Hugging Face 用 Rust 新写了一个 ML框架,现已低调开源
- 2025-07-03 每天一个 Python 库:Django全能Web框架,一站式后台开发
你 发表评论:
欢迎- 586℃几个Oracle空值处理函数 oracle处理null值的函数
- 580℃Oracle分析函数之Lag和Lead()使用
- 568℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 564℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 561℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 553℃【数据统计分析】详解Oracle分组函数之CUBE
- 539℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 534℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)