问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

浅析Selenium-WebDriver

发布网友 发布时间:2024-09-06 08:12

我来回答

1个回答

热心网友 时间:2024-09-08 08:37

2004年,当时在ThoughtWorks工作的Jason Huggins开发了Selenium(Selenium RC)的第一版。2006年,Google工程师基于Selenium开发了WebDriver。2008年,Selenium和WebDriver合并,形成了Selenium2(Selenium WebDriver)。目前,Selenium WebDriver的模式已经升级到Selenium4,并有一个支线项目Selenium-Grid,能够与Selenium配合进行多任务运行(主要针对分布式执行,对于当前业务现状,使用到的可能性很小,本文不展开讲解)。

使用现状:虽然无法直接统计出每个公司的使用现状,但我们可以通过搜索趋势来侧面验证。通过Google Trends查询的结果显示,Selenium WebDriver主导的方案占据主流地位,而Selenium RC的方案正在逐步被淘汰。

Selenium RC:
组成部分:Selenium RC主要由客户端和服务器两部分组成。
工作原理:Selenium RC通过发送HTTP请求与服务器进行通信,服务器再将请求转发给浏览器执行。
缺点:Selenium RC的执行速度较慢,且需要各个浏览器厂商提供支持。

Selenium WebDriver:
组成部分:WebDriver主要由WebDriver接口和对应的浏览器驱动程序组成。
Web Driver:WebDriver提供了另一种与浏览器交互的方式,即利用浏览器原生的API,封装成一套面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏、窗口大小、启动、关闭、安装插件、配置证书等)。由于使用的是浏览器的原生API,速度大大提高,但缺点是需要各个浏览器厂商各自提供。
各种编程语言编写的客户端:向remote server发起请求。
工作原理:底层通信包含以下两个过程:
Selenium -> ChromeDriver server:这个通信过程是基于HTTP协议。
例如,我们要打开一个浏览器页面,并访问www.google.com,先看下Selenium源码是怎么实现这个过程的。
首次建立连接的过程:
选择一个空闲的端口启动chromedriver。
具体发请求的接口:
最终的收口就是_request,发起一个http请求。
后续进行的一系列操作也是类似的过程,例如打开一个网页。
通过这个简单的访问过程,并结合self._command和_request里面的内容,可以大概明白这个流程实际上就是HTTP的请求和响应流程。
为了更进一步验证这个猜想,可以在本地通过postman发送请求模拟Selenium的行为。
首先需要运行chromedriver.exe(默认端口是9515)。
在postman请求,入参可以copy Selenium的入参即可:
POST http://localhost:9515/session
Body: {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}}
同理,基于这个sessionid进行操作:
POST http://localhost:9515/session/933285473c4f3961a3628a0b30d9dd8d/url
Body: {"url": "google.com"}
ChromeDriver server -> Chrome:网上大部分内容都是讲解前面一部分,对于webdriver与浏览器本身的通信提的比较少,这里也简单探讨一下这个过程。
以chromedriver为例,【C++】源码(参考资料[6])和chromium放在一块,暂时无法在飞书文档外展示此内容。
通信的过程依赖于cdp(Chrome DevTools Protocol),有点类似于我们在chrome调试页面进行的操作,chrome调试页面本身就是一个前端工具,与后端的通信就是基于cdp,cdp的某些通信过程是基于websocket。
main函数里面定义了初始端口号是9515,这也解释了我们手动运行chromedriver.exe会使用9515的端口号启动服务。
接收Selenium请求的服务模块是放在./chromedriver/server/ http_handler.cc。
可以明显看到,这块内容对应上和Selenium self._command里面的内容。
在chrome网站上我们可以看到标准的浏览器websocket API定义,例如(chromedevtools.github.io...),同样,chromedriver内部也是通过访问这些API达到操作浏览器的效果。
进一步查找发送websocket的方法,可以找到在SendCommandInternal里面确实调用了socket->Send。
Chromium Embedded Framework (CEF):刚才讨论的情况主要是针对独立浏览器应用的,还有一种是内嵌于客户端的情况,简称cef。Chromium Embedded Framework (CEF)是个基于Google Chromium项目的开源Web browser控件,支持Windows、Linux、Mac平台。除了提供C/C++接口外,也有其他语言的移植版。因为基于Chromium,所以CEF支持Webkit 和 Chrome中实现的HTML5的特性,并且在性能上面也比较接近Chrome。
通信的原理和上面独立应用的情况大差不差,实际使用上需要注意的点如下:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.debugger_address = "127.0.0.1:" + str(self.cef_port)
大概的解释是:当我们指定了debugger_address 之后,chromedrive服务就会尝试使用本地端口号为self.cef_port的服务,也就是测试用例实际操作的是内嵌页面。
如下动图,执行的时候并不会重新打开一个新的edge页面,而是复用已有的页面(之前通过9222端口唤起)。

参考资料:
[1] GitHub - SeleniumHQ/selenium: A browser automation framework and ecosystem.
[2] Browser automation using ChromeDriver and Postman
[3] How ChromeDriver works in the background?
[4] test-circle/selenium_python.md at main · defnngj/test-circle
[5] Chrome DevTools Protocol
[6] chromedriver source code
[7] cnblogs.com/uncleyong/p...
[8] cloud.tencent.com/devel...
[9] einverne.gitbook.io/sel...

热心网友 时间:2024-09-12 02:15

2004年,当时在ThoughtWorks工作的Jason Huggins开发了Selenium(Selenium RC)的第一版。2006年,Google工程师基于Selenium开发了WebDriver。2008年,Selenium和WebDriver合并,形成了Selenium2(Selenium WebDriver)。目前,Selenium WebDriver的模式已经升级到Selenium4,并有一个支线项目Selenium-Grid,能够与Selenium配合进行多任务运行(主要针对分布式执行,对于当前业务现状,使用到的可能性很小,本文不展开讲解)。

使用现状:虽然无法直接统计出每个公司的使用现状,但我们可以通过搜索趋势来侧面验证。通过Google Trends查询的结果显示,Selenium WebDriver主导的方案占据主流地位,而Selenium RC的方案正在逐步被淘汰。

Selenium RC:
组成部分:Selenium RC主要由客户端和服务器两部分组成。
工作原理:Selenium RC通过发送HTTP请求与服务器进行通信,服务器再将请求转发给浏览器执行。
缺点:Selenium RC的执行速度较慢,且需要各个浏览器厂商提供支持。

Selenium WebDriver:
组成部分:WebDriver主要由WebDriver接口和对应的浏览器驱动程序组成。
Web Driver:WebDriver提供了另一种与浏览器交互的方式,即利用浏览器原生的API,封装成一套面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏、窗口大小、启动、关闭、安装插件、配置证书等)。由于使用的是浏览器的原生API,速度大大提高,但缺点是需要各个浏览器厂商各自提供。
各种编程语言编写的客户端:向remote server发起请求。
工作原理:底层通信包含以下两个过程:
Selenium -> ChromeDriver server:这个通信过程是基于HTTP协议。
例如,我们要打开一个浏览器页面,并访问www.google.com,先看下Selenium源码是怎么实现这个过程的。
首次建立连接的过程:
选择一个空闲的端口启动chromedriver。
具体发请求的接口:
最终的收口就是_request,发起一个http请求。
后续进行的一系列操作也是类似的过程,例如打开一个网页。
通过这个简单的访问过程,并结合self._command和_request里面的内容,可以大概明白这个流程实际上就是HTTP的请求和响应流程。
为了更进一步验证这个猜想,可以在本地通过postman发送请求模拟Selenium的行为。
首先需要运行chromedriver.exe(默认端口是9515)。
在postman请求,入参可以copy Selenium的入参即可:
POST http://localhost:9515/session
Body: {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}}
同理,基于这个sessionid进行操作:
POST http://localhost:9515/session/933285473c4f3961a3628a0b30d9dd8d/url
Body: {"url": "google.com"}
ChromeDriver server -> Chrome:网上大部分内容都是讲解前面一部分,对于webdriver与浏览器本身的通信提的比较少,这里也简单探讨一下这个过程。
以chromedriver为例,【C++】源码(参考资料[6])和chromium放在一块,暂时无法在飞书文档外展示此内容。
通信的过程依赖于cdp(Chrome DevTools Protocol),有点类似于我们在chrome调试页面进行的操作,chrome调试页面本身就是一个前端工具,与后端的通信就是基于cdp,cdp的某些通信过程是基于websocket。
main函数里面定义了初始端口号是9515,这也解释了我们手动运行chromedriver.exe会使用9515的端口号启动服务。
接收Selenium请求的服务模块是放在./chromedriver/server/ http_handler.cc。
可以明显看到,这块内容对应上和Selenium self._command里面的内容。
在chrome网站上我们可以看到标准的浏览器websocket API定义,例如(chromedevtools.github.io...),同样,chromedriver内部也是通过访问这些API达到操作浏览器的效果。
进一步查找发送websocket的方法,可以找到在SendCommandInternal里面确实调用了socket->Send。
Chromium Embedded Framework (CEF):刚才讨论的情况主要是针对独立浏览器应用的,还有一种是内嵌于客户端的情况,简称cef。Chromium Embedded Framework (CEF)是个基于Google Chromium项目的开源Web browser控件,支持Windows、Linux、Mac平台。除了提供C/C++接口外,也有其他语言的移植版。因为基于Chromium,所以CEF支持Webkit 和 Chrome中实现的HTML5的特性,并且在性能上面也比较接近Chrome。
通信的原理和上面独立应用的情况大差不差,实际使用上需要注意的点如下:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.debugger_address = "127.0.0.1:" + str(self.cef_port)
大概的解释是:当我们指定了debugger_address 之后,chromedrive服务就会尝试使用本地端口号为self.cef_port的服务,也就是测试用例实际操作的是内嵌页面。
如下动图,执行的时候并不会重新打开一个新的edge页面,而是复用已有的页面(之前通过9222端口唤起)。

参考资料:
[1] GitHub - SeleniumHQ/selenium: A browser automation framework and ecosystem.
[2] Browser automation using ChromeDriver and Postman
[3] How ChromeDriver works in the background?
[4] test-circle/selenium_python.md at main · defnngj/test-circle
[5] Chrome DevTools Protocol
[6] chromedriver source code
[7] cnblogs.com/uncleyong/p...
[8] cloud.tencent.com/devel...
[9] einverne.gitbook.io/sel...
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
圣斗士星矢正义传说攻略_圣斗士星矢正义传说新手攻略 圣斗士星矢正义传说怎么觉醒圣衣 圣衣玩法攻略 圣斗士星矢正义传说召唤石怎么获得 获取攻略一览 超市促销员手机上打卡迟到几分钟 在超市里打卡显示的公司是什么意思? 长鹿休闲度假农庄交通指南 求从容桂到长鹿农庄怎么坐车,详细,准确 形容神情的五字词语 女生内衣穿多久该扔掉 吴江离张家港有多远? javaee与spring之间的关系,到底该如何理解? 北京驰玖建筑工程有限公司怎么样? 北京昌运建筑工程有限公司怎么样? 北京市有哪些建筑公司 《鱿鱼游戏》警察死了吗 《鱿鱼游戏》第二季黄俊昊和456号会一起*... 《鱿鱼游戏》结局伏笔警察是否真的遇害 《鱿鱼游戏》警察结局是什么 鱿鱼游戏摘下面具的是谁 《鱿鱼游戏》幕后boss是谁 老一是不是boss 谁知道宫崎骏的电影都有哪些? 三七片有什么功效 关于服装店的事项! 开个淘宝服装店不懂电脑应该从那里学起 微信ai帮写功能怎么打开? 麻将机装了盒子怎么看出来 哪些广告吸引人 怎么样能拉肚子特别厉害 不想上学 夙夜在公的下一句是什么 装修前设计师会出哪些图纸,你知道吗? 扁平化管理扁平化 渠道扁平化文化影响 怎么让word表格中的文字上下居中 word表格字体上下居中不了怎么办? 宝欣盛监控bxs-1004如何链接笔记本电脑 苹果手机怎么忘电脑里传送照片 苹果电脑怎么传照片到苹果手机? 苹果笔记本电脑和苹果手机怎样互传照片 碧桂园有哪些岗位 碧桂园营销中心策划助理可以不化妆么 宝宝眼圈发黑什么原因引起的 孩子眼圈发黑是什么原因 豆渣发酵养鸡可行吗 烫面葱油饼的做法(发面葱油饼的家常做法) 怎么在华为官网验证序列号? 怎么在官方网站查看自己产品的序列号? gmv和销售额的区别? 还有两天要去给人家当伴郎 我性格比较内向把 不知道注意什么 还有中午... 如何在电脑上使用两个微信号? ...该做哪些工作 有什么职责 具体步骤是什么 请详细解答 谢谢!_百度知... 凉拌豌豆苗怎样做才可口? 什么时候需要批量网页数据获取?