0%

Selenium4学习笔记:Grid篇

Grid

Grid 允许我们在多台远程计算机上进行跨平台、跨浏览器、并行测试。

准备

Grid 以 jar 包的形式提供,可以在 Selenium 下载页下载最新版本。

下载将得到一个名为 selenium-server-x.x.x.jar 的 jar 包。

按角色运行

Grid 包括很多组件:

  • Router(路由)
  • Session Queue(会话队列)
  • Session Map(会话表)
  • Distributor(分发器)
  • Event Bus(事件总线)
  • Nodes(节点)

我们可以独立启动任一组件,但是通常会启动一组组件,使 Grid 工作在相应模式下。

Standalone

独立模式,Grid 最简单的模式,会启动所有组件,使当前主机成为一台可独立执行测试的远程计算机。

命令行直接执行 Java 命令即可启动:

1
java -jar selenium-server-<version>.jar standalone

当看到输出信息“Started Selenium Standalone…”即说明启动成功。

默认情况下,将监听 4444 端口,通过该端口即可远程调用。

【关于驱动探测】

启动时可能会看到“No drivers have been configured or have been found on PATH”错误。

这是因为 Selenium 必须通过驱动才可操作浏览器,所以驱动需要事先配置。

按错误提示,驱动放在 PATH 下可自动探测到。另试验可知,放在 selenium-server-x.x.x.jar 同一文件夹下也可被探测到。

【关于浏览器】

探测到驱动程序后,就会自动添加驱动对应的浏览器。

如果只有 chromedriver,通常添加 Chrome 的同时,也会添加 MicrosoftEdge。但是,尝试用 chromedriver 驱动 MicrosoftEdge 通常会失败。所以,应严格根据浏览器版本配置驱动。

远程调用脚本如下:

1
2
3
4
5
driver_options = webdriver.ChromeOptions()
driver_options.set_capability("browserName", "chrome")
driver_options.set_capability("browserVersion", "100")
driver = webdriver.Remote('http://localhost:4444',
options=driver_options)

Selenium Server 根据设置的 browserNamebrowserVersion 能力属性启动对应的浏览器,browserName 是必须的,browserVersion 可选。如果没有能力匹配的浏览器,则会报错。

【关于能力属性】

对于 Standalone 模式服务而言,指定 browserName 一般就足够了——通常一台服务器上某种浏览器只有一个版本。

而且,通常也不需要通过 options.set_capability() 来设置,创建不同类型的 Options 时,会“内置”对应的 browserName

Hub & Nodes

经典的“集线器 + 节点”模式。可以在不同远程主机上分别部署集线器和多个节点。适合中小型规模测试。

1
2
3
4
# 启动集线器
java -jar selenium-server-<version>.jar hub
# 启动节点
java -jar selenium-server-<version>.jar node --hub http://host:4444

hub 角色会启动除 Nodes 外所有组件,而相反,node 角色只启动 Nodes 组件。

RemoteDriver 连接集线器服务即可。

分布式

大型分布式部署,各个组件分别单独启动,适合大型测试。

由于组件之间的依赖关系,需要按一定的顺序启动各组件。

1
2
3
4
5
6
7
8
9
10
11
12
# 启动 Event Bus(事件总线)
java -jar selenium-server-<version>.jar event-bus
# 启动 Session Map(会话表)
java -jar selenium-server-<version>.jar sessions
# 启动 Session Queue(会话队列)
java -jar selenium-server-<version>.jar sessionqueue
# 启动 Distributor(分发器)
java -jar selenium-server-<version>.jar distributor --sessions http://localhost:5556 --sessionqueue http://localhost:5559 --bind-bus false
# 启动 Router(路由)
java -jar selenium-server-<version>.jar router --sessions http://localhost:5556 --distributor http://localhost:5553 --sessionqueue http://localhost:5559
# 启动节点
java -jar selenium-server-<version>.jar node

注意,RemoteDriver 连接的是路由服务。

参考

Selenium 文档 - 服务网格的组件:介绍各种 Selenium Server 组件的概念

Selenium 文档 - 分布式部署:介绍 Selenium Server 分布部署步骤