`
xinklabi
  • 浏览: 1560164 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

Selenium-Grid工作方式(自动化测试技术)

 
阅读更多

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

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驱动直接调用本地浏览器接口就完事了。在本地调用本地的代码是这样的:

 

[java] view plaincopy
 
  1. import org.openqa.selenium.*;  
  2. import org.openqa.selenium.firefox.*;  
  3.   
  4. WebDriver wd = new FirefoxDriver();  
  5. wd.doSomething()  

 

 

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

 

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

 

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

 

[java] view plaincopy
 
  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]:

[java] view plaincopy
 
  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:

 

[java] view plaincopy
 
  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代理]。其分布图如下:

测试的代码如下:

 

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

 

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

[java] view plaincopy
 
  1. WebDriver wd = new RemoteDriver("http://localhost:4444/wd/hub", aDesiredcap);  

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

[java] view plaincopy
 
  1. http://localhost:4444/wd/hub  

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

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

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

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

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

[java] view plaincopy
 
  1. wd.doSomething()  

 

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

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

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

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

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

由selenium-grid的原理可以得知

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

分享到:
评论

相关推荐

    selenium-server-2.9

    selenium web是一种自动化测试工具,有三部分组成selenium-ide;selenium-rc;selenium-grid。这里只是selenium-rc。

    selenium-grid-1.0.8

    Selenium Grid是一种自动化的测试辅助工具,Grid通过利用现有的计算机基础设施,能加快Web-app的功能测试。利用Grid,可以很方便地同时在多台机器上和异构环境中并行运行多个测试事例。

    selenium-server-grid(包含版本3.14和4.0.0)

    Selenium Grid允许我们在多台计算机上并行运行测试,并集中管理不同的浏览器版本和浏览器配置(而不是在每个单独的测试中)。 Selenium Grid解决了一些常见的委派和分发问题,但是例如将无法管理您的基础结构。

    selenium 3.8.1

    这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 . Net、...

    selenium-server-standalone-3.9.1.rar

    selenium grid分布式3.9.1高版本

    selenium-grid-docker-swarm-test:使用Selenium Grid和Docker Swarm分发自动化测试

    使用Selenium Grid和Docker Swarm分发自动化测试 想学习如何构建它吗? 查看。 要使用这个项目吗? 货叉/克隆 创建并激活虚拟环境 安装要求 Digital Ocean并访问令牌 将令牌添加到您的环境中: $ export DIGITAL_...

    selenium自动化测试工具

    selenium 用于Web应用程序测试,包含 selenium ide(测试录制), selenium remote control(编写及运行)和selenium grid(测试的并行处理)

    Selenium2 Python自动化测试实战

    第1章自动化测试基础.wmv 第2章测试环境搭建.wmv 第4章WebDriver API_1.wmv 第4章WebDriver API_2.wmv 第4章WebDriver API_3.wmv 第5章自动化测试模型_1.wmv 第5章自动化测试模型_2.wmv 第6章Selenium IDE.wmv 第7章...

    grid-video-recorder:Selenium网格视频录制解决方案

    在Selenium节点中运行的测试自动化。 要查看蒙特媒体库的许可信息,请访问 配置步骤创建一个新文件夹(例如,命名为记录器) 将jar(grid-video-recorder.jar)下载到文件夹(recorder)中将selenium独立服务器.jar...

    selenium-grid-extensions:Selenium Grid扩展集,用于更好的UI测试

    Sikuli允许您自动化看到的一切。 2)从Selenium网格节点下载文件 在Selenium测试中下载文件? 将它们带到您的机器上并检查内容。 现在很简单。 3)在Selenium网格节点上上传资源 您可能有一些文件上传测试。 将...

    基于selenium 2的自动化测试从入门到精通

    本书向开发人员和测试人员展示了如何使用Selenium进行Web自动化测试。本书从自动化测试的特点娓娓道来,引出了主角Selenium;介绍了Selenium IDE的使用;讲述了获取页面元素和定位页面元素的多种方式;讲解了...

    se-grid-test:Selenium Grid 基础设施的自动化测试

    Selenium测试和监控项目提供公用事业测试Se Grid Infrastructure - 在更新或重新启动之后,运行检查Grid 是否成功启动以及浏览器是否仍然可以启动并执行它们需要执行的操作是有意义的。 。 监控 Selenium Grid - ...

    Selenium2 Python自动化测试实战(第二版)

    第1章 自动化测试基础 第2章 测试环境搭建 第3章 Python基础 第4章 WebDriver API 第5章 自动化测试模型 第6章 Selenium IDE 第7章 unittest单元测试框架 第8章 自动化测试高级应用 第9章 Selenium Grid2 第10章 ...

    Selenium (WEB自动化工具/爬虫)

    本文详细介绍了Selenium Python版本的自动化测试方法和实践,通过本文学习你将掌握如下内容:Selenium 测试环境搭建单元测试、生成测试报告、定位元素、WebDriver属性和方法、WebElement属性和方法、操作form表单、...

    SeleniumDemo:Selenium自动化测试框架

    Selenium自动化测试框架 最近有打算用python重写一下,感兴趣的朋友可以叉首先需要安装python,之后安装selenium lib pip install -U selenium 使用Selenium 3.x + Testng + Jenkins + Maven 使用页面对象模型 ...

    Selenium Grid案例

    自动化测试 Selenium Grid经典案例,使用一个案例描述了Selenium Grid如何实现在不同机器上并行执行多个测试任务

    selenium grid最新版本

    web自动化测试工具selenium 最新版本

    PacktPublishing-Beginning-Selenium-WebDriver-Testing-in-Java:Packt发行的《 Selenium-WebDriver-Java测试》,由Packt发布

    实施自动化测试最佳实践,以便您可以使用任何工具进行自动化测试 创建极其可靠和稳定的自动化测试 自动执行各种UI元素,例如按钮,链接,单选按钮,复选框和下拉元素 使用先进的Selenium技术创建强大的测试 实现高级...

    Selenium Grid的原理.docx

    讲分布式之前还是要说说UI自动化的优势来突出Selenium Grid,最简单的两点解决重复执行测试、解决多浏览器兼容这是UI自动化的价值;那分布式是什么概念?简单的说就是老大收到任务,分发给手下去干;通过Selenium ...

    selenium.grid:使用Helm软件包管理器在Kubernetes集群上运行Selenium网格

    Selenium Grid使自动化执行工作变得更加容易。 使用Selenium Grid,可以在多台计算机上并行运行多个测试,从而将执行时间从数天缩短至数小时。 但是,设置我们自己的Selenium Grid意味着我们必须跨多台虚拟机或物理...

Global site tag (gtag.js) - Google Analytics