写点什么

selenium 的实现原理

作者:Cindy
  • 2022 年 3 月 03 日
  • 本文字数:2046 字

    阅读完需:约 7 分钟

selenium的实现原理

最近在准备组内自动化技术分享的内容,准备课程的期间,把一些更深层的东西复习了一下,虽然我们以 RF 开源框架为基础来搭建自己的框架和编写测试脚本,但调用的第三方库 selelinum library 还是封装的 selenium,也看了相关的书和官方文档,以及其他资料,现总结如下

Selenium 的实现原理

现在我们普遍使用的 selenium 版本是 2.0 版本及以上


selenium2.0 的技术方案是 selenium1.0 + webdriver


对 Selenium 而言,V1.0 和 V2.0 版本的技术方案是截然不同的,V1.0 的核心是 Selenium RC,而 V2.0 的核心是 WebDriver,可以说这完全是两个东西。


Selenium 3.0 相比 V2.0 并没有本质上的变化,主要是增加了对 MacOS 的 Safari 和 Windows 的 Edge 的支持,并彻底删除了对 Selenium RC 的支持。


selenium4.0 也出了,增加了相对定位器(想了解的话,可以看我这篇文章selenium相对定位器)其他新特性可以从官方文档看。


所以接下来,会针对 V1.0 和 V2.0 来解释 Selenium 实现 Web 自动化的原理。

selenium v1.0

selenium v1.0 的家谱如下



Selenium 1.0,又称 Selenium RC,其中 RC 是 Remote Control 的缩写。写在前面,我们首先要搞清楚的一点就是 selenium rc 它利用的原理就是 JavaScript 代码可以很方便地获取页面上的任何元素并执行各种操作,控制浏览器的行为。为了更好理解,转载一个资料中的一段话如下:但是因为"同源政策(Same-origin policy)"(只有来自相同域名、端口和协议的 JavaScript 代码才能被浏览器执行),所以要想在测试用例运行中的浏览器中,注入 JavaScript 代码从而实现自动化的 Web 操作,Selenium RC 就必须“欺骗”被测站点,让它误以为被注入的代码是同源的。那如何实现“欺骗”呢?这其实就是引入 Selenium RC Server 的根本原因,其中的 Http Proxy 模块就是用来“欺骗”浏览器的


Selenium RC 由以上图中可以看出,分为两部分 client 和 server,


client 就是 client libraries,就是我们通过支持的各种语言编写的测试脚本


server 有以下三个部分组成:


(1)Selenium Core,是被注入到浏览器页面中的 JavaScript 函数集合,用来实现界面元素的识别和操作;


(2)Http Proxy,作为代理服务器修改 JavaScript 的源,以达到“欺骗”被测站点的目的;


(3)Launcher,用来在启动测试浏览器时完成 Selenium Core 的注入和浏览器代理的设置。

执行流程

比如我们用 python 语言编写了一个测试用例脚本去执行


(1)python 编写的用例脚本(Client Libraries) 向 Selenium RC Server 发送 Http 请求,要求与其建立连接。


(2)连接建立后,Selenium RC Server 的 Launcher 就会启动浏览器或者重用之前已经打开的浏览器,把 Selenium Core(JavaScript 函数的集合)加载到浏览器页面当中,并同时把浏览器的代理设置为 Http Proxy。


(3)测试用例通过 Client Libraries 向 Selenium RC Server 发送 Http 请求,Selenium RC Server 解析请求,然后通过 Http Proxy 发送 JavaScript 命令通知 Selenium Core 执行浏览器上控件的具体操作


(4)Selenium Core 接收到指令后,执行操作。如果浏览器收到新的页面请求信息,则会发送 Http 请求来请求新的 Web 页面。由于 Launcher 在启动浏览器时把 Http Proxy 设置成为了浏览器的代理,所以 Selenium RC Server 会接收到所有由它启动的浏览器发送的请求。


(5)Selenium RC Server 接收到浏览器发送的 Http 请求后,重组 Http 请求以规避“同源策略”,然后获取对应的 Web 页面。


(6)Http Proxy 把接收的 Web 页面返回给浏览器,浏览器对接收的页面进行渲染。

selenium v2.0

selenium2.0 主推的是 web driver, 它实现的技术方案和 1.0 完全不同,它使用的是浏览器厂商自己的原生的浏览器驱动器,所以这也是,当我们使用 selenium 时,需要针对每个浏览器去下载对应的浏览器驱动,放置本地目录并设置环境变量,还有它的模式是经典的 cs 模式它的执行流程我们就比较知道了


执行流程

(1)当使用 Selenium2.0 启动浏览器 Web Browser 时,后台会同时启动基于 WebDriver Wire 协议的 Web Service 作为 Selenium 的 Remote Server,并将其与浏览器绑定。


(2)绑定完成后,Remote Server 就开始监听 Client 端的操作请求。


(3)执行测试时,测试用例会作为 Client 端,将需要执行的页面操作请求以 Http Request 的方式发送给 Remote Server。该 HTTP Request 的 body,是以 WebDriver Wire 协议规定的 JSON 格式来描述需要浏览器执行的具体操作。


(4)Remote Server 接收到请求后,会对请求进行解析,并将解析结果发给 WebDriver,由 WebDriver 实际执行浏览器的操作。

总结

Selenium2.x 的好处是由于使用的是浏览器原生的 API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,避免了 javascript 安全模型导致的限制,还有我们可以调用浏览器提供的 API 对浏览器做特定配置,比如设置下载目录,安装插件等。缺点就是需要针对不同浏览器调用不同的浏览器 driver,当浏览器自动更新时会需要我们同步更新浏览器 driver 的版本,不过这个同步更新的问题,现在也不必考虑,可以通过 webdriver_manager 库来解决。

发布于: 刚刚阅读数: 2
用户头像

Cindy

关注

还未添加个人签名 2022.01.26 加入

还未添加个人简介

评论

发布
暂无评论
selenium的实现原理_自动化测试_Cindy_InfoQ写作平台