Selenium Grid: 将客户端发送的命令转发到远程浏览器上执行 WebDriver 脚本。

简介

Selenium Grid 是由一个 hub 服务和若干个 node 代理节点组成。

Hub 调度服务,管理各个代理节点的注册信息和状态信息,并且接收来自客户端代码的调用请求,把请求的命令转发给代理节点执行。

Node 代理节点,相当于一台可以运行浏览器自动化测试的机器,根据 hub 的命令执行脚本。

  • 支持在多台机器上并行测试
  • 支持在不同的浏览器版本上进行测试
  • 支持跨平台测试

执行流程

  1. 运行代码初始化 driver 时,配置远程浏览器为 hub 服务 + 端口;
  2. 服务端收到代码请求后转为执行命令,分发给不同的 node(浏览器);
  3. node 根据收到的命令执行测试;
  4. 测试完成后返回结果给 hub
  5. hub 收集结果返回给客户端。

搭建

整套环境搭建可以通过两种方式:

  • *.jar(太麻烦且不易维护)
  • docker(官方镜像支持,即插即用)

Docker 简单好用,由于要启动多个服务,这里使用工具 docker-compose 进行部署。

1. 编写配置文件

新建目录下创建配置文件 compose.yml,用来定义初始化容器的配置。

# ref: https://github.com/SeleniumHQ/docker-selenium
version: "3"
services:chrome:image: selenium/node-chrome:4.6.0-20221104shm_size: 2gb  # 设置共享内存,官方建议值,避免浏览器引起容器崩溃depends_on:    # 设置依赖关系- selenium-hubenvironment:- SE_EVENT_BUS_HOST=selenium-hub- SE_EVENT_BUS_PUBLISH_PORT=4442- SE_EVENT_BUS_SUBSCRIBE_PORT=4443firefox:image: selenium/node-firefox:4.6.0-20221104shm_size: 2gbdepends_on:- selenium-hubenvironment:- SE_EVENT_BUS_HOST=selenium-hub- SE_EVENT_BUS_PUBLISH_PORT=4442- SE_EVENT_BUS_SUBSCRIBE_PORT=4443selenium-hub:image: selenium/hub:4.6.0-20221104container_name: selenium-hubports:- "4442:4442"- "4443:4443"- "4444:4444"
2. 启动服务
# 进入配置文件所在的目录下
# 该目录下尽量别放其他东西,影响启动性能
$ cd seleniumgrid# -d 后台启动
$ docker-compose up -d
Creating network "seleniumgrid-compose_default" with the default driver
Creating selenium-hub ... done
Creating seleniumgrid-compose_firefox_1  ... done
Creating seleniumgrid-compose_chrome_1 ... done

根据日志可以看到,首先创建桥接网络,每个容器都会自动加入该网络中,便于服务间互相通信;然后再启动 Hub 容器,根据依赖关系,继续启动节点容器。

同一服务配置,支持启动多个容器节点。注意:如果要启动多节点的话,配置文件内不要定义容器端口号,避免冲突。

# 启动多节点
$ docker-compose up -d --scale chrome=2 --scale firefox=2
Creating selenium-hub ... done
Creating seleniumgrid-compose_firefox_1 ... done
Creating seleniumgrid-compose_firefox_2 ... done
Creating seleniumgrid-compose_chrome_1  ... done
Creating seleniumgrid-compose_chrome_2  ... done# 停止并删除容器&网络
# stop 指令仅停止不删除
$ docker-compose down
3. 验证

访问服务端: http://localhost:4444,可以看到启动的节点信息,即为成功。

运行

编写测试脚本,在远程节点上运行。

import pytest
from time import sleep
from selenium import webdriver"""
初始化 chrome | firefox driver
"""
@pytest.fixture(scope='session')
def driver():options = webdriver.ChromeOptions()driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub',options=options)yield driverdriver.quit()@pytest.fixture(scope='session')
def firefox_driver():firefox_options = webdriver.FirefoxOptions()driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub',options=firefox_options)yield driverdriver.quit()"""
测试执行:2 条用谷歌浏览器,2 条用火狐浏览器
测试用例:访问百度首页,在页面停止一秒。
"""
URL = "https://baidu.com"
TITLE = "百度一下,你就知道"def test_chrome(driver):driver.get(URL)sleep(1)assert driver.title == TITLEdef test_chrome2(driver):driver.get(URL)sleep(1)assert driver.title == TITLEdef test_firefox(firefox_driver):firefox_driver.get(URL)sleep(1)assert firefox_driver.title == TITLEdef test_firefox2(firefox_driver):firefox_driver.get(URL)sleep(1)assert firefox_driver.title == TITLE

用例运行完成后,观察 hub 界面展示,会看到节点运行状态与 session 信息。 由于是单线程运行,所以会有两个闲置节点。

单线程运行测试用例
hello.py::test_chrome
hello.py::test_chrome2
hello.py::test_firefox
hello.py::test_firefox2
===== 4 passed in 143.25s =====
并发执行测试用例
# 两节点并发
$ pytest hello.py -n 2 -vs
...
[gw1] PASSED hello.py::test_chrome2
[gw0] PASSED hello.py::test_chrome
[gw1] PASSED hello.py::test_firefox2
[gw0] PASSED hello.py::test_firefox
===== 4 passed in 42.20s =====# 四节点并发
$ pytest hello.py -n 4 -vs
...
[gw1] PASSED hello.py::test_chrome2
[gw0] PASSED hello.py::test_chrome
[gw3] PASSED hello.py::test_firefox2
[gw2] PASSED hello.py::test_firefox
===== 4 passed in 27.21s =====

根据运行时间,可以看到,并发测试会明显缩短耗时。实际项目中,需注意规避用例间的依赖问题。

Debugging

浏览器运行在容器内,本地看不到用例执行过程。为方便调试,代理节点允许用户查看容器内浏览器的执行过程。

实现此功能需要将浏览器端口暴露出来,注意主机端口号不要重复,可以按序增加。

比如:

  • Chrome : port=7900
  • Firefox: port=7901

compose.yml 内增加端口号,修改后重新启动服务。

# VNC Viewer
version: "2"
services:chrome:image: selenium/node-chrome:4.6.0-20221104shm_size: 2gb  # 设置共享内存,官方建议值,避免浏览器引起容器崩溃depends_on:  # 设置依赖关系- selenium-hubenvironment:- SE_EVENT_BUS_HOST=selenium-hub- SE_EVENT_BUS_PUBLISH_PORT=4442- SE_EVENT_BUS_SUBSCRIBE_PORT=4443- SE_VNC_NO_PASSWORD=1  # 取消 VNC 密码,默认密码 secretports:- "5900:5900"  # VNC Server- "7900:7900"  # noVNC Web firefox:image: selenium/node-firefox:4.6.0-20221104shm_size: 2gbdepends_on:- selenium-hubenvironment:- SE_EVENT_BUS_HOST=selenium-hub- SE_EVENT_BUS_PUBLISH_PORT=4442- SE_EVENT_BUS_SUBSCRIBE_PORT=4443ports:- "5901:5900"- "7901:7900"selenium-hub:image: selenium/hub:4.6.0-20221104container_name: selenium-hubports:- "4442:4442"- "4443:4443"- "4444:4444"
方式一:VNC Viewer Client

该项目使用 x11vnc 作为 VNC 服务器,通过 VNC Viewer 客户端建立连接后,可实时查看容器内运行情况。

  • 新建连接 Command+N
  • VNC Server: IP/Host:Port
  • Name: 自定义

如果未添加无需密码的配置项,则需要输入默认密码 secret 后建立连接。

方式二:noVNC Web

基于 noVNC 可以直接在本机浏览器上查看容器内的运行情况,无需安装客户端。

访问配置的端口服务即可:

  • Chrome: http://localhost:7900
  • Firefox: http://localhost:7901

【Selenium】Selenium4 Grid相关推荐

  1. 【Selenium】控制当前已经打开的 chrome浏览器窗口

    前言 有过几个小伙伴问过我如何利用 Selenium 获取已经打开的浏览器窗口,这里给安排了,还安排了两篇. 标题 链接 [Selenium]控制当前已经打开的 chrome浏览器窗口 https:/ ...

  2. 【Selenium】Selenium绕过检测 隐藏特征

    前言 一文给你介绍的清清楚楚, 伪装Selenium特征的N种方式✨✨ 在使用 Selenium 访问某些网站时候,会不成功.像很多url中带gov 字眼的,往往都无法正常打开. 因为网站检测到了 我 ...

  3. 【Selenium】控制当前已经打开的 chrome浏览器窗口(高级版)

    前言 利用 Selenium 获取已经打开的浏览器窗口,全python操作 标题 链接 [Selenium]控制当前已经打开的 chrome浏览器窗口 https://blog.csdn.net/we ...

  4. 【CSS】栅格(Grid)布局

    [CSS]栅格(Grid)布局 文章目录 [CSS]栅格(Grid)布局 声明栅格 划分行列 一个

  5. Web自动化【selenium】基础知识

    selenium自动化基础知识点 目录 selenium自动化基础知识点 一.Selenium是什么? 二.使用步骤 1.引入库 2.下载对应的浏览器驱动 3.基本使用 三.元素定位 1.特点 2.八 ...

  6. 【转】-【Python】- 【selenium】 -selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())

    -- 学习Python自动化测试的菜鸡,现在是selenium库webdriver的学习时间 [问题] 在获取页面元素的文本的时候,总是获取不到,或者显示为空: [分析] 页面加载不完全: [解决措施 ...

  7. 【Python】【selenium】如何自动翻译并获得页面内容

    [背景] 想把一些国外网站的内容批量获取后翻译成中文,存在两种实现方式: 是用爬虫批量爬取进dataframe后导出成excel,然后对excel进行翻译. 直接在具备翻译插件的网页,比如QQ浏览器上 ...

  8. 【selenium】 selenium web测试工具介绍(一)

    从什么开始呢,就介绍一下最近接触到的一个强大的开源前端测试工具吧-- selenium-- 网上有很多关于这个工具的介绍,但是感觉主要还是关于这个工具的安装和官方文档的衍生品,实际的介绍好像很少-- ...

  9. 【Selenium】驱动chrome以手机模拟器方式打开wap页面

    需求天天有,看你行不行...... 需求: 通过Chrome浏览器进行移动端wap页面调试,希望自动化打开的时候也是呈现手机样式. 通过启用Chrome DevTools中的移动仿真功能,Chrome ...

最新文章

  1. PostgreSQL 业务数据质量 实时监控 实践
  2. VTK:Qt之ShowEvent
  3. 游戏市场阴影下的手游厂商,和他们无法触碰的未来
  4. 智宇科技 ZYARJX-1机械臂智能小车 —— 手机端蓝牙控制程序
  5. 自定义 Git - Git 钩子 (自动部署)
  6. LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?(前缀和)
  7. python numpy逆_Python使用numpy计算矩阵特征值、特征向量与逆矩阵
  8. linux生成一个list文件,Linux 获取文件名称生成列表 txt - create_filelist
  9. 程序员:站在自学鄙视链顶端的王者(太真实!)
  10. Vs2010工具栏显示“开始执行“按钮
  11. 一台主机接两个显示器并独立使用_一台电脑如何满足多人同时使用?试试这招!...
  12. powerBI发布到web,管理员权限设置
  13. python练习:重命名大量图片
  14. 学习笔记(27):玩转Python-Python3基础入门-案例-快递价格计算器(2)
  15. python plot_surface 画表面网格图
  16. CentOS8设置网络安装源
  17. postgres 禁止远程登录_Postgresql允许远程访问配置修改
  18. HTML中视频的压缩方式,快速将视频压缩到最小的技巧!
  19. 显卡算力排行_RTX3090 时代最新GPU选购指南:哪款显卡配得上我的炼丹炉?
  20. Android代码实现——拨打电话和发送短信APP

热门文章

  1. 魔改并封装 YoloV5 Version7 的 detect.py 成 API接口以供 python 程序使用
  2. js数组求和的方法(最高效率)
  3. 一级计算机网络应用题目操作,计算机一级有什么用 主要考什么
  4. 另一个画风的GSS1 - Can you answer these queries I(猫树)
  5. 华为云IoT亮相厦门国际物联网博览会,智简联接助力行业智能升级
  6. 体验IntelliJ IDEA的远程开发(Remote Development)
  7. CSDN 5月付费专栏销量榜Top10
  8. Spring-webflow基础讲解
  9. 中国钛产业发展现状及投资风险分析报告2022-2028年
  10. CSS position: fixed 相对于父元素定位