Selenium4之CDP

news2025/1/23 16:55:20

相较于以前的版本,Selenium4除了推出了relative Locators,还有一个比较重要的更新就是对于Chrome Dev Tools Protocol的支持。

Chrome Dev Tools Protocol帮助用户监测、检查、调试和模版化Chrome浏览器以及基于Chromium的其它浏览器(比如EDGE,360极速等)。Chrome Dev Tools Protocol简称为CDP。而Chrome Dev Tools为用户提供接口来执行各种可编程操作。CDP的方法比较多,其涵盖的领域包括Browser,Debugger,DOM,Console,Network,Page等。

Selenium4提供了两个CDP相关方法:

  • send()
  • executeCDPCommand()

两者都用来和Chrome DevTools Protocol进行交互,但也不尽相同。前者selenium提供了一个wrapper,来调用Chrome DevTools Protocol命令;而后者直接调用ChromiumDriver的一个现有方法,无需借助selenium的wrapper。至于究竟用哪一个,我想selenium4可能更希望用户用前者。

1.  获取浏览器信息

browser.execute_cdp_cmd("Browser.getVersion", {})

  2. 设置device mode

set_device_metrics_override = dict({
    "width": 375,
    "height": 812,
    "deviceScaleFactor": 50,
    "mobile": True
})
browser.execute_cdp_cmd('Emulation.setDeviceMetricsOverride', set_device_metrics_override)

3. 修改地理位置

map_coord = {
    "latitude": 42.1408845,
    "longitude": -72.5033907,
    "accuracy": 100
}
browser.execute_cdp_cmd("Emulation.setGeolocationOverride", map_coord)

从实用角度来说,这在测试一些基于位置服务的Web APP中会有用武之地。

4. 设置网络条件

browser.driver.set_network_conditions(
    offline=False,
    latency=10,
    download_throughput=500 * 1024,
    upload_throughput=500 * 1024)
browser.get('https://www.baidu.com')
net_con = browser.driver.get_network_conditions()
print(net_con)

sleep(3)
print("Latency: " + str(net_con["latency"]))
print("Download Throughput: " + str(net_con['download_throughput']))
print("Upload Throughput: " + str(net_con['upload_throughput']))

这在测试或者重现一些和网络状态相关的问题时会有用。在selenium中,如果我们没有设置过network conditions, 那么selenium也无法通过get_network_conditions()方法获取网络状态;selenium设置的网络状态需要等待一定的时间才能生效。

5. 截图

res = browser.execute_cdp_cmd('Page.captureScreenshot', {})

with open('../output/baidu.png', 'wb') as f:
    img = base64.b64decode(res['data'])
    f.write(img)

截图在selenium中已经有现成的方法,所以这个功能看起来没有多少使用价值。或者,我们还没有看到其真正的用途。

6. HTML转成PDF

res = browser.execute_cdp_cmd('Page.printToPDF', {})

with open('../output/baidu.pdf', 'wb') as f:
    img = base64.b64decode(res['data'])
    f.write(img)

Selenium之前是没有现成的方法把当前的页面转成PDF的,所以,不管如何,至少这拓展了Selenium本身的功能。

7. 监控浏览器console中的error信息

capabilities = DesiredCapabilities.CHROME
capabilities['loggingPrefs'] = {'browser': 'ALL'}
browser = webdriver.Chrome(
    desired_capabilities=capabilities,
    service=Service(executable_path="../driver/chromedriver")

browser.get('https://www.bilibili.com/')
browser.execute_script("console.error('There is an error!');") # generate an error

logs = []
for entry in browser.driver.get_log('browser'):
    if entry['level'] == 'SEVERE':
        logs.append(entry)

logs_json = json.dumps(logs, indent=4, ensure_ascii=False)
with codecs.open('../output/console_logs.json', "w", "utf-8") as f:
    f.write(logs_json)

当我们运行自动化Web测试用例的时候,Selenium更多关注与页面元素的呈现和交互。但有些时候,虽然页面上一切正常,但是浏览器的console里已经产生了一堆错误,这些错误常常对测试来说是一些有效信息。如果我们能在代码里自动去监控这些error,那一方面会让我们的测试更全面,另一方面也节省了时间。

8. 获取performance metrics

browser.get('https://www.baidu.com')
browser.execute_cdp_cmd('Performance.enable', {})
t = browser.execute_cdp_cmd('Performance.getMetrics', {})
print(t)

 和页面装载相关的一些数据会被返回。

9. 获取requests和response信息

Selenium本身更关注浏览器中UI的end-to-end操作,而并不关注其产生的requests和response。而CDP提供了一种途径,让我们在UI自动化操作的过程中,也可以一窥其相应的requests和response。

capabilities = DesiredCapabilities.CHROME
capabilities["goog:loggingPrefs"] = {"performance": "ALL"}
browser = webdriver.Chrome(
    desired_capabilities=capabilities,
    service=Service(executable_path="../driver/chromedriver"))

browser.get('https://www.baidu.com')

request_log = browser.driver.get_log('performance')
for i in range(len(request_log)):
    message = json.loads(request_log[i]['message'])
    params = message['message']['params']
    request = params.get('request')

    if not request:
        continue

    url = request.get("url")
    if filter_url(url):
        print("Request url: {}".format(url))
        print("Request headers: {}".format(request.get("headers")))
        print("Request method: {}".format(request.get("method")))
        content = browser.execute_cdp_cmd(
            'Network.getResponseBody', 
            {'requestId': params.get("requestId")})
        print("Response: {}".format(content))
        print("**********")

其实,我还发现有个package,名为 seleniumwire也能实现在selenium中获取requests和responses。但美中不足的是,如果使用seleniumwire,那么我们使用的就是seleniumwire中的web driver,而不是原生selenium的web driver,不太喜欢这种在selenium外套壳的方式。

本来以为我需要两三篇文章才可以将CDP讲完,没想到这么短就结束了。内容其实还有很多,但是大部分只有用到才有价值,所以就不在乎那么多细节了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 2.x系列【27】应用篇之代码混淆

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本2.7.0 文章目录概述代码混淆ProGuard使用Maven 插件直接使用工具混淆概述 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成…

创建.NET MAUI程序

.NET MAUI,先说说读音,Maui,英 [ˈmaui], 美 [ˈmaʊi],直接读:毛伊,或者读大写字母MAUI。 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和…

混合云和多云:差异和相似之处

一般来说,云计算是服务器的集合,您可以通过 Internet 访问其资源。要访问云服务/资源,您需要一个云服务提供商根据您的业务需求为您提供服务。混合云和多云是两种比较流行的云计算类型,下文主要对两者的差异和相似之处作出详解&am…

CD147单克隆抗体通过酰胺反应偶联到Dox-CMCh-BAPE聚合物胶束/CBZ-AAN-Dox的制备

小编在这里给大家分享了CD147单克隆抗体通过酰胺反应偶联到Dox-CMCh-BAPE聚合物胶束/CBZ-AAN-Dox的制备,和小编一起来看! 瑞禧分享-CBZ-AAN-Dox的研究: 通过计算机辅助药物设计和化学合成,我们获得并研究了前药N-苄氧基羰基Ala-…

力扣 146. LRU 缓存

题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返…

基于PHP+MySQL二手书交易系统

随着时代的变迁和人们的对知识的汲取,人们需要不断的购买一些新的图书来进行学习,但是这些图书在使用过一点时间之后其价值也会在拥有者手中变的没有那么高了,但是对于没有阅读和使用过这本书的人来说其还是具有更好的价值的,如果直接购买新书价格比较昂贵,对于拥有者来说如果将…

6个好用到爆的音频、配乐素材网站,BGM都在这里了

现在只要有一部手机,人人都能成为视频创作者。一个好的视频不能缺少的就是内容、配乐,越来越注重版权的当下,音效素材使用不当造成侵权的案例层出不穷。为了避免侵权,找素材让很多创作者很头疼。 今天我就整理了6个可以免费下载&a…

Hibernate多表的关联插入

一、一对多关系: “一”的一方为主表,“多”的一方为副表,主表关联副表,应该在主表中加入副表对象作为属性。 根据顾客ID查询顾客信息 (一) ,同时将顾客名下所有订单查出 (多&#…

公司建设网站的好处及优势

企业为什么要建网站?企业建站的好处和优势!在新的世纪里,互联网将进入一个全新的阶段,信息技术的发展将带动其他行业的发展,所有行业都将与之深度融合和渗透。 越来越多的企业开始从对互联网的认识阶段走向认同和行动…

在关系数据库中允许空值的一些缺点

早在 2020 年,我们就了解了关系数据库系统中的 NULL 值及其用途。正如那篇文章所述,NULL 值已成为一个特殊标记,表示不存在任何数值。你也可以说 NULL 值可能表示列可能有一个值,但是你还不知道该值是什么。在这种情况下&#xff…

Python: 打包发布到PyPi上

经常会碰到python包要打包成sdk放到PyPi上开源的情况。 下面的操作具体参考:https://packaging.python.org/en/latest/tutorials/packaging-projects/。 一、准备 1、pyproject.toml 我的具体如下 [build-system] requires ["setuptools>61.0"] bu…

atguigu8 集群

0. 集群介绍 (1)集群的目标 • 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影 响。 停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自 然灾害等不可预…

基于Matlab使用线性FM波形对带状合成孔径雷达系统建模(附源码)

目录 一、合成孔径雷达成像 二、雷达配置 三、场景配置 四、SAR 信号模拟 五、总结 六、程序 此示例说明如何使用线性 FM (LFM) 波形对基于带状图的合成孔径雷达 (SAR) 系统进行建模。SAR是一种侧视机载雷达,与真实…

布隆过滤器原理,优缺点

介绍: 位图:int[10],每个int类型的整数是4*832个bit,则int[10]⼀共有320 bit,每个bit⾮0即1,初始化时都是0 添加数据时:将数据进⾏hash得到hash值,对应到bit位,将该bit改…

Koa.js搭建简单服务器,连接数据库

Koa.js搭建简单服务器,连接数据库1. 环境node v7.6版本以上2. 创建服务安装依赖3. 根目录新建index.js,新建router.js,controller文件夹4. 浏览器访问5. 连接mysql6. 查询测试7、其它1. 环境node v7.6版本以上 2. 创建服务安装依赖 新建文件…

Origin绘制折线图

Origin常用功能见: Origin常用功能_Dezeming的博客-CSDN博客Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计,​信号处理,曲线拟合以及峰值分析。Origin中的曲线拟合是采用基于Levernberg-Marquardt算法(LMA&…

软件设计模式复习

一、统一建模语言 1.统一建模语言知识点 二、面向对象设计原则 史上最全设计模式导学目录(完整版) 三、设计模式概述 1.定义:设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代…

Go 语言报错 StackGuardMultiplier redeclared in this block

前言 最近在 GitHub 刷到了 GitHub - golang-china/gopl-zh: Go语言圣经中文版, 然后又是周末,就起了玩心。搞一个 Go 玩玩,去 The Go Programming Language下载了 Go 语言安装包,一路默认安装。然后打开 VS Code 安装 Extensio…

5个编写技巧,有效提高单元测试实践

1. 什么是单元测试 “在计算机编程中,单元测试又称为模块测试,是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最…

PPT的使用技巧(一):对齐、文字填充、柱状图填充

1、快速对齐 在制作PPT时,需要将绘制的几个图形进行对齐,如果用人工进行对齐,则效果会很差,且耗时严重。如下图所示为未对齐时的情况,可以发现4个矩形在水平、垂直方向均不对其。 我们需要将其进行对齐后变成如下效果…