Selenium家族谱(三生三世)

  引言

  Selenium发展至今已经到selenium3,以及即将面世selenium4,它的项目进展可以看这里: https://github.com/SeleniumHQ/selenium/projects/2。我们平时可能经常使用selenium框架,但是对它的原理及渊源可能不清楚,下面我整理了一份关于selenium的前世今生。

  Selenium诞生的背景

  市场上已经有一款很牛逼的工具,也是众所周知的——QTP。在UI自动化录制及脚本编写等方面都表现非常优秀,企业级的工具。那么为什么会出现Selenium?

  Jason Huggins在2004年发起了Selenium项目,当时身处ThoughtWorks的他,为了不想让自己的时间浪费在无聊的重复性工作中,幸运的是,所有被测试的浏览器都支持Javascript。Jason和他所在的团队采用Javascript编写一种测试工具来验证浏览器页面的行为;

  这个JavaScript类库就是Selenium core,同时也是seleniumRC、Selenium IDE的核心组件。Selenium由此诞生。

  关于Selenium的命名比较有意思,当时QTP mercury是主流的商业自化工具,是化学元素汞(俗称水银),而Selenium是开源自动化工具,是化学元素硒,硒可以对抗汞。

  

 

  Selenium 1.0

  先看Selenium1.0版本的家族成员

 

 

 

  用一个简单的公式表达:

  Selenium 1.0 = Selenium IDE + Selenium Grid + Selenium RC

 

  Selenium IDE

  Selenium IDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。当然目前谷歌浏览器也支持,但是不太好用。

 

  Selenium Grid

  Selenium Grid是一种自动化的测试辅助工具,用于分布式执行脚本,Grid通过利用现有的计算机基础设施,能加快Web-App的功能测试。利用Grid可以很方便地实现在多台机器上和异构环境中运行测试用例。

 

  Selenium RC

  Selenium RC(Remote Control)是Selenium家族的核心部分。Selenium RC 支持多种不同语言编写的自动化测试脚本,通过Selenium RC的服务器作为代理服务器去访问应用,从而达到测试的目的。  

  Selenium RC分为Client Libraries和Selenium Server。Client Libraries库主要用于编写测试脚本,用来控制Selenium Server的库。Selenium Server分为3部分:

  1.Launcher:启动浏览器

  2.Http Proxy:selenium Server的Http代理

  3.Core:嵌入到浏览器的js代码。

  有Launcher启动浏览器,将core嵌入到浏览器,并把浏览器代理设置为selenium Server的Http Proxy。

  使用的是JavaScript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。

  开发过Web应用的人都知道,Javascript可以获取并调用页面的任何元素,自如的进行操作。

  由此才实现了Selenium的目的:自动化Web操作。这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。

   

  Selenium Server负责控制浏览器行为。所以,我们在学习Selenium1.0的时候,核心应该是学习RC,它的工作原理是这样的:

   

 

  

  在2006年的时候,Google的工程师Simon Stewart发起了WebDriver的项目;因为长期以来Google一直是Selenium的重度用户,但却被限制在有限的操作范围内。

  Selenium RC 是在浏览器中运行JavaScript应用,使用浏览器内置的JavaScript翻译器来翻译和执行selenese命令(selenese是Selenium命令集合)。

  WebDriver是通过原生浏览器支持或者浏览器扩展来直接控制浏览器。WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript,与浏览器紧密集成,因此支持创建更高级的测试,避免了JavaScript安全模型导致的限制。

  除了来自浏览器厂商的支持之外,WebDriver还利用操作系统级的调用,模拟用户输入。

  Selenium与WebDriver原是属于两个不同的项目,WebDriver的创建者Simon Stewart早在2009年8月的一份邮件中解释了项目合并的原因。

   

  注意:

  Selenium与WebDriver合并原因:为何把两个项目合并?部分原因是WebDriver解决了Selenium存在的缺点(例如能够绕过JavaScript沙箱,我们有出色的API),部分原因是Selenium解决了WebDriver存在的问题(例如支持广泛的浏览器),部分原因是因为Selenium的主要贡献者和我都觉得合并项目是为用户提供最优秀框架的最佳途径。

  selenium RC是核心,所以内容有点多,可以了解一下。

 

  Webdriver产生背景

  2006年, Webdriver是由Google工程师开发的,WebDriver是通过原生浏览器支持或者浏览器拓展来控制浏览器, 取代了嵌入web的JavaScript(此处提到了JavaScript的沙箱机制,突破JavaScript的安全模型),除了来自浏览器厂商的支持外(也就是直接控制浏览器进行直接沟通), WebDriver还利用操作系统级别的调用, (什么操作系统级别的调用?) , 模拟用户输入。

 

  Selenium 2.0

  因为Selenium和Webdriver的合并

  用一个简单的公式表达:

  Selenium 2.0 = Selenium 1.0 + Webdriver

 

  2009年, Selenium和WebDriver合并,也就是现在用的Selenium2. Webdriver也就有了一个清晰的API,也就是Webdriver API。

  此时 selenium 2.0 = Selenium 1.0 + Webdriver, 还是兼容selenium 1.0的, 这个时候不同浏览器的驱动方式不同, chrome用的是chromedriver, 其他有的是用selenium RC, 有的是用第三方开发的driver;
所以这个时候, 针对不同的浏览器, 导入的包是不一样的, 可能是selenium包,也有可能的webdriver包

from selenium import selenium,
from selenium import webdriver

  需要强调的是,在Selenium 2.0中主推的是WebDriver,可以将其看作Selenium RC的替代品。因为Selenium为了保持向下的兼容性,所以在Selenium 2.0中并没有彻底地抛弃Selenium RC。

所以,我们在学习Selenium2.0的时候,核心是学习WebDriver。它的工作原理是这样的:

  

 

 

  用python实现的代码如下:

__author__ = 'Leo'

if __name__ == '__main__':

    from selenium import webdriver
    import time

    driver = webdriver.Firefox()
    driver.get('http://www.baidu.com')
    driver.find_element_by_id('kw').send_keys('selenium')
    driver.find_element_by_id('su').click()
    time.sleep(1.1)
    driver.close()

  Selenium 3.0

  Selenium 3.0做了一些不大不小的更新:

  1、终于去掉了RC,简单用公式表示为:

  Selenium 3.0 = Selenium 2.0 - Selenium RC(Remote Control)

  

  selenium3.0是selenium2.0的优化, 最大的变化是 产生了协议 The WebDriver Wire Protocol这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等等等。

  2、Selenium3.0只支持Java8版本以上。

  3、Selenium3.0中的Firefox浏览器驱动独立了,以前装完selenium2就可以驱动Firefox浏览器了,现在和Chrome一样,必须下载和设置浏览器驱动。

  4、MAC OS 集成Safari的浏览器驱动。默认在/usr/bin/safaridriver 目录下。

  5、只支持IE 9.0版本以上。

 

 

  Selenium 4.0

  Selenium 4.0 Alpha版本已经发布了,可以从Selenium官方网站下载。让我们回顾一下Selenium会议上宣布的功能以及此版本中提供的一些改进和附加功能。地址:https://www.selenium.dev/downloads/

  

 

 

 

  在这里看到Selenium 4.0 项目的进展:

  https://github.com/SeleniumHQ/selenium/projects/2

  

 

  附录

  selenium中文文档:https://selenium-python-zh.readthedocs.io/en/latest/

  selenium官方文档:https://www.selenium.dev/selenium-ide/docs/en/introduction/getting-started

  selenium for python 官方文档: https://selenium-python.readthedocs.io/

  访问中文官方文档:https://www.selenium.dev/documentation/zh-cn/,如图:

  

 

  总结:

  selenium工具是唯一可以跟QTP媲美的,也就是UFT。版本在不断更新,可以深入了解一下。接下来我再针对每个组件各讲一个实例。另外有兴趣的朋友,可以加入我们测试开发交流群,一起学习!

 

posted @ 2020-08-01 14:37  全栈测试开发日记  阅读(480)  评论(0编辑  收藏  举报