http://blog.csdn.net/five3/article/details/9428655

2013-07-23 21:55 10815人阅读 评论(2) 收藏 举报
 分类:
selenium(14) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

Selenium-Grid版本

selenium-grid分为版本1和版本2,其实它的2个版本并不是和selenium的版本1和2相对应发布的[即selenium-grid2的发布比selenium2要晚一点]。不过幸运的是现在的selenium-grid2基本能支持selenium2的所有功能了。

selenium虽然分1和2,但其实原理和基本工作方式都是一样的。只是版本2同时支持selenium1和selenium2两种协议,并且在一些小的功能和易用性上进行了优化。比如:指定测试平台的方式;以下未作特殊说明的Selenium-Grid均为通用。

Selenium1工作原理

selenium1中除了使用selenium-core以外,进行自动化测试时都需要使用selenium-RC来作为代理[不管是本机还是远程],目的是为了解决同源问题;而造成同源问题的原因是因为selenium1中是使用Javascript来驱动测试执行的【浏览器由于安全问题不允许不同域之间的JS调用,即非同源不可调用;而selenium1中的工作方式就是在宿主页面注入JS并且通过调用JS来执行测试操作的,所以就设计到同源问题】。所以为了达成目的,其解决方案就有2种:

1、使用selenium-core:

selenium-core是一组js库,用来驱动浏览器操作的所有库文件都在这里,整个selenium1可以认为核心组件就是这个selenium-core;而使用selenium-core的方式就是在被测试站点程序的源码里把selenium-core中的所有js库直接添加到页面里,这样页面正常加载的同时也会把selenium-core加载下来,并且天生就是同源的。
2、使用selenium-RC:

RC是一个http代理程序,用来注入到浏览器和被测web程序之间,这样浏览器所有的请求和接收的内容都会通过RC;RC会把浏览器的请求发送给真实的web程序,而在接收到web程序的响应内容时,并没有把内容原原本本的返回给浏览器客户端,而是把包含selenium-core的内容注入到响应内容中去,然后才发送响应内容给浏览器,这样就通过欺骗的方式让浏览器认为selenium1的驱动类库同样是同源的。

Selenium2工作原理

selenium2中因为使用的webdriver,这个技术不是靠js驱动的,而是直接调用浏览器的原生态接口驱动的。所以就没有同源问题,也就不需要使用RC来执行本地脚本了【当然缺点就是并不是所有的浏览器都有提供很好的驱动支持,但JS却是所有浏览器都通用的】。所以selenium2中执行本地脚本的方式是:通过本地webdriver驱动直接调用本地浏览器接口就完事了。在本地调用本地的代码是这样的:

  1. import org.openqa.selenium.*;
  2. import org.openqa.selenium.firefox.*;
  3. WebDriver wd = new FirefoxDriver();
  4. wd.doSomething()

但有时候并总是只执行本地测试的脚本,有时候可能需要在本地调用远程的环境来执行测试,【比如:因为测试环境覆盖原因】此时就需要一个类似selenium1中的RC来承担这个任务,也就是selenium2中的selenium-server。selenium-server支持接收远程脚本的调用命令,然后操作其宿主机上的浏览器来到远程执行测试的任务。当然selenium-server为了兼容selenium1的脚本,它同样也支持selniumRC所支持的功能【即能接收selenium1的调用命令】。在本地调用远程机器执行测试的代码是这样的:

  1. import org.openqa.selenium.*;
  2. import org.openqa.selenium.remote.RemoteWebDriver;
  3. import org.openqa.selenium.remote.DesiredCapabilities;
  4. DesiredCapabilities ieDesiredcap = DesiredCapabilities.internetExplorer();
  5. WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", ieDesiredcap);
  6. wd.doSomething()

但是在运行这段代码之前,要先启动Selenium-Server;启动命令为:

  1. java -jar selenium-server-standalone-x.xx.x.jar

调用selenium-server对应的结构图:

Selenium-Grid工作原理

到此为止,其实还没有提到selenium-grid,因为到目前为止我们还没有需求说同时覆盖多个平台和浏览器,而selenium-grid在这种情况下就会体现出其作用来。selenium-grid是用于设计帮助我们进行分布式测试的工具,其整个结构是由一个hub节点和若干个代理节点组成。hub用来管理各个代理节点的注册和状态信息,并且接受远程客户端代码的请求调用,然后把请求的命令再转发给代理节点来执行。使用selenium-grid远程执行测试的代码与直接调用Selenium-Server是一样的[只是环境启动的方式不一样,需要同时启动一个hub和至少一个node]:

  1. java -jar selenium-server-standalone-x.xx.x.jar -role hub
  2. java -jar selenium-server-standalone-x.xx.x.jar -role node

上面是启动一个hub和一个node,若是同一台机器要启动多个node则要注意端口分配问题,可以这样来启动多个node:

  1. java -jar selenium-server-standalone-x.xx.x.jar -role node -port 5555
  2. java -jar selenium-server-standalone-x.xx.x.jar -role node -port 5556
  3. java -jar selenium-server-standalone-x.xx.x.jar -role node -port 5557

调用Selenium-Grid的基本结构图如下:

上面是使用selenium-grid的一种普通方式,仅仅使用了其支持的分布式执行的功能,即当你同时需要测试用例比较多时,可以平行的执行这些用例进而缩短测试总耗时;除此之外,selenium-grid还支持一种更友好的功能,即可以根据你用例中启动测试的类型来相应的把用例转发给符合匹配要求的测试代理。例如你的用例中指定了要在Liunux上FF的3.6版本进行测试,那么selenium-grid会自动匹配注册信息为Linux、且安装了FF3.6的代理节点,如果匹配成功则转发测试请求,如果失败则拒绝请求。使用selenium-grid的远程兼容性测试的代码同上。其调用的基本结构图如下:

了解了selenium-grid的基本结构,再来看看selenium-grid通信的原理。假设现在我们有这样一个场景:[一个测试请求客户端、一个hub节点、一个Windows+ie代理、一个linux+FF代理、一个Mac+Safari代理、一个任意平台下的Chrome代理]。其分布图如下:

测试的代码如下:

  1. import org.openqa.selenium.*;
  2. import org.openqa.selenium.remote.RemoteWebDriver;
  3. import org.openqa.selenium.remote.DesiredCapabilities;
  4. //test01: 只匹配Windows下的ie来执行此用例,版本不限;多个版本匹配成功时优先级暂未知
  5. DesiredCapabilities aDesiredcap = DesiredCapabilities();
  6. aDesiredcap.setBrowserName("internet explorer")
  7. aDesiredcap.setVersion("")
  8. aDesiredcap.setPlatform(Platform.WINDOWS)
  9. WebDriver wd = new RemoteWebDriver<span style="font-family: Arial, Helvetica, sans-serif;">("http://localhost:4444/wd/hub", aDesiredcap);</span>
  10. wd.doSomething()
  11. //test02: 只匹配linix下的firefox的版本为22的浏览器执行用例;
  12. DesiredCapabilities aDesiredcap = DesiredCapabilities("firefox", "22", Platform.LINUX);
  13. WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
  14. wd.doSomething()
  15. //test03: 只匹配MAC下的safari浏览器执行,版本不限
  16. DesiredCapabilities aDesiredcap = DesiredCapabilities.safari();
  17. aDesiredcap.setPlatform(Platform.MAC)
  18. WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
  19. wd.doSomething()
  20. //test04: 只匹配chrome浏览器,任意平台,任意版本
  21. DesiredCapabilities aDesiredcap = DesiredCapabilities.chrome();
  22. aDesiredcap.setPlatform(Platform.ANY)
  23. WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
  24. wd.doSomething()

那么整个测试执行的过程大概是这样的。首先我们在测试请求机上执行测试代码,代码中测试启动方式为远程调用;

  1. WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);

此时测试脚本就会根据启动参数连接hub节点,这里的连接信息为

  1. http://localhost:4444/wd/hub

连接到hub成功后,会在hub上注册一个session信息;[后面再与hub通信时就会带上这个session信息,告诉hub我之前来过,并且之前是被分配到哪个代理节点上执行过测试]

hub在接受初始化请求时会根据请求的类型来匹配所有代理,并确定是否有符合规则的代理;

如果匹配失败了就会拒绝该初始请求;如果匹配成功则通知对应代理节点进行对应的初始化操作,这里是启动XX,并记录浏览器的注册session,最后发回给hub端;

hub端接收到代理端起的完成后的session信息后,在hub中同样要记录session并返回给测试请求端,[session中会保存匹配到的代理信息]

在初始化请求成功之后,测试请求端会继续发送下一条测试命令,这里的命令是:

  1. wd.doSomething()

此命令会同样被发送给hub,当然是带上session信息的;

hub接收到带有session的请求命令时,会查询session的信息,得知session中对应的代理后就把请求的命令给转发给该代理;

代理在接收到hub发送过来的测试命令后,同样查询其session信息,并根据session信息操作与之对应的浏览器以执行测试;

测试完成后会通知hub执行结果,hub再转发给测试请求端,测试请求端根据的返回信息来决定接下来的执行流程;

最后测试结束后,通知hub关闭浏览器进程,同时清除对应的session信息。

由selenium-grid的原理可以得知

通过selenium-grid执行远程操作时,并不需要远程机器上有测试脚本;但是远程机器上必须安装了对应的webdriver程序[可以直接放在环境变量的目录里即可],当然了,还得需要正确的启动了代理程序。[具体可以参考:如何搭建Selenium-Grid环境]

 
1

Selenium-Grid工作方式的更多相关文章

  1. Selenium Grid的原理、配置与使用(转)

    Selenium GridSelenium Grid在前面介绍Selenium的时候说过它有三大组件,Selenium Grid就是其中之一而作用就是分布式执行测试.讲分布式之前还是要说说UI自动化的 ...

  2. Selenium 4.0beta: Grid 工作原理

    Selenium 4.0 beta版已经发布,那么距离正式版已经不远了,在Selenium 4.0中变化比较大的就是Grid了,本文翻译了官方文档,重点介绍Grid 4的工作原理 Selenium G ...

  3. Robot Framework + Selenium2Library环境下,结合Selenium Grid实施分布式自动化测试

    最近一段时间,公司在推行自动化测试流程,本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写.数据驱动管理.测试用例执行管理等一系列工具软件的研发工作,积累了一些经验,在此与大家做一下分享,也算是做 ...

  4. 配置selenium grid

    本文对Selenium Grid进行了完整的介绍,从环境准备到使用Selenium Grid进行一次完整的多节点分布式测试. 运行环境为Windows 10,Selenium版本为 3.5.0,Chr ...

  5. 用docker搭建selenium grid分布式环境实践之路

    最近需要测试zoom视频会议,同时模拟100个人加入会议.经过了解,zoom提供了直接通过url链接加入会议的方式(只能通过chrome浏览器或者FireFox浏览器,因为用的协议是webrtc). ...

  6. 浩若烟海事半功倍|利用Docker容器技术构建自动化分布式web测试集群Selenium Grid

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_195 "世界上有那么多城市,城市里有那么多的酒馆,可她,却偏偏走进了我的-",这是电影<卡萨布拉卡> ...

  7. 搭建selenium grid简单配置

    1.使用selenium提供的服务端独立jar包 :服务端.客户端都是运行于java7环境. 2.启动hub: hub配置文件如下: Java -jar selenium-server-standal ...

  8. Selenium Grid原理

    转载: http://blog.csdn.net/five3/article/details/9428655 Selenium-Grid版本 selenium-grid分为版本1和版本2,其实它的2个 ...

  9. selenium Grid(一)

    selenium grid Quick Start selenium-grid是用于设计帮助我们进行分布式测试的工具,其整个结构是由一个hub节点和若干个代理节点组成.hub用来管理各个代理节点的注册 ...

  10. 转:Selenium-Grid工作方式

    Selenium-Grid版本 selenium-grid分为版本1和版本2,其实它的2个版本并不是和selenium的版本1和2相对应发布的[即selenium-grid2的发布比selenium2 ...

随机推荐

  1. MySQL性能优化的最佳21条经验【转载】

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  2. Qt Quick 简单教程

    上一篇<Qt Quick 之 Hello World 图文详解>我们已经分别在电脑和 Android 手机上运行了第一个 Qt Quick 示例—— HelloQtQuickApp ,这篇 ...

  3. [DP]一道理想收入问题【转】

    题意:以一元为本金,能获得的最大收入,第i天股票价格为v[i],1<=i<=m 思路: (1)DP思路明显,直接进行动态规划,令f[i]代表第i天所获得的最大收入.那么有公式: f[i] ...

  4. 【搜索 回溯】 zoj 1002

    题意:一些机枪彼此不能在同一行和同一列,但是由于有墙的阻隔,能保证子弹无法穿透,即可以同行同列,现问如果说给了一个n*n(n<=4)的矩阵,并给出了墙的分布情况,能否求出最大能繁殖的机枪数. 思 ...

  5. 扫描局域网内的ip和主机名

    1. 目的 今天发现我配置的一台电脑ip被人占用了,所以准备写个程序扫描一下局域网内所有正在使用的ip和主机名 2. 实现--直接上代码 import time import threading im ...

  6. C: define many functions using predefine..

    /* Defines COUNTER. There must be exactly one such definition at file scope * within a program. */ # ...

  7. jquery_api(CSS)

    outerWidth([options]) 获取第一个匹配元素外部宽度(默认包括补白和边框). 此方法对可见和隐藏元素均有效. outerHeight([options]) 获取第一个匹配元素外部高度 ...

  8. 解决IIS网站.woff 404 (Not Found)问题

    一.在没有权限操作IIS管理器的情况下,在Web.config中的system.webServer节点进行如下配置: <system.webServer> <staticConten ...

  9. P2P应用中的NAT穿透问题

    多年前曾经写过一个关于NAT钻洞的实验.现在发现那个做法在我现在的路由器上已经不管用了.经过一番搜索发现时过境迁,世界变化很快,新路由器已经是UPnP了.在这里重新理一下几种方法. 第一种,也是不太靠 ...

  10. mysql分页pagination

    http://www.phpjabbers.com/php--mysql-select-data-and-split-on-pages-php25.html returns 20 records so ...