微信公众号:程序员小濠
关注可了解更多的测试技术。问题或建议,请添加微信好友;
如果你觉得公众号对你有帮助,欢迎推荐给他人
一、Selenium Grid 简介
Selenium Grid是Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。
通过将客户端命令发送到远程浏览器的实例, Selenium Grid 允许在远程计算机 (虚拟或真实) 上执行WebDriver脚本. 它旨在提供一种在多台计算机上并行运行测试的简便方法.
Selenium Grid允许我们在多台计算机上并行运行测试, 并集中管理不同的浏览器版本和浏览器配置 (而不是在每个独立的测试中).
Selenium Grid通过使用多台机器并行运行测试来加速测试通过的执行。例如,如果你有一个包含100个测试的套件,但是你将 Grid 设置为支持4个不同的机器(vm 或单独的物理机器)来运行这些测试,那么您的测试套件完成的时间大约是在单台机器上顺序运行测试的时间的四分之一。对于大型测试套件和长时间运行的测试套件(如执行大量数据验证的测试套件) ,这可以大大节省时间。有些测试套件可能需要几个小时才能运行。增加运行套件所需时间的另一个原因是缩短开发人员为 UAT 签入代码后测试结果的周转时间。越来越多的软件团队在实践敏捷软件开发测试,他们希望尽可能快地得到测试反馈,而不是等待一夜之间的测试通过。
Selenium Grid还用于支持针对多个运行时环境(特别是同时针对不同的浏览器)运行测试。例如,可以设置一个虚拟机的网格,每个网格支持不同的浏览器,而被测试的应用程序必须支持这些浏览器。所以,1号机器有 Internet Explorer 8,2号机器,Internet Explorer 9,3号机器是最新的 Chrome,4号机器是最新的 Firefox。当测试套件运行时,Selenium-Grid 接收每个测试-浏览器组合,并分配每个测试在其所需的浏览器上运行。
此外,你可以拥有一个Grid,它包含所有相同的浏览器、类型和版本。例如,可以有一个由4台计算机组成的网格,每台计算机运行3个 Firefox 70实例,从某种意义上来说,允许一个可用 Firefox 实例的“服务器场”。当套件运行时,每个测试都被传递给 Grid,Grid 将测试分配给下一个可用的 Firefox 实例。通过这种方式,可以想象12个测试同时并行运行,从而大大减少了完成测试通过所需的时间。
Grid是非常灵活的。这两个示例可以组合在一起,以允许每个浏览器类型和版本的多个实例。这样的配置既可以提供快速测试通过完成的并行执行,也可以同时支持多种浏览器类型和版本。
总结:Selenium Grid就是一款分布式的,用于兼容性测试和并发性测试的框架或者工具。
二、Selenium Gird的目的和主要功能
-
为所有的测试提供统一的入口
-
管理和控制运行着浏览器的节点/环境
-
扩展
-
并行测试
-
跨平台(操作系统)测试
-
负载测试
三、Selenium Grid 组件
1.Client
:客户端
2.Router
:路由,负责将请求转发到正确的组件,它是Grid
的入口点,所有的外部请求都会被它接收到。根据请求的不同,Router
的行为也不同。如果是一个新的会话请求,路由器将把它转发给新的会话队列,它将把它添加到新的会话队列中。新的会话队列将通过事件总线触发事件。分发服务器(将在其中处理新会话创建)将接收事件并轮询新会话队列以获取新会话请求。如果请求属于现有会话,那么Router
将会话id
发送给Session Map
,Session Map
将返回运行会话的Node
。然后,路由器将请求转发给节点。
3.Session Map
:会话映射,会话映射是一个数据存储,用于保存会话id
和会话运行的节点的信息。在向节点转发请求的过程中,它充当了对Router
的支持。路由器将向会话映射询问与会话id
关联的节点。
4.Session Queue
:会话队列,新建会话队列是唯一可以与新建会话队列通信的组件。它处理所有队列操作,比如添加操作队列。它具有用于设置请求超时和请求重试间隔的可配置参数。
5.Distributor
:分布式,分发服务器知道所有节点及其功能。它的主要作用是接收一个新的会话请求,并找到一个合适的节点,在那里可以创建会话。创建会话后,分发服务器在会话映射中存储会话id
和执行会话的节点之间的关系。
6.Nodes
:节点,一个节点可以在一个网格中多次出现。每个Node
负责管理运行它的计算机的可用浏览器的插槽。节点通过事件总线将自身注册到分发服务器,其配置作为注册消息的一部分发送。默认情况下,Node
自动注册其运行的计算机路径上的所有可用浏览器驱动程序。它还为基于Chromium
的浏览器和Firefox
每个可用CPU
创建一个插槽。对于 Safari
和google Internet Explorer
,只创建一个插槽。通过特定的配置,它可以在Docker
容器中运行会话。您可以在下一节中看到更多的配置细节。Node
只执行接收到的命令,它不评估、判断或控制任何事情。运行Node
的计算机不需要具有与其他组件相同的操作系统。例如,一个Windows Node
可能有能力提供一个浏览器选项,而这在 Linux
或Mac
上是不可能的Internet Explorer
。
7.Event Bus
:事件总线,事件总线充当节点、分发服务器、新会话排队器和会话映射之间的通信路径。网格通过消息完成大部分内部通信,避免了昂贵的 HTTP 调用。当以完全分布式模式启动网格时,事件总线是应该启动的第一个组件。
四、Selenium Grid配置
1.独立模式
默认情况下,服务器会监听本地4444
端口,也就是http://localhost:4444
,这就是你应该指向RemoteWebDriver
测试的 URL。服务器将检测它可以从系统路径中使用的可用驱动程序。
java -jar selenium-server-standalone-3.5.3.jar standalone
2.Hub和Node节点模式
# 启动hub
java -jar selenium-server-standalone-3.5.3.jar hub
# 注册一个节点
java -jar selenium-server-standalone-3.5.3.jar node --detect-drivers true
3.分布式模式
Step1.首先,启动事件总线,它在后续步骤中充当到其他Grid组件的通信路径。
java -jar selenium-server-standalone-3.5.3.jar event-bus
Step2.启动会话映射,它负责将会话 id 映射到会话运行的节点
java -jar selenium-server-standalone-3.5.3.jar sessions
Step3.启动新的会话队列,它将新的会话请求添加到本地队列中。分发服务器从队列中接收请求。
java -jar selenium-server-standalone-3.5.3.jar sessionqueue
Step4.启动分发服务器。所有节点都作为分发进程的一部分附加。当调用创建会话请求时,它负责分配节点。
java -jar selenium-server-standalone-3.5.3.jar distributor --sessions http://localhost:5556 --sessionqueue http://localhost:5559 --bind-bus false
Step5.启动路由器,这是一个你要暴露给网络的地址
java -jar selenium-server-standalone-3.5.3.jar router --sessions http://localhost:5556 --distributor http://localhost:5553 --sessionqueue http://localhost:5559
Step6.添加一个节点
java -jar selenium-server-standalone-3.5.3.jar node --detect-drivers true
4.Docker模式
你可以通过以下命令启动一个节点:
java -jar selenium-server-standalone.3.5.3.jar node -D selenium/standalone-firefox:latest '{"browserName": "firefox"}'
你可以启动 Selenium 服务器,并将其委托给 docker 以创建新实例:
java -jar selenium-server-standalone-3.5.3.jar standalone -D selenium/standalone-firefox:latest '{"browserName": "firefox"}' --detect-drivers false
五、配置组件
1.配置帮助和概述
java -jar selenium-server-standalone-3.5.3.jar info config
2.设置安全
# 获取构建网格服务器的详细信息, 用于安全通信和节点注册.
java -jar selenium-server-standalone-3.5.3.jar info security
3.会话设置
# 默认情况下, 网格使用本地会话表来存储会话信息. 网格支持额外的存储选项, 比如Redis和JDBC-SQL支持的数据库. 要设置不同的会话存储, 请使用以下命令获取设置步骤
java -jar selenium-server-standalone-3.5.3.jar info sessionmap
4.默认情况下,启用了跟踪。要导出跟踪并通过 Jaeger 可视化它们
java -jar selenium-server-standalone-3.5.3.jar info tracing
5.列出 Selenium Grid 命令
java -jar selenium-server-standalone-3.5.3.jar --config-help
6.组件帮助命令
#Standalone
java -jar selenium-server-standalone-3.5.3.jar standalone --help
#Hub
java -jar selenium-server-standalone-3.5.3.jar hub --help
#Session
java -jar selenium-server-standalone-3.5.3.jar sessions --help
#New Session Queuer
java -jar selenium-server-standalone-3.5.3.jar sessionqueuer --help
#Distributor
java -jar selenium-server-standalone-3.5.3.jar distributor --help
#Router
java -jar selenium-server-standalone-3.5.3.jar router --help
#Node
java -jar selenium-server-standalone-3.5.3.jar node --help
六、Selenium Grid启动
1.selenium下载,本文测试环境如下:
-
hub:Mac os
-
Node:Windows 10
-
Chrome浏览器版本:91.0.4472.164(正式版本)(64 位)
-
Chrome浏览器驱动版本:91.0.4472.101
2.selenium3.5下载链接:
http://selenium-release.storage.googleapis.com/index.html?path=3.5/
3.chromedriver.exe下载链接:
http://npm.taobao.org/mirrors/chromedriver/91.0.4472.101/
4.服务器启动Hub服务
java -jar selenium-server-standalone-3.5.3.jar -role hub
3.客户端注册Node
java -jar selenium-server-standalone-3.5.3.jar -role node -port 5555 -hub http://192.168.20.31:4444/grid/register -maxSession 5 -browser browserName=chrome,seleniumProtocol=WebDriver,maxInstances=5
说明:-role node
:表示注册Node节点-port 5555
:表示注册的Node节点的端口号是5555-hub http://192.168.20.31:4444/grid/register
:表示将注册的Node节点注册到hub上,注意,hub和Node机器必须在同一局域网内-maxSession
:最大会话请求,请要用于并发执行测试脚本:表示注册的Node节点的端口号是5555-browser browserName=chrome,seleniumProtocol=WebDriver,maxInstances=5
:浏览器类型,驱动及同一版本的浏览器可以在远程系统上运行多少个实例
4.查看服务端状态
七、Selenium Grid脚本编写
1.将下载好的chromedriver.exe
放到Chrome
浏览器根目录,或者配置成环境变量
2.创建一个Maven
项目
3.pom.xml
中加入Selenium
依赖
<dependencies>
<!-- http://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-server -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.5.3</version>
</dependency>
</dependencies>
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author 作者:测试工程师成长之路
* @version 创建时间:2021/7/24
* 类说明:Selenium Grid
*/
public class SeleniumGridTest {
public static final String browserName = "chrome";
@Test
public void test() throws InterruptedException {
try {
// System.setProperty("webdriver.chrome.driver","D:\\software\\selenium\\chromedriver.exe");
DesiredCapabilities capability = new DesiredCapabilities();
capability.setBrowserName(browserName);
capability.setPlatform(Platform.WINDOWS);
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
driver.get("http://www.baidu.com");
driver.manage().window().maximize();
Thread.sleep(3000);
//输入mrjade查询
driver.findElement(By.id("kw")).sendKeys("mrjade" + Keys.ENTER);
Thread.sleep(3000);
// 点击mrjade-博客园,进入mrjade博客首页
driver.findElement(By.xpath("//*[@id=\"1\"]/h3/a")).click();
Thread.sleep(5000);
driver.close();
driver.quit();
} catch (
MalformedURLException e) {
e.printStackTrace();
}
}
}
八、后续
我们经过测试发现,运行此代码后会随机在某个Node上面运行测试用例,也就是打开浏览器等一系列操作,因为我们是要做分布式测试或者说是兼容性测试,我们在运行测试脚本的时候如何同时让所有Node都运行测试用例呢?请期待下次分享。
最后为方便大家学习测试,特意给大家准备了一份13G的超实用干货学习资源,涉及的内容非常全面。
包括,软件学习路线图,50多天的上课视频、16个突击实战项目,80余个软件测试用软件,37份测试文档,70个软件测试相关问题,40篇测试经验级文章,上千份测试真题分享,还有2021软件测试面试宝典,还有软件测试求职的各类精选简历,希望对大家有所帮助……
关注我公众号:【程序员小濠】即可获取这份资料了!
如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入我们的群:175317069 大家一起讨论交流,里面也有各种软件测试资料和技术交流。
好文推荐
5年经验之谈:月薪3000到30000,测试工程师的变“行”记!
测试工程师,自动化测试工程师,测试开发工程师,这三个岗位分别需要掌握哪些能力和技术栈?
不要让毒鸡汤毁了你,35岁的测试员没有那么可怕,保持专注更重要
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。