CDP和Chrome

CDP和Chrome

CDP和WebDriver Protocol

WebDriverChrome DevTools Protocol(CDP) 是用于自动化浏览器的两个主要协议,大多数的浏览器自动化工具都是基于上述其中之一来实现的。可以通过这两种形式来和浏览器交互,通过代码来控制浏览器,完成浏览器的自动化行为(包括网页加载,爬虫,截图,导出pdf等)。

WebDriver Protocol

官网地址:链接

WebDriver 是一个用于控制浏览器的远程控制接口,由 Selenium HQ 开发,后来由 W3C 标准化。它提供了一个平台和语言中立的接口,支持几乎所有主流浏览器,如 Chrome、 Firefox、 Safari、 Edge、 Opera 等。

它和浏览器的通信是通过 JSON Wire 协议完成的,提供了RESTful的web服务,这个服务端就被称为服务端(也被称为webdriver),例如chromeDriver、geckoDriver等。

有服务端就有客户端,客户端可以选择任何语言,客户端和服务端交互,服务端和浏览器交互,从而操作浏览器。常见的客户端就是selenium,nightwatch,webdriverio
在这里插入图片描述

加上我们的自己写的自动化测试代码之后,交互流程如下:

在这里插入图片描述

Chrome DevTools Protocol

官网地址:链接

ChromeDevTools Protocol (CDP)是一个基于 Chromium 的浏览器的调试协议,如 Chrome、 Edge、 Opera 等。通过它可以直接和浏览器交互。控制浏览器的行为。

客户端和浏览器之间没有类似于WebDriver Protocol的服务端(webdriver),而是客户端通过WebSocket直接和浏览器连

类似网络驱动服务器(浏览器驱动程序)的中间人。相反,浏览器是由客户端使用 CDP 直接控制的。与浏览器的通信是通过套接字连接完成的,因此也支持双向通信。客户端通过WebSocket发送命令给浏览器,浏览器执行并返回响应。

在这里插入图片描述

两个相当流行的工具是PuppeteerPlaywright。它们不依赖于webdriver,而是通过 Chrome DevTools Protocol (CDP)直接与浏览器通话。从而更加灵活稳定的控制浏览器。

区别

从代码层面来看,使用的代码接近底层,接近浏览器,代码就会变得更加的稳定和强大,但对于跨浏览器的支持会变得更少。另一方面,代码和浏览器的之间的抽象程度越高,支持的浏览器就越多,但代码会变得不稳定并且功能受限。

对比上面两种

  • WebDriver Protocol

    支持的浏览器多,但不是很稳定,并且功能不强大。

  • Chrome DevTools Protocol

    支持的浏览器少(只是相对WebDriver来说,Chrome能支持就能用),功能强大,稳定。

Webdriver ProtocolChrome DevTools Protocol
Developed by: W3CDeveloped by: Chrome Developer Tools
需要webdriver不需要webdriver
相对较慢并且不是很稳定速度快,较稳定
支持的浏览器多支持部分浏览器
无法通过提供的api来访问浏览器中网络相关的信息可以通过api来访问网络相关的信息
它的实现有:Selenium WebDriver 3, WebdriverIO, Nightwatch它的实现有:Playwright, Puppeteer, Selenium Webdriver 4, Cypress v7

不同的WebDriver有不同的实现方式,chromeDriver内部是通过DevTools protoco来控制浏览器的。

如何选择

如果跨浏览器很重要,就选webDriver,否则选择CDP

puppeteer

链接:官网,github,github-examples

Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包,是它提供了一个高级 API,通过 DevTools 协议控制 Chrome/Chromium。

为什么选择它?

两个理由

  1. github中star数多
  2. Chrome开发团队

可以做什么?

简单来说,浏览器能做的,它都能做

  • 截图和生成PDF
  • 爬取 SPA 或 SSR 网站
  • UI 自动化测试

版本说明

从v1.7.0 版本以来,每次发布都会发布两个软件包:

  • puppeteer

    它会自动下载一个最新版本的 Chrome 用于测试(macOS 约 170MB,Linux 约 282MB,Windows 约 280MB)以及一个 chrome-headless-shell 二进制文件(从 Puppeteer v21.6.0 开始),这个二进制文件保证可以与 Puppeteer 配合正常工作。默认情况下,浏览器会下载到 $HOME/.cache/puppeteer 文件夹中(从 Puppeteer v19.0.0 开始)。

    通过puppeteer-core 控制它下载的浏览器

  • puppeteer-core

    puppeteer-core 是一个库,用于帮助驱动任何支持 DevTools 协议的内容。

    它不会下载浏览器,它提供了封装好的API和浏览器交互。

    如果自己已经下载了浏览器,就可以使用它,但是必须在调用puppeteer.launch的时候显式的指定executablePath(浏览器的执行位置)

    一般来说我会使用这个

代码

建议看这篇文章 结合项目来谈谈 Puppeteer 在结合 github-examples的例子。

注意点

  1. 在部署的时候,建议使用容器化,Chrome本身是内存大户,如果遇到内存飙升,代码是不太好发现这种情况的,不能及时kill掉。

  2. 在加载网页的时候不建议每次都关闭和开启一个新的。

    Chrome的启动和关系是比较耗时的,每次启动会慢150ms到300ms

    建议重复使用同一个Chrome。

  3. Chrome使用一段时间之后,要关掉重启。

    Chrome在我们自己的电脑中有的时候,页面都会崩溃,浏览器也会崩溃。在服务器这种情况下,肯定也会出现,建议在内存中设置调用阈值,比如加载了100个网页,重启一次。这样可降低崩溃的概率。

  4. 容器化部署之后,建议一个容器中只启动一个Chrome。

    这样会让代码简单并且出现问题好排查。这就要求Chrome在代码中是单例

  5. 在整个Chrome做操作期间,对Chrome崩溃的情况做处理

    在业务代码期间,建议使用try catch 来捕获异常,对于非业务异常,需要关闭掉Chrome。防止出现多个Chrome。

  6. Chrome在关闭的时候出现异常,也需要处理

    在调用close()api来关闭Chrome的时候,可能会报错(可能Chrome在这个时候被操作系统kill掉,会出现孤儿进程)。

    建议:在这个时候直接通过shell脚本来强行kill掉

    #!/bin/bashpids=$(ps -ef | grep "[c]hrome" | grep -v 'kill_chrome_processes.sh' |awk '{print $2}')for pid in $pids; doecho "Terminating PID $pid"kill $pid
    doneecho "All chrome processes have been terminated."
    

    孤儿进程:

    父进程启动了子进程,子进程在没有退出的情况下,父进程退出了。此时子进程会被init进程接管。

  7. 尽量关闭掉无用的功能,让他越简单越好。

    比如:-no-sandbox,--disable-extensions,--disable-gpu,--disable_scrollbars

  8. 共享内存

    Chrome 默认使用 /dev/shm 共享内存,但是 docker 默认/dev/shm 只有64MB,显然是不够使用的,提供两种方式来解决:

    • 启动 docker 时添加参数 --shm-size=1gb 来增大 /dev/shm 共享内存,但是 swarm 目前不支持 shm-size 参数
    • 启动 Chrome 添加参数 - disable-dev-shm-usage,禁止使用 /dev/shm 共享内存

参考文档

  • https://www.neovasolutions.com/2022/05/19/browser-automation-tools-protocols-webdriver-vs-cdp/
  • https://dev.to/jankaritech/different-approaches-protocols-to-automate-the-browser-39f1
  • https://stackoverflow.com/questions/50939116/what-is-the-difference-between-webdriver-and-devtool-protocol
  • https://zhuanlan.zhihu.com/p/76237595

关于博客这件事,我是把它当做我的笔记,里面有很多的内容反映了我思考的过程,因为思维有限,不免有些内容有出入,如果有问题,欢迎指出。一同探讨。谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/259633.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

语义分割-基础知识

1.cls_iou计算: cls0_iou预测正确的像素个数/(预测为该类别的像素个数真实标签为该类别的像素个数-预测正确的像素个数) mean_iou各个类别的像素预测准确值相加/像素总个数2.转置卷积(Transposed Convolution) 转置卷积不是卷积的逆运算 转置卷积也是卷…

Java on VS Code 2024年1月更新|JDK 21支持!测试覆盖率功能最新体验!

作者:Nick Zhu - Senior Program Manager, Developer Division At Microsoft 排版:Alan Wang 大家好,欢迎来到 Visual Studio Code for Java 2024年的第一期更新!提前祝愿大家春节快乐!在本博客中,我们将有…

Vue+Vite项目初建(axios+Unocss+iconify)

一. 创建项目 npx --package vue/cli vue 项目成功启动后,进入http://localhost:3200,即可进入创建好的页面(假设启动端口为3200) 二. 测试网络通讯模块 假设有本地服务器地址localhost:8000提供接口服务,接口为localhost:8000/token&#…

使用 apt 源安装 ROCm 6.0.x 在Ubuntu 22.04.01

从源码编译 rocSolver 本人只操作过单个rocm版本的情景,20240218 ubuntu 22.04.01 1,卸载原先的rocm https://docs.amd.com/en/docs-5.1.3/deploy/linux/os-native/uninstall.html # Uninstall single-version ROCm packages sudo apt autoremove ro…

openresty (nginx)快速开始

文章目录 一、什么是openresty?二、openresty编译安装1. 编译安装命令1.1 编译完成后路径1.2 常用编译选项解释 2. nginx配置文件配置2.1 nginx.conf模板 3. nginx常见配置一个站点配置多个域名nginx配置中location匹配规则 三、OpenResty工作原理OpenResty工作原理…

蓝牙BLE学习-概述

1. 简介 1.1 蓝牙发展历程 蓝牙,直接来自于一位国王的名字--King Harald ‘Bluetooth Gromsson。这位国王因两件事留名于史,其一是在公园958年统一了丹麦和挪威,其二是在其死后,其牙齿呈现出暗蓝色的颜色,因而得名蓝牙…

【MATLAB GUI】 1. 普通按钮、静态文本和可编辑文本

看B站up主freexyn的freexyn编程实例视频教程系列36Matlab GUI的学习笔记 文章目录 初步认识普通按钮静态文本和可编辑文本设计一个简易计算机 初步认识普通按钮 任务要求:点击一次“100”按钮,按钮上的文字值就递增1;点击“close”按钮&…

RIP协议详解

​RIP是最早的动态路由协议,虽然已经过时并且很少使用,但是可以通过学习RIP并且和ospf等现在正在使用的路由协议对比,了解其工作原理和过时原因,具有很强的学习性。 一、RIP协议简介 RIP(Routing Information Protoc…

2024.2.18 C++QT 作业

思维导图 练习题 1>定义一个基类 Animal&#xff0c;其中有一个虛函数perform&#xff08;)&#xff0c;用于在子类中实现不同的表演行为。 #include <iostream>using namespace std;class Animal { public:virtual void perform() {cout << "这是一个动…

css2的三大特性

css的三大特性 一.层叠性概念 二.继承性行高的继承 三. 优先级概念a标签默认蓝色继承注意事项 一.层叠性 概念 二.继承性 行高的继承 可用倍数表示三. 优先级 概念 a标签默认蓝色 继承注意事项 例子

使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳有哪些缺点?

虽然使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳有很多优点&#xff0c;但也存在一些缺点和需要注意的事项&#xff1a; 技术要求高&#xff1a;制作过程需要一定的技术和经验&#xff0c;如模具制作、树脂混合和填充等。如果没有足够的经验和技巧&#xff0c;可能会…

DS:八大排序之归并排序、计数排序

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、归并排序 1.1 思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子…

Python学习(16)|列表_遍历_排序_max_min_sum

列表的遍历&#xff1a; a [10,20,30,40] for obj in a: #obj 是临时变量名称&#xff0c;随意起名print(obj) 执行结果&#xff1a; 复制列表所有的元素到新列表对象&#xff1a; list1 [30,40,50] list2 list1 #只是将list2也指向了列表对象。也就是说list…

Maven - Plugins报错的正确解决之道

背景&#xff1a; 正确解决之道&#xff1a; 在自己本地Maven的安装目录中找到自己的仓库地址目录&#xff1a;直接搜索自己报错的插件文件&#xff0c;把它们删除&#xff0c;如图&#xff1a; 接着回到IDEA点击Maven刷新按钮重新加载即可&#xff1a;已解决 反例&#xff1…

SORA给数字孪生带来哪些启示

最近两天的朋友圈又被一则科技新闻刷屏了&#xff0c;那就是&#xff1a;OpenAI发布文生视频模型“Sora”。它是继ChatGPT之后&#xff0c;OpenAI又推出的一款震惊科技圈的产品&#xff0c;使AIGC向前迈了一大步。 数字孪生技术与AIGC&#xff08;人工智能生成内容&#xff09…

多元统计分析课程论文-聚类效果评价

数据集来源&#xff1a;Unsupervised Learning on Country Data (kaggle.com) 代码参考&#xff1a;Clustering: PCA| K-Means - DBSCAN - Hierarchical | | Kaggle 基于特征合成降维和主成分分析法降维的国家数据集聚类效果评价 目录 1.特征合成降维 2.PCA降维 3.K-Mean…

集结低代码/零代码行业大咖,2024年领域内首场重磅峰会火热开启!

低代码/零代码技术是一种创新的软件开发方法&#xff0c;旨在简化程序开发过程&#xff0c;使得即便是非专业开发者也能快速构建和部署应用程序。通过图形化界面和拖拽式操作&#xff0c;用户可以无需编写复杂的代码&#xff0c;就能完成应用程序的设计、开发和部署&#xff0c…

tsmc12:boundary cell/tap cell的align VIA0 grid

更多学习内容请关注「拾陆楼」知识星球 拾陆楼知识星球入口 往期文章链接: tsmc12:via0的spacing问题(Via0.S.1) tsmc12 OD.L.5 DRC tsmc12:boundary cell注意事项

2024年【R1快开门式压力容器操作】考试及R1快开门式压力容器操作考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R1快开门式压力容器操作考试参考答案及R1快开门式压力容器操作考试试题解析是安全生产模拟考试一点通题库老师及R1快开门式压力容器操作操作证已考过的学员汇总&#xff0c;相对有效帮助R1快开门式压力容器操作考试内…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Marquee组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Marquee组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Marquee组件 跑马灯组件&#xff0c;用于滚动展示一段单行文本&#xff0c;仅当…