用了这么多年的selenium,你真的知道她吗


简介

    Selenium是ThoughtWorks公司研发的一个强大的基于浏览器的开源自动化测试工具,它通常用来编写web应用的自动化测试。早期也即Selenium1.x时期主要使用Selenium RC(Selenium Remote Control)进来自动化测试。Selenium2.x集成了Selenium和WebDriver的功能。

Selenium 1.X

Selenium 1.X:Selenium IDE + Selenium Grid + SeleniumRC

    Selenium IDE:一个Firefox插件,可以录制用户的基本操作,生成测试用例。

    Selenium Remote Control (RC) :支持多种平台(Windows,Linux,Solaris)和多种浏览器(IE,Firefox,Opera,Safari),可以用多种语言(Java,Ruby,Python,Perl,PHP,C#)编写测试用例。 

     Selenium Grid :允许Selenium-RC 针对规模庞大的测试案例集或者需要在不同环境中运行的测试案例集进行扩展。

    Selenium1 引入了 Remote Control Server 这样一个代理 Server,JavaScript 脚本注入和与 Server 通讯都通过这个代理 Server 来进行。Selenium Server 能启动和杀死浏览器进程,解析并运行由测试程序传递过来的 Selenese 命令,并且可以是一个 HTTP 代理,拦截和验证浏览器和 AUT(测试中的应用)之间的 HTTP 通信。

如下图:Remote Control 模式运行流程

流程说明:

    1.客户端建立与 selenium-RC server 的连接。

    2.Selenium RC Server 启动一个浏览器(或是已经使用中),并注入 JS 代码

    3.将 Selenese 代码传到客户端的 Selenium-Core 中。

    4.Selenium-Core 翻译并解析执行用户录制的操作。

    5.让代理 Server 进行通讯。

    6.Remote Control Server 负责跟远程 Web 应用服务器进行通讯。

    7.操作完成,显示结果,并执行下一指令。

    Selenium RC虽然实现了基本的UI 操作,但是对一些操作的处理不是很理想。如:键盘和鼠标的操作、文件的上传、dialog弹窗的处理等。以及稳定性不是很好,由于使用的是Javascript注入技术,质量依赖于Selenium内核对API解析成的Javascript 质量。Selenium内核对API解析成的Javascript 准确则比较稳定,反之不稳定。

Selenium2.X

Selenium 2.x: Selenium+WebDriver

    Web Driver:针对各个浏览器而开发,通过原生浏览器支持或者扩展(Chrome webDrive、FireFox WebDriver)直接控制浏览器。

    Selenium2是一个用于Web应用程序测试的工具,支持多平台、多浏览器、多语言去实现自动化测试,按照 server–client 的经典设计模式设计(server 端就是 remote server,可以是任意的浏览器。当我们的脚本启动浏览器后, 该浏览器就是 remote server,它的职责就是等待 client 发送请求并做出相应)。他将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素,甚至直接操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),所以就像真正的用户在操作一样。如下图:

流程说明:

    1、实例化webdriver,selenium会确认浏览器的native component是否存在可用而且版本匹配,接着在目标浏览器里启动一整套Web Service,这套Web Service使用了Selenium自己设计定义的协议,叫做The Web Driver Wire Protocol,几乎可以操作浏览器做任何事情。

    WebDriver Wire协议是通用的,也就是说不管是FirefoxDriver还是ChromeDriver,启动之后都会在某一个端口启动基于这套协议的Web Service。例如ChromeDriver初始化成功之后,默认会从http://localhost:46350开始,而FirefoxDriver从http://localhost:7055开始。后续我们调用WebDriver的任何API,都需要借助一个ComandExecutor发送一个命令,实际上是一个HTTP request给监听端口上的WebService。在我们的HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情。

    2、客户端借助ComandExecutor发送HTTP请求给sever端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。

    3、Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。

    Selenium2虽然提高了速度,但是稳定性却决定于浏览器开发商,不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。(甚至包括了AndroidDriver和iOS WebDriver)。

Selenium 3.X

Selenium 3.x : Selenium 2.0 + Selenium RC(Remote Control)

  1. selenium 3.0有了更新的特性加入,尤其是对Edge和safari原生驱动的支持,Edge驱动由MS提供,safari原生驱动由Apple提供。

    2.在最新的Firefox方面,开始支持Mlzilla的geckodriver驱动,来驱动Firefox的控制。

参考文章:

https://www.kancloud.cn/wizardforcel/selenium-doc/102082

https://blog.csdn.net/zhuliqi052466/article/details/74942813

原文发布在微信公众号:软件羊皮人

欢迎关注

猜你喜欢

转载自www.cnblogs.com/tynam/p/10301279.html