相较于以前的版本,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相关推荐

  1. NA-NP-IE系列实验7:CDP

    实验7:CDP<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> ...

  2. 实验集锦二 路由器基础信息、查看命令及CDP

    1.路由接口及概述 cpu RAM/DRAM:内存,存储临时的运算结果,断电后内容消失.存储内容包括:路由表.ARP表.快速交换缓存.缓冲数据包.数据队列.当前配置. FLASH:可擦除,可编程的RO ...

  3. 局域网***-Dos***CDP

    CiscoCDP协议运行于大多数Cisco网络设备中,CDP主要是互连设备间通告信息的一种协议.而CDP的Dos***可以导致网络设备运行中断~一台PC机轻松搞垮你的网络... 环境如下: 目标*** ...

  4. CISCO专用协议CDP

    1.CDP是Cisco的专有协议,只能发现直连设备的信息. 2.Cisco的路由器默认在所有接口发送CDP更新,并默认更新时间为60s,保持时间为180s. 3.CDP消息封装在数据链路层的头和尾中. ...

  5. 深度洞见|从起源到应用,一文详解营销界爆火的 CDP

    这是神策研究院深度洞见系列文章的第二期,在本期我们将从 CDP 的火热现状出发,讲一讲它究竟是怎样的概念,应有怎样的恰当应用诉求.本文共计 3677 字,阅读时间约 10 分钟. 2021 年底,我们 ...

  6. 构建消费者数据平台(CDP),实现全域消费者数字化运营闭环

    数字化时代,众多品牌商和零售商都意识到"以消费者为中心"和"数据驱动"是企业增长的两大核心武器,开始从过去粗放的消费者运营转向基于大数据的全渠道精细化运营. 近 ...

  7. 广告投放管理平台 oython源码_悠易互通CDP产品DataBank获科睿创新奖年度成长价值平台...

    原标题:悠易互通CDP产品DataBank获科睿创新奖年度成长价值平台 近日,第五届科睿国际创新节在北京举办,本次大会主要聚焦科技.商业.文化.服务.品牌.营销.文娱等领域的创新力,并颁发备受瞩目的& ...

  8. 【直播预告 | 阿里云 CDP 公开课】11月25日下午14点准时开讲

    简介:扫描海报上的钉钉群二维码入群,线上观看直播,还可以与来自阿里云和 Cloudera 的技术专家交流~ 背景介绍 CDP(Cloudera Data Platform)是 Cloudera 和 H ...

  9. CRM、DMP、CDP的区别

    您必须拥有良好的消费者数据,以推动成功的营销活动.精确的分析和准确的报告,这是营销中的普遍真理.如今,驱动数据支持的技术变得非常复杂,并且导致许多营销人员感到困惑.除了核心营销数据库或者说CRM数据库 ...

最新文章

  1. php把数组组成xml,php 怎么将数组转xml的函数?
  2. ABAP RANGE 实现 SELECTION-OPTION 功能
  3. boost::units模块实现展示信息单元系统
  4. 20应用统计考研复试要点(part24)--简答题
  5. 失去循环标签的Python,我这样实现跳出外层循环
  6. fastjson SerializerFeature
  7. HTML简单网页-员工申请表单
  8. python表示10的负次方_在计算器中怎样表示十的负几次方
  9. html5富文本编辑器菜鸟手册,富文本编辑器froalaEditor(全面)附教程
  10. mysql 世界国家省市地区数据,中英文
  11. 计算机收藏夹中桌面不显示不出来,收藏夹里的桌面不见了怎么处理
  12. 阿里云的esc服务器介绍
  13. 静态路由,缺省路由和默认网关的区别
  14. 不只是同构应用(isomorphic 工程化你所忽略的细节)
  15. 那些年我们一起犯二的青春--文献一--注解 IGRSS-2015-2th
  16. 国内 Mono 相关文章汇总
  17. C#操作Word文档
  18. stm32毕业设计 单片机智能扫地机器人
  19. 位运算:找出唯一成对的数、找出落单的数
  20. Oracle 常用函数大全

热门文章

  1. 主流mes厂商_国内主流MES厂商排名报告-MES系统哪家好?
  2. python pandas中读取excel并修改数据类型
  3. 区块链安全:区块链P2P网络详细分析
  4. 在Windows中应用图标变成白色,恢复办法
  5. python:遥感时间序列处理——Mann-Kendall(MK)突变检测(突变次数)
  6. 30ea什么意思_奥迪30fsi什么意思
  7. android发彩信
  8. 《三个×××手》BD-R/960M[中字]1024分辨率 高清下载
  9. 霍尼3320G控制设置
  10. 谷歌云端硬盘 转存_如何在Linux上使用Google云端硬盘