Selenium Grid 支持分布式测试,使测试人员可在分布式环境中进行测试

一般而言,在面临以下情况时可考虑使用Selenium Grid :

1.测试多个浏览器或单个浏览器多个版本,或测试不同操作系统上各种浏览器

2.减少测试套件运行时间

Selenium Grid 包含一个Hub 和至少一个 Node,两者都可由 selenium-server-standalone.jar 文件启动

Selenium Grid 的部署

1.安装Selenium Grid :从Selenium 官网下载 selenium-server-standalone.jar 文件即可。Java 可执行文件的路径必须正确,这样才能从命令行运行文件,如果运行出错,检查系统的路径变量看其是否依据包括Java 可执行文件的路径

2.启动Selenium Grid :一般而言,运行Selenium Grid 需要先启动Hub,因为 Node 的调用依赖于 Hub

1、Grid Hub

1)默认启动 Hub

用下面的命令可启动默认设置的Hub

$java -jar selenium-server-standalone-2.37.0.jar -role hub

所有可支持操作系统都能调用该命令。需要注意的是根据selenium-server-standalone 版本的不同,jar 文件名里的版本号需要有相应改动。Hub 启动的默认端口号为4444,用户可通过 -port 参数来定义其启动端口

可通过浏览器中输入如下地址来检查 Hub 是否启动成功:

http://localhost:4444/grid/console

单击view config 可查看Selenium Grid 的配置信息,默认情况下,单个Hub 支持的最大会话数为5个

2)配置 Hub 端口

Hub 默认端口是4444,当自动化测试用例连接到 Selenium Grid Hub 时,监听端口就是TCP/IP 端口,如果机器上已经有另一个程序在使用这个端口,或 selenium-server-standalone 已经被启动,日志会提示端口已经被占用而无法启动Selenium Grid Hub 。

解决方案之一是关闭正在使用4444端口的程序,解决方案二是让 Selenium Grid Hub 使用另一个端口。在命令行中用 -port 更换 Hub 使用的端口:

$java -jar selenium-server-standalone-2.37.0.jar -role hub -port 8888

该方法即使在已有Hub 在机器上运行时也能奏效,只要这两个 Hub 所使用的端口不一样。

如果想知道机器上所有正在运行的程序使用哪些端口,可用下面命令:

$netstat -a

3)JASON 配置文件

除了在启动命令中指定参数来定制 Hub 的配置,还可以通过预定义好的配置文件来启动 Hub。这些配置信息可写在一个 JASON 格式的配置文件中,示例:

{

  "host":null,

  "port":4444,

  "timeout":300000,

  "maxSession":5,

  ...

}

然后通过在启动命令中添加 -hubConfig 参数来加载该 JASON 配置文件

$java -jar selenium-server-standalone-2.37.0.jar -role hub -hubConfig

hub-json-cfg.json

2、Grid Node

1)默认启动 Node

通过如下命令;

$java -jar selenium-server-standalone-2.37.0.jar -role node -hub

htttp://localhost:4444/grid/register

这里假设默认设置的 Hub 已经被启动。Hub 用来监听新请求的默认端口是4444,所以定位 Hub 的URL 中使用了4444这个端口。使用本地主机是假定 Node 和 Hub 在同一台机器上运行。

如果在不同机器上运行 Node 和 Hub,则需要将本地主机名替换成运行Hub 的机器的主机名。在这种情况下,Node 会将本机操作系统所能支持的浏览器信息全部注册到 Hub 上。

如果将参数-roal node 替换成 -role webdriver,则表示该 Node只兼容WebDriver 的执行模式。相应的,如果替换成 -role rc,则表示该Node 只兼容 Remote Control 的执行模式

2)注册 Mac OS X&Opera

2种方式将Node 注册到 Hub上,第一种是通过命令行的方式添加,只需要加上相应的参数:

$java -jar selenium-server-standalone-2.37.0.jar -role node -browser "seleniumProtocol=WebDriver, browserName=opera,version=15,maxInstances=1,platform=MAC" -hubHost localhost

可通过浏览器中输入如下地址来检查 Hub 是否注册成功:

http://localhost:4444/grid/console

第二种方式是创建一个 JASON 格式的配置文件,并在启动 Node 时加载该JSON 配置文件

{

  "class":"org.openqa.grid.common.RegistrationRequest",

  "capabilities":[

    {

      "seleniumProtocol":"WebDriver",

      "browserName":"opera",

      ...

    }

  ],

  "configuration":{

    "maxSession":5,

    ...

  }

}

然后通过在启动命令中添加 -nodeConfig 参数来加载该 JASON 配置文件

$java -jar selenium-server-standalone-2.37.0.jar -role node -nodeConfig

hub-json-mac-opera.cfg.json

3)注册 Linux & Firefox

如果系统中存在多个浏览器版本,则需要指定浏览器的可执行程序路径。本示例设定的配置项如下:

执行模式为WebDriver,以Firefox 最新版本的路径firefox_binary 为例,maxInstances 设置为2,表示最大支持2个浏览器实例的执行

$java -jar selenium-server-standalone-2.37.0.jar -role node -browser "seleniumProtocol=WebDriver, browserName=firefox,version=25,firefox_binary=/home/selenium2/firefox25/firefox maxInstances=2,platform=LINUX" -hubHost 192.168.0.104

4)注册 windos & Internet Explorer

C:\Selenium2> java -jar selenium-server-standalone-2.37.0.jar -role node -browser "seleniumProtocol=Selenium, browserName=iexplore,version=10,maxInstances=4,platform=WINDOWS" -hubHost 192.168.0.104

5)注册 Android & Chrome

首先要设置转发端口,命令如下,其作用是确保主机与Android 模拟器或真机可以进行通信

$./adb -s<serialId> forward tcp:8080 tcp:8080

如果是在 LInux 环境下操作,可通过如下命令安装 socat 并设置端口转发。其作用是确保在另外一台机器上也可以访问当前机器上的Android WebDriver Server

$sudo apt-get install socat

$socat TCP-LISTEN:8889,fork TCP:localhost:8080

通过上面的设置,就可以在网络上任意一个地方通过如下地址来访问 Android WebDriver Server 了;

http://hostname:8889/wb/hub

接下来注册Android 和自带 Chrome 浏览器组合的 Node 到Hub,命令如下,其中端口为8889

$ java -jar selenium-server-standalone-2.37.0.jar -role node -browser "seleniumProtocol=WebDriver, browserName=android,version=4,maxInstances=1,platform=ANDROID" -port 8889 -hubHost 192.168.0.104

6)注册 Appium-iOS & Safari

针对 iOS 平台,这里重点关注如何通过 Appium 这个框架注册 Node 到 Hub 上。可编写一个 JSON 的配置文件,包括相关的操作系统信息、浏览器类型和版本信息等,然后通过 Appium 的命令行方式将该 JSON 配置文件加载进去。JSON 配置文件范例;

{

  "capabilities":[

    {

      "browserName":"safari",

      "platform":"MAC",

      ...

    }

  ],

  "configuration":{

    "maxSession":1,

    ...

  }

}

JSON 配置文件包括2部分:

1.capabilities:用于配置操作系统、浏览器名称和版本、运行实例等信息。由于org.openqa.selenium.platform 中目前没有官方直接支持 iOS 类型,所以 platform 使用 MAC 即可

2.configuration: 用于配置与 Hub 交互时的信息

接下来通过如下命令和参数 --nodecofig 加载写好的 JSON 配置文件;
$ appium --nodeconfig node-json-appium-ios.cfg.json

加载成功会看到如下打印信息:

...

info:Responding to client with success...

7)注册多个不同类型的浏览器

如果需要在一个 Node 上同时运行多个不同类型的浏览器实例,可通过在JSON  配置文件中将所有能支持的浏览器信息定义进去,然后通过命令行方式一次性加载并将相关信息注册到 Hub 上。JSON 示例:

{

  "capabilities":[

    {

      "browserName":"firefox",

      "version":23,

      "maxInstances":5,

      "seleniumProtocol":"WebDriver",

    },

    

    {

      "browserName":"firefox",

      "version":3.6,

      "maxInstances":5,

      "seleniumProtocol":"WebDriver",

    },

    {

      "browserName":"chrome",

      "version":28,

      "maxInstances":5,

      "seleniumProtocol":"WebDriver",

    },

    ...

  ],

  "configuration":{

    "maxSession":5,

    ...

  }

}

通过如下命令加载JSON 配置文件,并同时注册到 Hub 上

$ java -jar selenium-server-standalone-2.37.0.jar -role node -nodeConfig node-json-multiple-browsers.cfg.json

3.编写Grid 的测试用例

1)对于执行模式为WebDriver 的Node,要使用 RemoteWebDriver 和 DesiredCapatilities 示例代码:

DesiredCapabilities firefoxCap=DesiredCapabilities.firefox();

firefoxCap.setBrowserName("firefox");

firefoxCap.setVersion("25");

firefoxCap.setPlatform("LINUX");

WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), firefoxCap);

如上述代码所示,需通过 DesiredCapabilities 来设置测试用例使用的浏览器名称、浏览器版本和操作系统平台。这样就可以确保该测试用例被Hub 分配到同时满足以上三个条件的 Node 上执行

2)对应执行模式为 Remote Control 的 Node,则需要使用 DefaultSelenium,示例代码

Selenium selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.baidu.com");

[Selenium] Grid 介绍的更多相关文章

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

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

  2. Selenium Grid分布式测试入门详解

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

  3. 自动化测试-Selenium家谱介绍

    一.自动化测试定义 自动化测试是通工具录制或编写脚本的方式模拟手工测试的过程,通过回放或运行脚本来执行测试用例,从而代替人工对系统的功能进行验证. 二.什么样的项目适合做自动化测试 1.需求明确,不会 ...

  4. 配置selenium grid

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

  5. selenium+grid做分布式测试

    一.grid介绍 1.本文用的是selenium-server-standalone-3.8.1.jar 2.Firefox用的55版本和对应的驱动 二.grid使用流程说明比如有个A机器,作用是hu ...

  6. .NET自动化测试工具:Selenium Grid

    在生产环境,QA会同时跑几十个上百个的test case.如果用单机串行的话,是一件非常耗时的事情,估计比手点快不了多少.使用并行方案的话,有两种方法,一个是自己写并行框架,一个是用现成的Seleni ...

  7. python selenium自动化测试之路(1)--分层测试概念、selenium工具介绍

    1.分层自动化测试概念 传统的自动化市场更关注产品UI层的自动化测试,而分层的自动化测试倡导产品开发的不同阶段都需要自动化测试 大多公司与研发团队其实是忽略了单元测试与集成测试阶段的自动化测试工作,所 ...

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

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

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

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

随机推荐

  1. Perl、PHP、Python、Java和Ruby的比较

    提问 ◆ Perl.Python.Ruby和PHP各自有何特点? ◆ 为什么动态语言多作为轻量级的解决方案? ◆ LAMP为什么受欢迎? ◆ Ruby on Rails为什么会流行? ◆ 编程语言的发 ...

  2. String的引用传递

    一 引用传递的三个范例 范例一 package com.mtzsoft; /** * 范例一 * * @author Administrator * */ public class Test1 { p ...

  3. Spring 详解(二)------- AOP关键概念以及两种实现方式

    目录 1. AOP 关键词 2. AOP 的作用 3. AOP 的通知类型 4. 基于 xml 的配置方式 5. 基于注解的配置方式 6. 切面的优先级 7. 重用切点表达式 8. 两种方式的比较(摘 ...

  4. Ubuntu 16.04安装Mac OS 12虚拟机资源(没成功,但资源还是可以用)

    整理的Mac OS 12虚拟机资源.装虚拟机基本是按这样的套路: 1.先装VM 2.破解VM使其支持Mac OS 12,这个脚本基本是全平台支持,可以看里面的教程文档. 3.用镜像安装系统. 资源: ...

  5. 新建JRapid项目(idea创建maven多模块项目)

    1.第一步,新建项目(Create New Project) 2.parent项目,不勾选“Crate from archetype”,直接单击“Next”. 3.groupid填写com.codin ...

  6. 【面试 JVM】【第六篇】JVM调优

    六部分内容: 一.内存模型 1.程序计数器,方法区,堆,栈,本地方法栈的作用,保存那些数据 可以画个大图出来,很清晰 jvm内存模型主要指运行时的数据区,包括5个部分. 栈也叫方法栈,是线程私有的,线 ...

  7. Solidworks 不能生成实体,因为这将导致厚度为零的零件怎么办

    如下图所示,我认为我长出一块东西根本不会对其他零件有什么影响.   去掉合并结果之后就好了.   钣金要比方钢高出1mm,这样焊接上去才方便.              

  8. Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life

    Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life ...

  9. BeagleBone Black Industrial系统更新设置一贴通

    前言 原创文章,转载引用务必注明链接.水平有限,欢迎指正. 本文使用markdown写成,为获得更好的阅读体验,推荐访问我的博客原文: http://www.omoikane.cn/2016/09/1 ...

  10. poj(1011)——Sticks(经典的dfs+剪枝)

    题目的大致意思是: 如今有n根木棍,然后须要把它们拼成相同长度的木棍,问满足这个条件的最短的长度是多少? 想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时.那么就要用到剪枝的原理了. ...