在实际测试的环境中,有的时候我们需要配置多个远程主机来运行测试脚本。(尤其是面对多语言环境的情况下)那么,这时我们需要配置selenium Grid2 分布式自动化测试环境。
selenium grid的组成与作用:由一个集线器hub和多个客户机node组成,如果你的程序需要在不同的浏览器,不同的操作系统上测试,而且比较多的case需要多线程远程执行,那么一个比较好的测试方案就是使用 selenium grid,hub用来管理各个代理节点的注册和状态信息,并且接受远程客户端代码的请求调用,然后把请求的命令再转发给代理节点来执行。 来看下面一张图:
假如,我自己写代码的是PC-A,而想运行的地方在PC-B,那么可以按照以下方式设定。(这里PC-A,PC-B均为Windows系统)
在PC-A上(写脚本的机器),使用管理员权限打开cmd命令行,找到selenium-server-standalone-3.9.1.jar所在的路径(假设为c:\abc),执行命令:
java -jar c:\abc\selenium-server-standalone-3.9.1.jar -role hub -port 6667
这里解释一下:
c:\abc\selenium-server-standalone-3.9.1.jar 这个是jar包的路径。
-role hub 是作为hub的角色运行
-port 6667 是开放6667端口供其他的客户端来连接。
PS:可以将上面的命令做成BAT文件,运行的时候双击一下即可。也可以加入开机启动,唯一的缺点就是会要有个窗口开在那里。
在PC-B上(即运行脚本的机器)上,安装JDK,并设置java环境变量,并且将selenium-server-standalone-3.9.1.jar拷贝过去。使用管理员权限打开cmd命令行,找到selenium-server-standalone-3.9.1.jar所在的路径(假设为d:\abc),输入以下命令:
java -jar d:\abc\selenium-server-standalone-3.9.1.jar -role node -port 6667 -hub http://XXX.XXX.XXX.XXX:6667/grid/register/
这里解释一下:
-role node 是以mode角色来运行。
-port 6667 -hub http://XXX.XXX.XXX.XXX:6667/grid/register/ 是开放6667端口来连接hub,-hub 后面是hub的地址。
ps:当然这里也可以作成BAT文件。
在进行以上的设定后。我们可以在自动化测试框架的browserUtil类中,封装一个remote_chrome的远程浏览器对象。可以参考下面一段代码:
case "remote_chrome": try { driver = new RemoteWebDriver(new URL("http://192.168.8.113:6667/wd/hub/"), DesiredCapabilities.chrome()); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); log.info("打开浏览器,访问"+url+"网址!"); Reporter.log("打开浏览器,访问"+url+"网址!"); driver.get(url); break;
当然,也可以封装其他浏览器的对象。
在使用TestNG来写测试用例的时候,可以将这个写入到配置文件中。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="SuiteTestA">
<parameter name="browser" value="remote_chrome"/>
<parameter name="url" value="http://192.168.1.23:4567/abc/index.html"/>
<test name = "TestA">
<classes>
<class name = "testcase.autoOne"></class>
</classes>
</test> </suite>
这样,我们运行这个xml就达到了A机器写脚本,B机器运行脚本的目的。