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

跨平台设备管理方案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 Remoteclass 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.pyfrom time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import Byclass TestSingleNode:def setup_method(self):# 创建Options ,新版本DesireCapability已弃用options = webdriver.ChromeOptions()# 通过URL和options 创建一个远程的连接# client 发送请求,要发送给selenium grid hub 结点, hub 结点会将请求分发到对应的nodeself.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_sourcedef 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.pyfrom time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import Byclass 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_sourcedef 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_sourcedef 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_sourcedef 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_sourcedef 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_sourcedef 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.mzph.cn/news/119184.shtml

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

相关文章

uni-app:引用文件的方法

绝对定位 ①import common from "/utils/common.js" ②import common from "utils/common.js" <template><view></view> </template> <script>import common from "/utils/common.js"export default {data() {ret…

HarmonyOS 音频开发指导:使用 OpenSL ES 开发音频播放功能

OpenSL ES 全称为 Open Sound Library for Embedded Systems&#xff0c;是一个嵌入式、跨平台、免费的音频处理库。为嵌入式移动多媒体设备上的应用开发者提供标准化、高性能、低延迟的 API。HarmonyOS 的 Native API 基于Khronos Group开发的OpenSL ES 1.0.1 API 规范实现&am…

uniapp--点击上传图片到oss再保存数据给后端接口

项目采用uniapp与uview2.0组件库 --1.0的也可以参考一下&#xff0c;大差不差 一、项目要求与样式图 点击上传n张图片到oss&#xff0c;然后点击提交给后端 二、思路 1、打开上传按钮&#xff0c;弹出框内出现上传图片和提交按钮 2、点击上传图片区域&#xff0c;打开本地图…

一、【Photoshop如何根据不同类型图像抠图】

文章目录 前言图形结构1、规则图形2、不规则图形 图形颜色1、轮廓清晰2、颜色分明 前言 当我们有抠图需求的时候&#xff0c;不要一开始就想着我怎么去把它抠出来&#xff0c;首先应该分析图形的特点&#xff0c;然后再去选取合适的工具&#xff0c;这样才可以做到事半功倍&am…

OpenWRT软路由web界面如何远程访问?

文章目录 1.openWRT安装cpolar2.配置远程访问地址3.固定公网地址 简单几步实现在公网环境下远程访问openWRT web 管理界面&#xff0c;使用cpolar内网穿透创建安全隧道映射openWRT web 界面面板443端口&#xff0c;无需公网IP&#xff0c;无需设置路由器。 1.openWRT安装cpola…

JSX基础语法

文章目录 认识JSX语法JSX是什么为什么Rect选择了JSXJSX书写规范JSX注释编写 JSX的基本使用JSX的事件绑定this绑定问题参数传递问题 JSX的条件渲染常见的条件渲染方式 JSX的列表渲染JSX的原理和本质JSX的本质虚拟DOM的创建过程 案例练习 认识JSX语法 // 1. 定义根组件 const el…

RK3568-适配at24c04模块

将at24c04模块连接到开发板i2c2总线上 i2ctool查看i2c2总线上都有哪些设备 UU表示设备地址的从设备被驱动占用,卸载对应的驱动后,UU就会变成从设备地址。at24c04模块设备地址 0x50和0x51是at24c04模块i2c芯片的设备地址。这个从芯片手册上也可以得知。A0 A1 A2表示的是模块对…

基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理(matlab代码)

目录 1 主要内容 主从博弈模型 基于元模型的均衡算法流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《基于元模型优化算法的主从博弈多虚拟电厂动态定价和能量管理》模型&#xff0c;建立运营商和多虚拟电厂的一主多从博弈模型&#xff0c;研究运营商动态…

如何租用香港写字楼,需要注意哪些事项

1. 确定您的所需 你需要多少空间 在一切开始之前&#xff0c;您需要确切地知道您的业务(即您、您现有的员工和预计的招聘、您的访客或客户以及您想要的设施如食品储藏室、接待处、服务器机房甚至健身房&#xff0c;婴儿护理室等)&#xff0c;以实用面积计算需要多少空间。空间…

线性代数1:线性方程和系统

Digital Collection (staedelmuseum.de) 图片来自施泰德博物馆 一、前言 通过这些文章&#xff0c;我希望巩固我对这些基本概念的理解&#xff0c;同时如果可能的话&#xff0c;通过我希望成为一种基于直觉的数学学习方法为其他人提供额外的清晰度。如果有任何错误或机会需要我…

出差学小白知识No5:|Ubuntu上关联GitLab账号并下载项目(ssh key配置)

1 注冊自己的gitlab账户 有手就行 2 ubuntu安装git &#xff0c;并查看版本 sudo apt-get install git git --version 3 vim ~/.ssh/config Host gitlab.example.com User your_username Port 22 IdentityFile ~/.ssh/id_rsa PreferredAuthentications publickey 替换gitl…

C++多态的认识与理解

多态的概念 通俗来说&#xff0c;多态就是多种形态。具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 比方说买高铁票时&#xff0c;如果你是学生的话&#xff0c;买票就有优惠。如果你是军人的话&#xff0c;就可以优先买票。普通人的话&…

一文了解和使用nginx(附带图文)

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一文了解和使用nginx 一. nginx 简介1.1 什么是 nginx 和可以做什么事情1.2 正向代理1.3 反向代理1.4 负载均衡1.5 SSL 配置1.6 管理…

苹果官宣新品发布会 10月31日发布会与Mac有关

10 月 25 日消息&#xff0c;苹果宣布将于北京时间 10 月 31 日上午 8 点举行主题为“来势迅猛”的线上特别活动&#xff0c;届时或将有新品发布。 这场发布会与以往不同&#xff0c;将在北京时间 10 月 31 日上午 8 点举行。有很多猜测认为苹果届时会发布新款 Mac 电脑&#x…

Jenkins+Ant+Jmeter接口自动化集成测试

一、Jenkins安装配置 1、安装配置JDK1.6环境变量&#xff1b; 2、下载jenkins.war&#xff0c;放入C:\jenkins目录下&#xff0c;目录位置随意&#xff1b; Jenkins启动方法&#xff1a; cmd进入Jenkins目录下&#xff0c;执行java -jar jenkins.war 浏览器输入&#xff1a;l…

JavaSE 二叉树

目录 1 树型结构1.1 概念1.2 树的表示形式1.3 树的应用 2 二叉树2.1 概念2.2 二叉树的基本形态2.3 两种特殊的二叉树2.4 二叉树的性质2.5 二叉树的存储2.6 二叉树的基本操作2.6.1 二叉树的遍历2.6.2 二叉树的基本操作 2.7 基础练习题2.7.1 二叉树的前序遍历2.7.2 二叉树中序遍历…

TensorFlow2从磁盘读取图片数据集的示例(tf.data.Dataset.list_files)

import os import warnings warnings.filterwarnings("ignore") import tensorflow as tf from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications.resnet import ResNet50 from pathlib import Path import numpy as np#数据所在文件夹 …

Unity C#中LuaTable、LuaArrayTable、LuaDictTable中数据的增删改查

LuaTable、LuaArrayTable、LuaDictTable中数据的增删改查 介绍Lua表lua表初始化lua移除引用lua中向表中添加数据lua中表中移除数据lua表中连接数据lua表中数据排序获取lua表长度获取表中最大值 UnityC#中LuaTableUnityC#中LuaArrayTable、LuaDictTable、LuaDictTable<K,V>…

Java游戏修炼手册:2023 最新学习线路图

前言 有没有一种令人兴奋的学习方法&#xff1f;当然有&#xff01;绝对有&#xff01;而且我要告诉你&#xff0c;学习的快乐可以媲美游戏的刺激。 小学时代&#xff0c;我曾深陷于一款名为"八百万勇士的梦"的游戏。每当放学&#xff0c;我总是迫不及待地打开电脑&a…

ES(elasticsearch) - 三种姿势进行分页查询

1. from size 浅分页 "浅"分页可以理解为简单意义上的分页。它的原理很简单&#xff0c;就是查询前20条数据&#xff0c;然后截断前10条&#xff0c;只返回10-20的数据。这样其实白白浪费了前10条的查询。 GET test_dev/_search {"query": {"bool&…