web自动化测试——跨平台设备管理方案Selenium Grid

news2024/9/21 2:42:41

跨平台设备管理方案Selenium Grid

  • 一、Selenium Grid简介
  • 二、使用场景
    • 场景一: 实现分布式执行测试,提高执行效率
    • 场景二: 解决浏览器兼容性问题
    • 新特性
  • 三、Selenium Grid4原理分析
  • 四、环境安装
  • 五、运行方式:单机运行 - 独立模式
    • 1. 命令行启动 server
    • 2. java -jar 启动对应的 jar 包
    • 3. 查看 UI 界面 > 浏览器输入网址查看 UI 界面:UI 链接
    • 4. 代码运行
      • a、运行步骤
      • b、SeleniumGrid 创建一个本地的 session,然后再打开浏览器运行测试用例:
    • 5. 单浏览器运行代码
    • 6、多浏览器运行代码
  • 六、单机运行 - 经典网格模式
    • 1. 命令行启动hub
    • 2. 命令行启动node
      • a. 同一机器上启动 node
      • b. 再次查看状态的 UI 界面:
      • c. 代码运行
  • 七、多系统运行 - 分发模式(待补充)
    • 1. 不同机器上启动 node

一、Selenium Grid简介

Selenium Grid 是 Selenium 的三大组件之一,它可以在多台机器上并行运行测试,集中管理不同的浏览器版本和浏览器配置。通过将客户端命令发送到远程浏览器的实例, Selenium Grid 允许在远程计算机 (虚拟或真实) 上执行 WebDriver 脚本. 它旨在提供一种在多台计算机上并行运行测试的简便方法。

官方文档:https://www.selenium.dev/

二、使用场景

场景一: 实现分布式执行测试,提高执行效率

比如:我们有 1000 条用例执行,如果在本机执行,一条用例耗时 100 秒,执行完成则需要大约 27 小时 1000*100/60/60=27个小时。如果让这些用例并发执行,比如分配 6 台计算机,每个计算机执行 1000/6 大约 166 条用例,那时间大约节省了 6 倍,原来需要大约 27 个小时,现在可能只需要 4.5 个小时左右就基本完成了, 分布式并发执行可以让我们用例的执行总时长指数级的缩小,从而效率得到很大的提升。

场景二: 解决浏览器兼容性问题

比如还是 1000 条用例,需要分别在 Chrome、Firefox、Edge、Safari 这些浏览器上都执行一遍,保证每个浏览器上都能正常执行,测试浏览器的兼容性。这时也可以使用 Selenium Grid,通过 Selenium Grid 将这些请求分发到不同的系统、不同浏览器中执行。这些浏览器可以分别布署在不同的计算机中比如可以布署在 Linux 、Windows、Mac 上都可以,作为它的 Node 结点,从而解决兼容性测试的问题

新特性

Selenium Grid 4 是一个全新的工具,它能够支持完全分布式的测试。Selenium Grid4 也兼容了之前 Selenium Grid3 的工作模式,在 Selenium Grid3 的基础上又添加了一些新的通讯方式,使它通讯速度更快。另外现在很多公司都支持容器化部署,Selenium Grid 4 也提供了的 Docker 支持。相比 Selenium Grid 3,Selenium Grid 4 更容易在虚拟机上使用。

Selenium Grid4 有三个新特性
特性一:Hub 和 Node 使用同一个 jar 服务。
特性二:架构优化,在 Selenium Grid 4 版本的全新架构中划分成了组件:Router、Distributor、Node、Session Map、Session Queue、Event Bus。
特性三:支持不同的运行模式,Selenium 4 支持三种网格类型,包括 Standalone Mode 独立模式、Classical Grid 经典网格模式、Fully Distributed 完全分布式

三、Selenium Grid4原理分析

在这里插入图片描述
从图中可以看到 Selenium Grid 包括六大组件,分别是:

Router 路由器
Distributor 分发服务器
Session Map 会话映射
Node 测试节点
New Session Queue 新的会话队列
Event Bus 事件总线

下面分别说一下这六个组件所负责的职责:
Router 路由器:Router 是所有组件的入口,所有向服务器发送的外部请求第一个会经常 Router 组件。
Distributor 分发服务器:它有两个主要的功能,第一个功能,注册并跟踪所有 Node 节点,第二个功能就是查询新会话队列并处理挂起的新会话请求。当一个新的请求到达 Router 时,它会被转发到 New Session Queue,在队列中等待。分发服务器会轮询新会话队列查找挂起的新会话请求,为这个请求找到匹配的节点之后,会创建一个新的会话,这个会话的 ID 以及 URI 会存储在 Session Map 中。
Session Map 会话映射:它是一个数据存储区,它存储了会话 ID 与对应的会话结点的关系,在 Router 转发请求到对应的结点时,要先在 Session Map 中查看对应的关系,再进行请求。
Node 测试节点:结点有多个,每个结点管理多个可用的浏览器的插槽,结点只负责执行命令,不需要做出其它的判断。这个 Node 可以配置在 Windows、Mac、Linux 等任何系统上。
New Session Queue 新的会话队列:从 Router 发过来的请求,它会先放到这个队列中, 等待被分发服务器分发出去,这个队列有一些特殊的功能,它能够定期的检查会话是否超时,如果超时,请求将被拒绝并立即删除。这里可以配置一些参数来处理超时时长等参数。
Event Bus 事件总线:充当了节点、分发服务器、新会话队列和会话映射之间的通信路径,使用了 socket 通信。在完全分布式模式下启动 selenium grid 时,事件总线会是第一个被启动起来的组件。

四、环境安装

Java11 及以上版本。
下载被测试的浏览器(Chrome/Firefox/Edge/Safari 等)。
配置环境变量,将对应的 driver 提前下载下来配置到环境变量中。或者将下载的 driver 放在与 selenium server 的 jar 包同级目录下也可以。
Selenium Server 下载,建议使用 4.4.0 版本。

五、运行方式:单机运行 - 独立模式

1. 命令行启动 server

在这里插入图片描述

2. java -jar 启动对应的 jar 包

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

java -jar selenium-server-4.9.0.jar standalone

启动成功后,对应命令行显示:Started Selenium Standalone …,如图

在这里插入图片描述

3. 查看 UI 界面 > 浏览器输入网址查看 UI 界面:UI 链接

在这里插入图片描述

4. 代码运行

直接运行代码,发现在本地运行单线程,只不过通过 Selenium Grid 来转发请求。

a、运行步骤

SeleniumGrid 会创建一个 Queue 队列,里面包含了启动的参数代码

Capabilities:

{
  "acceptInsecureCerts": false,
  "browserName": "chrome",
  "browserVersion": "110.0.5481.178",
  "chrome": {
    "chromedriverVersion": "110.0.5481.30 (aedb656755c469651f01505a4f15e153fc606a1e-refs/branch-heads/5481@{#191})",
    "userDataDir": "C:\\Users\\Lenovo\\AppData\\Local\\Temp\\scoped_dir39460_2141646508"
  },
  "goog:chromeOptions": {
    "debuggerAddress": "localhost:58868"
  },
  "networkConnectionEnabled": false,
  "pageLoadStrategy": "normal",
  "platformName": "Windows 10",
  "proxy": {},
  "se:bidiEnabled": false,
  "se:cdp": "ws://192.168.22.1:4444/session/233f82cf555e0511765e5dc868cb1a84/se/cdp",
  "se:cdpVersion": "110.0.5481.178",
  "setWindowRect": true,
  "strictFileInteractability": false,
  "timeouts": {
    "implicit": 0,
    "pageLoad": 300000,
    "script": 30000
  },
  "unhandledPromptBehavior": "dismiss and notify",
  "webauthn:extension:credBlob": true,
  "webauthn:extension:largeBlob": true,
  "webauthn:virtualAuthenticators": true
}

在这里插入图片描述

b、SeleniumGrid 创建一个本地的 session,然后再打开浏览器运行测试用例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/5/14 15:08
# @Author  : 杜兰特
# @File    : test_grid.py
from selenium.webdriver import DesiredCapabilities
from selenium.webdriver import Remote

class TestGrid:

    def test_grid(self):
        hub_url='http://127.0.0.1:4444/wd/hub'
        capability=DesiredCapabilities.CHROME.copy()
        for i in range(1,5):
            driver=Remote(command_executor=hub_url,desired_capabilities=capability)
            driver.get("http://www.baidu.com")

在这里插入图片描述

5. 单浏览器运行代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/5/14 15:08
# @Author  : 杜兰特
# @File    : test_grid.py

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By

class TestSingleNode:
    def setup_method(self):
        # 创建Options ,新版本DesireCapability已弃用
        options = webdriver.ChromeOptions()
        # 通过URL和options 创建一个远程的连接
        # client 发送请求,要发送给selenium grid hub 结点, hub 结点会将请求分发到对应的node

        self.driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4444/wd/hub',
            options=options
        )

    def test_singlenode1(self):
        # 打开 baidu 页
        self.driver.get("http://www.baidu.com")
        # 向输入框中输入
        self.driver.find_element(By.ID, 'kw').send_keys("firefox")
        # 点击搜索框
        self.driver.find_element(By.ID, 'su').click()
        # 等待一秒
        sleep(1)
        # 断言输入内容在页面中
        assert "firefox" in self.driver.page_source

    def teardown_method(self):
        self.driver.quit()

6、多浏览器运行代码

创建测试文件 test_multi_node.py 示例代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/5/14 16:25
# @Author  : 杜兰特
# @File    : test_multi_node.py

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By


class TestMultiNode:
    def setup_method(self):
        options = webdriver.ChromeOptions()
        self.driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4444/wd/hub',
            options=options
        )

    def test_multinode1(self):
        # 打开 baidu 页
        self.driver.get("http://www.baidu.com")
        # 向输入框中输入
        self.driver.find_element(By.ID, 'kw').send_keys("selenium")
        # 点击搜索框
        self.driver.find_element(By.ID, 'su').click()
        # 等待一秒
        sleep(1)
        # 断言输入内容在页面中
        assert "selenium" in self.driver.page_source

    def test_multinode2(self):
        # 打开 baidu 页
        self.driver.get("http://www.baidu.com")
        # 向输入框中输入
        self.driver.find_element(By.ID, 'kw').send_keys("appium")
        # 点击搜索框
        self.driver.find_element(By.ID, 'su').click()
        # 等待一秒
        sleep(1)
        # 断言输入内容在页面中
        assert "appium" in self.driver.page_source

    def test_multinode3(self):
        # 打开 baidu 页
        self.driver.get("http://www.baidu.com")
        # 向输入框中输入
        self.driver.find_element(By.ID, 'kw').send_keys("pytest")
        # 点击搜索框
        self.driver.find_element(By.ID, 'su').click()
        # 等待一秒
        sleep(1)
        # 断言输入内容在页面中
        assert "pytest" in self.driver.page_source

    def test_multinode4(self):
        # 打开 baidu 页
        self.driver.get("http://www.baidu.com")
        # 向输入框中输入
        self.driver.find_element(By.ID, 'kw').send_keys("requests")
        # 点击搜索框
        self.driver.find_element(By.ID, 'su').click()
        # 等待一秒
        sleep(1)
        # 断言输入内容在页面中
        assert "requests" in self.driver.page_source

    def test_multinode5(self):
        # 打开 baidu 页
        self.driver.get("http://www.baidu.com")
        # 向输入框中输入
        self.driver.find_element(By.ID, 'kw').send_keys("java")
        # 点击搜索框
        self.driver.find_element(By.ID, 'su').click()
        # 等待一秒
        sleep(1)
        # 断言输入内容在页面中
        assert "java" in self.driver.page_source

    def teardown_method(self):
        self.driver.quit()

为了模拟多浏览器并发运行,使用 pytest 的插件 pytest-xdist 实现分布式并发执行方式,提前安装 pytest-xdist 插件,然后使用命令执行用例。打开命令提示行或者终端,使用cd 命令进入到文件所在路径,然后执行 pytest test_multi_node.py -n 3 --alluredir ./results命令。执行完用例之后,会把测试报告结果统一汇总到results 目录中。

在这里插入图片描述

六、单机运行 - 经典网格模式

1. 命令行启动hub

a、命令行 cd 到当前下载 jar 包的路径下

b、java -jar 以 Hub 启动对应的 jar 包

java -jar selenium-server-<version>.jar hub

java -jar selenium-server-4.9.0.jar hub

在这里插入图片描述
此时,启动了 Router,Distributor,Session Map,New Session Queue,Event Bus;虽然,已经有了对应集线器,但是还没有 node 节点注册进来。
如果不把节点 Node 注册进来,对应的集线器无法知道哪个物理机器可以被分发请求,对应的 Router 就无法把测试用例进行分发。

在这里插入图片描述

2. 命令行启动node

a. 同一机器上启动 node

java -jar selenium-server-<version>.jar node --detect-drivers true

java -jar selenium-server-4.9.0.jar node --detect-drivers true

在这里插入图片描述

此时 node 节点创建成功,并且 hub 上注册对应 node 节点

在这里插入图片描述

健康检测就是每隔 2 分钟会 ping 一下对应 URL 看看是否可以 ping 成功,对应是否处于活动状态

b. 再次查看状态的 UI 界面:

在这里插入图片描述

c. 代码运行

直接运行代码,发现在本地运行单线程,只不过通过 Selenium Grid 来转发请求。

七、多系统运行 - 分发模式(待补充)

在经典网格模式等基础上再在其他机器上启动一个 node 角色。

1. 不同机器上启动 node

不同机器上启动 node:java -jar selenium-server-<version>.jar node --detect-drivers true --publish-events tcp://<ip> --subscribe-events tcp://<ip>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1122916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud之OpenFeign调用解读

目录 基本介绍 引进 OpenFeign概述 OpenFeign作用 FeignClient EnableFeignClients Java代码实战 实战架构 父工程pom文件 teacher-service服务 student-service服务 测试 自定义配置 基本介绍 引进 如果我们利用RestTemplate发起远程调用的代码时会存在一些…

docker部署nginx并设置挂载

前言&#xff1a; 最近在学习docker和nginx&#xff0c;因为容器在运行过程中&#xff0c;相关的配置文件及日志都会存在容器内。对容器以来较高&#xff0c;当容器不存在的时候。所有的文件也就都没有了。并且当需要查看日志&#xff0c;修改配置文件的时候必须进入到容器内部…

JavaWeb配置Servle

在Java Web开发中&#xff0c;数据流主要遵循以下流程&#xff1a; 用户在浏览器中输入URL或点击链接&#xff0c;发送HTTP请求到服务器。服务器接收到请求后&#xff0c;根据请求的URL找到对应的Servlet。Servlet处理请求&#xff0c;可能需要查询数据库或执行其他业务逻辑。…

Docker笔记-docker搭建nginx及移植

从官网找到对应的镜像&#xff1a; ​​​​​​https://hub.docker.com/_/nginx/tags 查看镜像 docker images 运行容器&#xff0c;然后将配置文件等拷贝到主机上&#xff1a; docker run --name nginx -d nginx 拷贝路径&#xff1a; docker cp nginx:/etc/nginx/nginx…

[SQL开发笔记]SELECT 语句:读取数据表的信息

一、功能描述&#xff1a; 用于从数据库中读取数据 二、SELECT语法详解&#xff1a; 1&#xff09;查询整个表的信息&#xff1a; SELECT * FROM table_name; 2&#xff09;查询表中的字段或多个字段&#xff1a; SELECT column1, column2, ...FROM table_name; 参数说明…

面试中被问到:Netty中的零拷贝机制是怎么样的?

零拷贝(Zero-copy), CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时&#xff0c;不需要将文件内容拷贝到用户空间&#xff08;User Space&#xff09;而直接在内核空间&#xff08;Kernel Space&#xff09;中传输到网络的方式。Zero Copy的模…

雪数据同化系统Snow Data Assimilation System数据集

雪数据同化系统&#xff08;SNODAS&#xff09; 雪资料同化系统&#xff08;SNODAS&#xff09;是国家水文遥感业务中心&#xff08;NOHRSC&#xff09;精心开发的综合建模和资料同化系统。其主要目标是提供高度准确的积雪和相关参数估计&#xff0c;作为水文建模和分析的重要…

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-BiLSTM数据…

【RocketMQ】RocketMQ 5.0新特性(三)- Controller模式

在RocketMQ 5.0以前&#xff0c;有两种集群部署模式&#xff0c;分别为主从模式&#xff08;Master-Slave模式&#xff09;和Dledger模式。 主从模式 主从模式中分为Master和Slave两个角色&#xff0c;集群中可以有多个Master节点&#xff0c;一个Master节点可以有多个Slave节…

优雅的用户体验:微信小程序中的多步骤表单引导

前言 在微信小程序中&#xff0c;实现一个多步骤表单引导界面既可以提供清晰的任务指引&#xff0c;又可以增加用户体验的互动性。本文将探讨如何使用微信小程序的特性&#xff0c;构建一个流程引导界面&#xff0c;帮助用户一步步完成复杂任务。我们将从设计布局和样式开始&am…

彻底弄懂base64的编码与解码原理

背景 base64的编码原理网上讲解较多&#xff0c;但解码原理讲解较少&#xff0c;并且没有对其中的内部实现原理进行剖析。想要彻底了解base64的编码与解码原理&#xff0c;请耐心看完此文&#xff0c;你一定会有所收获。 涉及算法与逻辑运算概念 在探究base64编码原理和解码…

macrodata数据集在Python统计建模和计量经济学中的应用

目录 一、数据介绍二、应用三、statsmodels 统计模块四、使用 statsmodels 统计模块分析 macrodata.csv 数据集参考 一、数据介绍 macrodata.csv是一个示例数据集&#xff0c;通常用于统计分析和计量经济学中的教育和训练目的。这个数据集通常包括以下列&#xff1a; year&am…

17.3 实现无管道反向CMD

WSASocket无管道反向CMD&#xff0c;与无管道正向CMD相反&#xff0c;这种方式是在远程主机上创建一个TCP套接字&#xff0c;并绑定到一个本地地址和端口上。然后在本地主机上&#xff0c;使用WSASocket函数连接到远程主机的套接字&#xff0c;并将标准输入、输出和错误输出重定…

深入 Meven:构建杰出的软件项目的完美工具

掌握 Meven&#xff1a;构建更强大、更智能的应用程序的秘诀 Maven1.1 初识Maven1.1.1 什么是Maven1.1.2 Maven的作用 02. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Maven仓库2.4 Maven安装2.4.1 下载2.4.2 安装步骤 03. IDEA集成Maven3.1 配置Maven环境3.1.1 当前工程设置3.1.…

JDBC相关记录

JDBC&#xff1a;Java DadaBase Connectivity 即Java语言连接数据库。 本质&#xff1a;JDBC是SUN公司制定的一套接口&#xff08;interface&#xff09;。 作用&#xff1a;不同的数据库有自己独特设计原理&#xff0c;JDBC的可以让Java程序员关注业务本身&#xff0c;而不需要…

Programming abstractions in C阅读笔记:p181-p183

《Programming Abstractions In C》学习第61天&#xff0c;p181-p183总结。 一、技术总结 1.linear search algorithm 2.lexicographic order(字典顺序) 3.binary search algorithm(二分查找算法) /** 1.二分查找也应用了递归的思想。* 2.这里的代码只是demo*/ #include &…

17.2 实现无管道正向CMD

WSASocket 无管道正向CMD&#xff0c;使用WSASocket函数创建一个TCP套接字&#xff0c;并绑定到一个本地地址和端口上。然后使用CreateProcess函数创建一个新的CMD进程&#xff0c;并将标准输入、输出和错误输出重定向到套接字的句柄上。这样&#xff0c;客户端可以通过网络连接…

应用开发平台集成工作流系列之16——办理意见设计与实现

背景 流程任务流转过程中&#xff0c;各环节的处理&#xff0c;会填写处理意见。 Camunda自带了相关的功能&#xff0c;但功能过于简陋&#xff0c;问题较多&#xff0c;今天来说说这一块。 自带功能的问题 如使用Camunda官方自身的办理意见相关功能&#xff0c;会遇到两个问…

【C++进阶(九)】C++多态深度剖析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 多态 1. 前言2. 多态的概念以及定义3. 多态的实…

Generator异步解决方案详解

一&#xff1a;三种常见的异步解决方案 Promise&#xff1a;链式编程async&#xff1a;使用 async 去修饰函数&#xff0c;然后使用 await 去等待成功Generator&#xff1a;使用 * 修饰函数&#xff0c;然后使用 yield 去等待成功 通俗来讲&#xff0c;Generator 类似于 Promi…