Selenium Grid分布式测试

关于Selenium Grid入门看这篇文章就够了

Selenium Grid的前世今生

2004年ThoughtWorks公司的一个测试工程师‘Jason Huggins’为了减少工作量、自己实现了基于JavaScript代码库;用这套代码库可以进行页面交互操作、并且可以重复的在不同浏览器上进行操作;Selenium1.0就诞生了

在Selenium 1.0的版本中包括:Selenium IDE、Selenium Grid、Selenium RC这三部分;

2006年一个来至Google的工程师‘Simon Stewart’做了一个叫着‘webdriver’的项目,这个项目可以直接让测试工具调用浏览器本身提供的内置方法、以此来操作浏览器

2008年‘Selenium1’和‘webdriver’2个项目进行了合并;就出现了我们大部分人见到的‘Selenium webdriver’(简称WebDriver)。

Selenium2 = Selenium + webdriver

而我们今天要介绍的Selenium Grid也和Selenium RC合并到了一起、成为全新的Selenium Grid

现在Selenium Grid已经来到了3.14版本;而最新的Selenium 4版本也即将和我们见面(如果作者不延期的话)

Selenium Grid 能做什么

Selenium-Grid 允许你在多台机器的多个浏览器上并行的进行测试,也就是说,你可以同时运行多个测试。本
质上来说就是,Selenium-Grid 支持分布式的测试执行。它可以让你的测试在一个分布式的执行环境中运行。

换而言之,使用 Selenium Grid 可以让我们在分布式测试环境下执行测试,例如 Windows,Linux,Mac OS,Andoid/iOS 等等,这样可以大大减少重复的工作量,提高我们的工作效率;

什么时候需要用到Selenium Grid

  • 通常需要做多个浏览器的兼容性测试,即在不同浏览器或不同操作系统的浏览器中进行测试
  • 测试用例较多时,也可以通过分布式测试减少测试执行时间

Selenium Grid架构

一个 Grid 框架包含一个 hub 节点和若干个 node 节点。hub 节点是管理所有 node 节点的注册和状态等信息,是一个中心控制节点。也就是说 hub 节点一接收到用户的调用请求,就会把这个请求再转给 node 这类工作节点,node 节点便会在相应的环境及浏览器中执行由 hub 下发的测试用例。原则上说,node 越多的话,该测试环境自动化执行效率就会越高;

Selenium Grid

准备工作

准备测试机器

由于selenium Grid有Hub和Node模式;所以我们至少需要2台电脑
名称 IP地址
Hub机 192.168.104.209
Node机 192.168.104.172

安装Python

现在最新版本的Python版本是3.7.4、大家可以直接安装Python3版本、不要纠结于要不要用Python2
  • 从官网下载和你系统对应版本的Python(32位系统还是64位系统)
  • 安装完成之后确认一下环境变量是否配置成功
  • 在CMD命令行中执行python -V,如果命令行输出版本信息、说明环境变量配置成功

下载Selenium Grid最新版本

SeleniumHq官网下载最新版本的selenium-server; 写文章的时候是2019-08-01、能下载到的最新正式版本是3.141.59版本

Selenium-Grid下载地址

配置Java运行环境

由于下载回来的Grid是一个jar包、所以我们需要部署好java环境;

  • 从java官网下载最新版本的JAVA-SDK安装包
  • 一路下一步安装完成
  • 配置一下环境变量
  • 在CMD命令下输入java -version确认是否安装成功

Java-Version

配置浏览器驱动

请根据你的浏览器版本、下载好对应的驱动程序

  • 用Chrome浏览器就去下载chromedriver.exe
  • 如果是用firefox浏览器就下载geckodriver.exe
  • 把浏览器驱动添加到环境变量里面

可以从下面的地址中下载对应的驱动程序

部署Selenium Grid的Hub节点

我们在192.168.104.209这台Hub机器上运行如下的命令

java -jar selenium-server-standalone-3.141.59.jar -role hub

Hub节点常用参数

  • -role hub 即用Hub模式启动
  • -port Hub启动的端口;node节点连接的端口
  • -Huhubhost 如果有多个IP的话、可以指定绑定IP地址

其默认监听端口4444,默认IP是localhost 如果要修改,只需要加-port和-Hubhost

Hub-start

Hub启动成功之后我们在浏览器上访问 http://192.168.104.209:4444/grid/console
就可以看到Hub的状态信息、如果能看到如下图的信息、说明Hub启动成功了

Hub-console

部署Selenium Grid的Node节点

我们在192.168.104.172这台Node节点机器上执行如下命令

java -jar selenium-server-standalone-3.141.59.jar -role node  -hub http://192.168.104.209:4444/grid/register -port 6666

Node节点常用参数

  • -role node 设置为node模式启动
  • -hub 指定Hub注册服务器;http://192.168.104.209:4444/grid/register
  • -port 指定本地node节点的所用的端口号
  • -hubConfig 指定配置文件;可以把所有配置参数放到配置文件里面
  • -browser 可以指定浏览器

默认情况下,Node节点允许并发使用11个浏览器…: 5个Firefox, 5个Chrome, 1个Internet Explorer。默认情况下,并发测试的最大数量设置为5。要更改此设置和其他浏览器设置,可以将参数传入每个-browser开关(每个开关表示基于参数的节点)。如果使用-browser参数,默认浏览器将被忽略.

Node节点启动成功之后我们在命令行窗口能看到注册成功的信息

Node-start

切换到Hub-console刷新信息;可以看到我们的Node节点已上线啦

Node-console

编写第一个测试脚本

接下来我们会写一个简单的测试脚本、让其在Node节点上执行

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote(
    command_executor='http://192.168.104.209:4444/wd/hub',
    desired_capabilities=DesiredCapabilities.FIREFOX)

driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Selenium")
driver.find_element_by_id("su").click()
  • 这段代码中我们连接Hub服务
  • 并配置使用Firefox浏览器来执行功能;
  • 然后由Hub来分配Node节点去执行用例、当然这里我们只有一个Node节点
  • 访问百度、在输入框里面输入selenium,然后点击搜索按钮

通过下面的视频我们看一下selenium-Grid的效果

第一个Grid用例效果

我们在写一个多Node节点的用例

这次我们在192.168.104.172这台Node节点机器上开2个Node节点;

一台机器上可以开无数个Node节点、只要port区分开就可以

下面的启动命令我们用6666 和7777 2个端口启动了2个Node节点

start java -jar selenium-server-standalone-3.141.59.jar -role node  -hub http://192.168.104.209:4444/grid/register -port 6666
start java -jar selenium-server-standalone-3.141.59.jar -role node  -hub http://192.168.104.209:4444/grid/register -port 7777

这样一来我们就有2个Node节点了

2个Node节点

修改一下我们的测试代码

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
nodes={'http://192.168.104.172:6666/wd/hub':'chrome',
       'http://192.168.104.172:7777/wd/hub':'firefox'}

for host,browser in nodes.items():
    print(host,browser)
    driver=webdriver.Remote(command_executor=host,
                        desired_capabilities={'browserName':browser})
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys(browser)
driver.find_element_by_id('su').click()

这段代码也很简单、功能如下

  • list里面是我们创建的2个Node节点地址
  • 用循环取出来、然后执行命令
  • 一个Node节点用Crhome浏览器、另外一个Node节点用Firefox
  • 访问百度、搜索关键词

我们来看一下运行效果、这次就只录制了Node节点机器的视频

多Node节点用例效果

最后

Selenium Grid是Selenium的一个组件、所以核心还是Selenium;

参考文章

文章中用到的软件