了解了selenium-grid的基本结构,再来看看selenium-grid通信的原理。假设现在我们有这样一个场景:[一个测试请求客户端、一个hub节点、一个Windows+ie代理、一个linux+FF代理、一个Mac+Safari代理、一个任意平台下的Chrome代理]。其分布图如下:
测试的代码如下:
import org.openqa.selenium.*;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
//test01: 只匹配Windows下的ie来执行此用例,版本不限;多个版本匹配成功时优先级暂未知
DesiredCapabilities aDesiredcap = DesiredCapabilities();
aDesiredcap.setBrowserName("internet explorer")
aDesiredcap.setVersion("")
aDesiredcap.setPlatform(Platform.WINDOWS)
WebDriver wd = new RemoteWebDriver<span style="font-family: Arial, Helvetica, sans-serif;">("http://localhost:4444/wd/hub", aDesiredcap);</span>
wd.doSomething()
//test02: 只匹配linix下的firefox的版本为22的浏览器执行用例;
DesiredCapabilities aDesiredcap = DesiredCapabilities("firefox", "22", Platform.LINUX);
WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
wd.doSomething()
//test03: 只匹配MAC下的safari浏览器执行,版本不限
DesiredCapabilities aDesiredcap = DesiredCapabilities.safari();
aDesiredcap.setPlatform(Platform.MAC)
WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
wd.doSomething()
//test04: 只匹配chrome浏览器,任意平台,任意版本
DesiredCapabilities aDesiredcap = DesiredCapabilities.chrome();
aDesiredcap.setPlatform(Platform.ANY)
WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
wd.doSomething()
那么整个测试执行的过程大概是这样的。首先我们在测试请求机上执行测试代码,代码中测试启动方式为远程调用;
WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
此时测试脚本会根据启动参数连接hub节点,这里的连接信息为
http://localhost:4444/wd/hub
连接到hub成功后,会在hub上注册一个session信息;[后面再与hub通信时会带上这个session信息,告诉hub我之前来过,并且之前是被分配到哪个代理节点上执行过测试]
hub在接受初始化请求时会根据请求的类型来匹配所有代理,并确定是否有符合规则的代理;
如果匹配失败了会拒绝该初始请求;如果匹配成功则通知对应代理节点进行对应的初始化操作,这里是启动XX,并记录浏览器的注册session,后发回给hub端;
hub端接收到代理端起的完成后的session信息后,在hub中同样要记录session并返回给测试请求端,[session中会保存匹配到的代理信息]
在初始化请求成功之后,测试请求端会继续发送下一条测试命令,这里的命令是:
wd.doSomething()
此命令会同样被发送给hub,当然是带上session信息的;
hub接收到带有session的请求命令时,会查询session的信息,得知session中对应的代理后把请求的命令给转发给该代理;
代理在接收到hub发送过来的测试命令后,同样查询其session信息,并根据session信息操作与之对应的浏览器以执行测试;
测试完成后会通知hub执行结果,hub再转发给测试请求端,测试请求端根据的返回信息来决定接下来的执行流程;
后测试结束后,通知hub关闭浏览器进程,同时清除对应的session信息。
由selenium-grid的原理可以得知
通过selenium-grid执行远程操作时,并不需要远程机器上有测试脚本;但是远程机器上必须安装了对应的webdriver程序[可以直接放在环境变量的目录里即可],当然了,还得需要正确的启动了代理程序。[具体可以参考:如何搭建Selenium-Grid环境]