Selenium4之CDP
相较于以前的版本,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:pdf_data = base64.b64decode(res['data'])f.write(pdf_data)
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 errorlogs = []
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:continueurl = 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讲完,没想到这么短就结束了。内容其实还有很多,但是大部分只有用到才有价值,所以就不在乎那么多细节了。
Selenium4之CDP相关推荐
- NA-NP-IE系列实验7:CDP
实验7:CDP<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> ...
- 实验集锦二 路由器基础信息、查看命令及CDP
1.路由接口及概述 cpu RAM/DRAM:内存,存储临时的运算结果,断电后内容消失.存储内容包括:路由表.ARP表.快速交换缓存.缓冲数据包.数据队列.当前配置. FLASH:可擦除,可编程的RO ...
- 局域网***-Dos***CDP
CiscoCDP协议运行于大多数Cisco网络设备中,CDP主要是互连设备间通告信息的一种协议.而CDP的Dos***可以导致网络设备运行中断~一台PC机轻松搞垮你的网络... 环境如下: 目标*** ...
- CISCO专用协议CDP
1.CDP是Cisco的专有协议,只能发现直连设备的信息. 2.Cisco的路由器默认在所有接口发送CDP更新,并默认更新时间为60s,保持时间为180s. 3.CDP消息封装在数据链路层的头和尾中. ...
- 深度洞见|从起源到应用,一文详解营销界爆火的 CDP
这是神策研究院深度洞见系列文章的第二期,在本期我们将从 CDP 的火热现状出发,讲一讲它究竟是怎样的概念,应有怎样的恰当应用诉求.本文共计 3677 字,阅读时间约 10 分钟. 2021 年底,我们 ...
- 构建消费者数据平台(CDP),实现全域消费者数字化运营闭环
数字化时代,众多品牌商和零售商都意识到"以消费者为中心"和"数据驱动"是企业增长的两大核心武器,开始从过去粗放的消费者运营转向基于大数据的全渠道精细化运营. 近 ...
- 广告投放管理平台 oython源码_悠易互通CDP产品DataBank获科睿创新奖年度成长价值平台...
原标题:悠易互通CDP产品DataBank获科睿创新奖年度成长价值平台 近日,第五届科睿国际创新节在北京举办,本次大会主要聚焦科技.商业.文化.服务.品牌.营销.文娱等领域的创新力,并颁发备受瞩目的& ...
- 【直播预告 | 阿里云 CDP 公开课】11月25日下午14点准时开讲
简介:扫描海报上的钉钉群二维码入群,线上观看直播,还可以与来自阿里云和 Cloudera 的技术专家交流~ 背景介绍 CDP(Cloudera Data Platform)是 Cloudera 和 H ...
- CRM、DMP、CDP的区别
您必须拥有良好的消费者数据,以推动成功的营销活动.精确的分析和准确的报告,这是营销中的普遍真理.如今,驱动数据支持的技术变得非常复杂,并且导致许多营销人员感到困惑.除了核心营销数据库或者说CRM数据库 ...
最新文章
- php把数组组成xml,php 怎么将数组转xml的函数?
- ABAP RANGE 实现 SELECTION-OPTION 功能
- boost::units模块实现展示信息单元系统
- 20应用统计考研复试要点(part24)--简答题
- 失去循环标签的Python,我这样实现跳出外层循环
- fastjson SerializerFeature
- HTML简单网页-员工申请表单
- python表示10的负次方_在计算器中怎样表示十的负几次方
- html5富文本编辑器菜鸟手册,富文本编辑器froalaEditor(全面)附教程
- mysql 世界国家省市地区数据,中英文
- 计算机收藏夹中桌面不显示不出来,收藏夹里的桌面不见了怎么处理
- 阿里云的esc服务器介绍
- 静态路由,缺省路由和默认网关的区别
- 不只是同构应用(isomorphic 工程化你所忽略的细节)
- 那些年我们一起犯二的青春--文献一--注解 IGRSS-2015-2th
- 国内 Mono 相关文章汇总
- C#操作Word文档
- stm32毕业设计 单片机智能扫地机器人
- 位运算:找出唯一成对的数、找出落单的数
- Oracle 常用函数大全