当前位置: 首页 > article >正文

Playwright理解与封装

前言之前对 Playwright 一直是懵懵懂懂的状态用起来总觉得隔着一层纱。最近深入学习后基本掌握了其主要概念同时也基于自己的理解做了一个封装库。本文将分享我对 Playwright 的理解以及如何将其封装成一个可以像普通浏览器一样使用的自动化工具。一、Playwright 核心概念一个生动的比喻很多人初次接触 Playwright 时会被Playwright、Browser、Context、Page这些概念搞晕。让我用一个生动的比喻来解释 核心比喻概念比喻说明Playwright司机整个自动化过程的控制者负责启动和管理整个流程Browser车辆实际的浏览器实例可以是 Chrome、Firefox 或 WebKitContext车厢独立的浏览器会话拥有自己的 cookies、storage 和上下文Page窗户每个标签页或窗口用户通过它与网页交互关键理解一列火车可以有多节车厢多个 Context每节车厢可以有多个窗户多个 Page只有司机Playwright能启动和停止整列火车二、资源管理必须关闭 Browser这是很多初学者容易踩的坑如果不关闭 Browser会有进程残留⚠️ 正确关闭顺序# ✅ 正确做法按顺序关闭page.close()# 关闭页面可选context.close()# 关闭上下文browser.close()# 关闭浏览器 ← 必须playwright.stop()# 停止 Playwright 特殊情况永久 Context如果使用永久上下文Persistent Context情况会简单一些# 永久上下文会自动管理只需要关闭它即可contextplaywright.chromium.launch_persistent_context(...)# 使用完后context.close()# 关闭后browser 也会自动关闭这是因为永久上下文本质上是一个完整的浏览器实例关闭它就相当于关闭了整个浏览器。三、我对 Playwright 的封装 封装目的使用requests库时有些网站需要运行 JavaScript 才能正常获取内容。传统的 Playwright 使用方式需要频繁创建和销毁浏览器体验不够流畅。我封装了一个单例模式的 Playwright 工具实现✅ 永久上下文像普通浏览器一样使用✅ 自动管理下载✅ 单例模式全局唯一实例✅ 自动释放资源防止进程残留 完整代码# myplaywright.pyimportplatformimportatexitfrompathlibimportPathfromtypingimportOptionalfromplaywright.sync_apiimportsync_playwright,Playwright,BrowserContext,Page,DownloadclassMyPlaywright:自定义Playwright单例类_instance:Optional[MyPlaywright]None_playwright:Optional[Playwright]None_context:Optional[BrowserContext]None_page:Optional[Page]None_is_initialized:boolFalsedef__new__(cls):ifcls._instanceisNone:cls._instancesuper().__new__(cls)returncls._instancedef__init__(self):ifself._is_initialized:returnself._is_initializedTrueself._base_dirPath.cwd()self._chromium_data_dirself._base_dir/chromium_dataself._downloads_dirself._base_dir/downloadsself._chromium_data_dir.mkdir(exist_okTrue)self._downloads_dir.mkdir(exist_okTrue)self._is_windowsplatform.system()Windowsatexit.register(self.release)# 注册退出时释放资源def_get_headless(self)-bool:Windows 显示浏览器Linux 无头模式returnnotself._is_windowspropertydefplaywright(self)-Playwright:ifself._playwrightisNone:self._playwrightsync_playwright().start()returnself._playwrightpropertydefcontext(self)-BrowserContext:ifself._contextisNone:self.reset_context()returnself._contextdefreset_context(self,headless:Optional[bool]None)-BrowserContext:重置浏览器上下文ifself._context:self._context.close()is_headlessheadlessifheadlessisnotNoneelseself._get_headless()self._contextself.playwright.chromium.launch_persistent_context(user_data_dirself._chromium_data_dir,headlessis_headless,bypass_cspTrue,# 跳过内容安全策略args[--start-maximized],no_viewportTrue,accept_downloadsTrue,downloads_pathself._downloads_dir,)returnself._contextpropertydefpage(self)-Page:获取页面单实例ifself._pageisNone:self._pageself.context.pages[0]self._page.on(download,self._on_download)returnself._pagedef_on_download(self,download:Download):下载事件处理print(f开始下载{download.suggested_filename}...)download_pathself._downloads_dir/download.suggested_filename download.save_as(download_path)print(f下载完成:{download_path})defrelease(self):释放资源try:ifself._context:self._context.close()ifself._playwright:self._playwright.stop()self._contextNoneself._playwrightNoneexceptException:passdef__enter__(self):returnselfdef__exit__(self,exc_type,exc_val,exc_tb):self.release() 使用示例# 方式1上下文管理器推荐withMyPlaywright()aspw:pw.page.goto(https://www.baidu.com)print(pw.page.title())# 退出时自动释放资源# 方式2直接使用pwMyPlaywright()pw.page.goto(https://example.com)# 程序退出时自动释放资源✨ 封装亮点特性说明单例模式全局只有一个实例避免重复启动浏览器永久上下文浏览器状态持久化cookies 不会丢失自动下载监听下载事件自动保存文件跨平台Windows 显示浏览器Linux 自动无头资源托管使用atexit确保程序退出时释放资源四、总结 学习要点理解层次关系Playwright → Browser → Context → Page比喻记忆司机、火车、车厢、窗户资源管理必须关闭 Browser永久 Context 只需关闭自身实际应用封装成单例模式打造永久化的自动化浏览器 参考资料Playwright 官方文档Python Playwright API本文为本人原创首发于掘金同步发布于 CSDN、知乎等平台。如果你有任何问题或想法欢迎在评论区交流

相关文章:

Playwright理解与封装

前言 之前对 Playwright 一直是懵懵懂懂的状态,用起来总觉得隔着一层纱。最近深入学习后,基本掌握了其主要概念,同时也基于自己的理解做了一个封装库。本文将分享我对 Playwright 的理解,以及如何将其封装成一个可以像普通浏览器…...

强化学习:从Q-Learning到SAC

强化学习:从Q-Learning到SAC 核心原理 强化学习的基本概念 强化学习(Reinforcement Learning, RL)是一种机器学习范式,通过智能体(Agent)与环境(Environment)的交互来学习最优策略。…...

Python 并发编程:最佳实践与性能

Python 并发编程:最佳实践与性能 核心原理 并发编程的基本概念 并发编程是指在同一时间内执行多个任务的编程范式,其核心目标是提高程序的执行效率和响应速度。在Python中,并发编程主要通过以下三种方式实现: 多线程(T…...

KMS智能激活工具:三步实现Windows和Office永久激活的完整方案

KMS智能激活工具:三步实现Windows和Office永久激活的完整方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然…...

别再死记硬背了!图解AXI4协议握手机制与BRAM读写时序(附仿真波形分析)

AXI4协议握手机制与BRAM读写时序的实战解析 在FPGA开发中,AXI4总线协议已经成为连接IP核的事实标准。但很多开发者在使用AXI接口时,往往停留在"能工作就行"的层面,对协议底层机制一知半解。当遇到复杂的时序问题时,这种…...

大数据分析专业共享单车需求相关数据集,数据量38000条左右

大数据分析专业共享单车需求相关数据集,数据量38000条左右,可以用于共享单车相关大数据分析,具体字段如下:数据详情如下:...

Arm架构文档JSON化:技术解析与开发实践

1. Arm架构文档的JSON化演进在处理器架构领域,文档的机器可读性正成为行业关键需求。作为移动计算和嵌入式系统的霸主,Arm公司近年来持续推进技术文档的结构化改革。2025年底发布的A-profile架构JSON文档包,标志着Arm在架构描述方式上的重大转…...

Python跨端应用启动慢、体积大、热更新难?这4个编译级优化技巧,上线前必须做!

更多请点击: https://intelliparadigm.com 第一章:Python跨端应用编译优化的挑战与本质 Python 作为解释型语言,其跨端(桌面、移动端、WebAssembly)部署长期受限于运行时依赖、体积膨胀和启动延迟。将同一套 Python 逻…...

Layerdivider终极指南:如何3步将任何图片转换为专业PSD分层文件

Layerdivider终极指南:如何3步将任何图片转换为专业PSD分层文件 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾面对复杂的插画作品&…...

Pixelle-Video:三步实现AI全自动短视频生成的专业开发指南

Pixelle-Video:三步实现AI全自动短视频生成的专业开发指南 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video Pixelle-Video是一…...

3分钟极简方案:Onekey让Steam游戏清单下载自动化

3分钟极简方案:Onekey让Steam游戏清单下载自动化 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 您是否厌倦了手动下载Steam游戏清单的繁琐过程?是否曾因复杂的配置步骤而…...

RimSort终极指南:三步解决《边缘世界》模组冲突与排序难题

RimSort终极指南:三步解决《边缘世界》模组冲突与排序难题 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a reliable, community-…...

Pixelle-Video:5分钟学会用AI自动生成多语言短视频

Pixelle-Video:5分钟学会用AI自动生成多语言短视频 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 你是否想过,只…...

基于Biham-Kocher已知明文攻击的ZIP密码恢复引擎架构解析

基于Biham-Kocher已知明文攻击的ZIP密码恢复引擎架构解析 【免费下载链接】bkcrack Crack legacy zip encryption with Biham and Kochers known plaintext attack. 项目地址: https://gitcode.com/gh_mirrors/bk/bkcrack 在数据安全领域,传统PKWARE加密算法…...

云服务器部署Hermes Agent(爱马仕龙虾)的详细教程

云服务器部署Hermes Agent(爱马仕龙虾)的详细教程 关键词:Hermes Agent部署、AI Agent部署教程、腾讯云Lighthouse、微信接入AI助手、Hermes Agent安装、AI助手云端运行 最近一直在研究「AI Agent长期运行」的方案。 本地跑 Agent 最大的问…...

电钢琴核心技术与选购全攻略

在这篇文章中,我们将深入探讨电钢琴的核心技术,包括声源系统、键盘触感和音箱设计等方面。这些技术不仅影响着电钢琴的音质与演奏体验,还在很大程度上决定了你在选购时的优先考虑因素。了解这些技术特性可以帮助你在面对众多型号时作出更明智…...

电动汽车BMS光耦隔离技术解析与应用

1. 电动汽车锂离子电池安全管理挑战 在电动汽车的动力系统中,锂离子电池组的安全管理堪称"心脏监护仪"。以雪佛兰Volt为例,其电池包由288个棱柱形锂离子电池组成,系统电压高达386.6V DC。这种高压环境下的电池管理面临三大核心挑战…...

PicoMQTT:ESP8266/ESP32轻量级MQTT库解析与应用

1. PicoMQTT:为ESP8266/ESP32设计的轻量级MQTT库在物联网设备开发中,MQTT协议因其轻量级和高效性成为设备通信的首选方案。传统方案通常需要树莓派或专用网关作为MQTT代理服务器,而PicoMQTT的出现让ESP8266和ESP32这类微控制器也能承担这一角…...

论文查重辅助存证程序,写作过程记录上链,证明原创性,降低查重纠纷。

⚠️ 说明:这是本地模拟区块链思路的演示程序,用于说明“写作过程存证与原创性辅助证明”的技术逻辑,不等同于正式学术认证系统或查重系统。 一、实际应用场景描述 高校或科研机构中,学生/研究者提交论文时常面临: - 查…...

工业级触控面板电脑ACP-1078核心技术解析与应用

1. AAEON ACP-1078工业级触控面板电脑深度解析在制造业和物流行业的数字化转型浪潮中,工业级HMI(人机界面)设备正扮演着越来越关键的角色。AAEON(研扬科技)最新推出的ACP-1078触控面板电脑,凭借其Rockchip …...

别再傻傻分不清了!5分钟搞懂矩阵的Hadamard积和Kronecker积(附Python/Numpy代码示例)

矩阵运算实战指南:5分钟掌握Hadamard积与Kronecker积的核心差异 刚接触机器学习的朋友们,是否曾在论文中看到⊙和⊗符号时一头雾水?这两种看似相似的矩阵运算,实际代表着完全不同的数学概念。理解它们的区别,就像区分螺…...

随机计算与VDC-2n序列在低功耗硬件设计中的应用

1. 随机计算基础与VDC-2n序列特性随机计算(Stochastic Computing, SC)是一种将数值表示为比特流中"1"出现概率的计算范式。与传统二进制计算相比,SC通过概率运算实现乘加操作,仅需简单的逻辑门即可完成复杂运算。这种特性使其在低功耗、高容错…...

Kubernetes技术入门与实践(四):Deployment资源对象与 Pod探针

第一部分:Deployment资源对象的理论基础与架构剖析1.1 为什么需要Deployment在Kubernetes生态中,用户从不直接管理单个Pod——Pod在节点宕机、资源不足、被驱逐时会消失,Kubernetes也不会自动将其重生。因此,Kubernetes引入了“控…...

Bilibili评论数据采集实战:从爬虫工具到数据分析的完整解决方案

Bilibili评论数据采集实战:从爬虫工具到数据分析的完整解决方案 【免费下载链接】BilibiliCommentScraper B站视频评论爬虫 Bilibili完整爬取评论数据,包括一级评论、二级评论、昵称、用户ID、发布时间、点赞数 项目地址: https://gitcode.com/gh_mirr…...

导电胶技术:电子组装中的关键材料与应用

1. 导电胶技术解析:电子组装中的隐形功臣在拆解手机主板时,你是否注意过那些闪着银光的粘接材料?它们不是传统焊料,而是现代电子制造中不可或缺的导电胶。我曾用导电胶修复过一块因焊盘脱落而报废的显卡,这种材料不仅实…...

ComfyUI-Impact-Pack V8:模块化AI图像增强解决方案的终极实战指南

ComfyUI-Impact-Pack V8:模块化AI图像增强解决方案的终极实战指南 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址…...

OpCore-Simplify:如何用智能自动化工具将黑苹果配置时间从3天缩短到15分钟

OpCore-Simplify:如何用智能自动化工具将黑苹果配置时间从3天缩短到15分钟 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 想象一下&#…...

移动端PDF预览的终极解决方案:pdfh5.js如何完美解决手势缩放与性能难题

移动端PDF预览的终极解决方案:pdfh5.js如何完美解决手势缩放与性能难题 【免费下载链接】pdfh5 项目地址: https://gitcode.com/gh_mirrors/pdf/pdfh5 在移动端开发中,PDF预览一直是个棘手的技术挑战。传统的PDF查看方案往往在移动设备上表现不佳…...

初中数学提分秘籍:搞定因式分解,这3个方法就够了(附口诀和例题)

初中数学因式分解实战指南:3大核心技巧破解90%考题 数学试卷上那道因式分解题,明明老师讲过类似题型,却总在关键步骤卡壳?考试时间一分一秒流逝,草稿纸上涂涂改改的公式就像一团乱麻。别担心,这份专为初中生…...

OpCore Simplify:3步搞定黑苹果EFI配置,告别繁琐手动设置

OpCore Simplify:3步搞定黑苹果EFI配置,告别繁琐手动设置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为OpenCore配置的…...