关于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有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版本
配置Java运行环境
由于下载回来的Grid是一个jar包、所以我们需要部署好java环境;
- 从java官网下载最新版本的JAVA-SDK安装包
- 一路下一步安装完成
- 配置一下环境变量
- 在CMD命令下输入
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启动成功之后我们在浏览器上访问 http://192.168.104.209:4444/grid/console
就可以看到Hub的状态信息、如果能看到如下图的信息、说明Hub启动成功了
部署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节点启动成功之后我们在命令行窗口能看到注册成功的信息
切换到Hub-console
刷新信息;可以看到我们的Node节点已上线啦
编写第一个测试脚本
接下来我们会写一个简单的测试脚本、让其在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的效果
我们在写一个多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节点了
修改一下我们的测试代码
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节点机器的视频
最后
Selenium Grid是Selenium的一个组件、所以核心还是Selenium;