Docker + Selenium Grid 搭建分布式 UI 自动化测试

news2024/11/20 18:45:59

Selenium Grid 介绍
Selenium Grid 是 selenium 提供的一个分布式测试工具,将自动化脚本发布到多个物理机或者虚拟机(跨平台、跨浏览器)上执行,通过一个中心节点来控制多个设备,也就是在中心节点(hub)上管理测试,在其它节点(node)上执行测试,以实现 Selenium 的并行执行。

除了可以在多个设备上运行测试脚本以外,Selenium Grid 也可以实现多浏览器兼容性测试。Node 本身不提供多线程并发执行,需要结合多进程技术实现并行执行用例。

使用场景:

并发执行测试用例,减少测试执行时间。
浏览器兼容性测试。
Selenium Grid 架构:

Hub 作为管理节点,用来管理各个代理节点的注册和状态信息,并且接收远程客户端代码请求调用,然后把请求的命令再转发给代理代点来执行;
每个 Selenium Grid 仅包含一个 Hub,Hub 连接多个节点(Node);
Node 就是浏览器所在的位置,注册到 Hub,接收 Hub 的请求并执行测试。
(Selenium Grid 执行原理参考)

Docker 搭建 Selenium Grid
创建 Hub 容器

docker run -d --name grid_hub -p 5442-5444:4442-4444 selenium/hub
  • --name:给启动的容器命名一个别名。
  • 5442-5443:hub 与 node 的通信服务。
  • 5444:提供 hub 的 web 图形界面服务。
  • 5902:提供 node 的远程访问服务,以查看浏览器执行情况(需配合 VNC Viewer 使用)。

创建 Node 容器

// 若要启动多个 Node,则修改端口号新建 Node 容器即可
docker run -d --name grid_node -p 5902:5900 -e SE_EVENT_BUS_HOST=k8s.testing-studio.com -e SE_NODE_MAX_SESSIONS=20 -e NODE_MAX_INSTANCES=20 -e SE_NODE_OVERRIDE_MAX_SESSIONS=true -e SE_EVENT_BUS_PUBLISH_PORT=5442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=5443 -v /dev/shm:/dev/shm selenium/node-chrome

-e:指定环境变量,用于传参。
--link grid_hub:获取 hub 容器的网络信息。
MAX_SESSION:限制同时最多只能开启 20 个浏览器(超过则排队)。
NODE_MAX_INSTANCES:一般和 NODE_MAX_SESSION 设置一样,表示最多同时启动的浏览器实例数。
/dev/shm:用于优化内存。

--link 参数原理:把 hub 相关的网络信息以环境变量的方式传到容器中(即 -e 环境变量配置)。
因此如果不使用 --link 参数,也可以以环境变量的方式来处理容器间的网络通信问题。如下:
-e HUB_PORT_4444_TCP_ADDR=XXX
-e HUB_PORT_4444_TCP_PORT=XXX

访问“虚拟机IP:5444”验证 Node 是否已经注册到 Hub,如下:

 

安装 VNC viewer

vnc viewer 是一款优秀的远程控制工具软件。
官网下载地址:Download VNC Viewer | VNC® Connect
安装好以后 File->New connection,在弹出的界面中输入 node 的 IP 和端口号,保存后双击启动。
连接时要求输入密码,默认密码是 secret 。

 

下图代表连接成功:

 

测试脚本

Selenide 版

Maven 依赖

    <dependencies>
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>5.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

 测试代码

import com.codeborne.selenide.Condition;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.impl.WebDriverContainer;
import com.codeborne.selenide.impl.WebDriverThreadLocalContainer;
import org.junit.jupiter.api.Test;
 
import static com.codeborne.selenide.Selectors.byText;
import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.open;
 
public class SelenideTest {
 
    @Test
    public void test1() {
        WebDriverContainer webdriverContainer = new WebDriverThreadLocalContainer();
        // 关闭自动截图
        Configuration.screenshots = false;
        // 清除浏览器缓存
        webdriverContainer.clearBrowserCache();
        // 设置浏览器为 chrome
        // 不同版本的selenide,默认支持浏览器的版本范围有所不同。若发现不兼容则可以手动设置
        // String chromeDriverPath = "E:\\auto_test_driver\\chromedriver.exe";
        // System.setProperty("webdriver.chrome.driver", chromeDriverPath);
        Configuration.browser = "chrome";
        // 设置远程 grid hub 地址和端口号,对应容器启动时的参数
        Configuration.remote = "http://k8s.testing-studio.com:5444/";
        // 访问指定网址
        String baseUrl = "https://www.baidu.com";
        open(baseUrl);
        $("#kw").setValue("docker").pressEnter();
        // 元素定位与断言
        $(byText("贴吧")).should(Condition.exist);
    }
    
}

Selenium 版

若脚本需要添加 capabilities 参数,则可以参考 grid/console :

DesiredCapabilities capability = new DesiredCapabilities();
capability.setBrowserName("chrome");
capability.setPlatform(Platform.WINDOWS);
 
try {
    WebDriver driver = new RemoteWebDriver(new URL("http://k8s.testing-studio.com:5444/wd/hub"), capability);
    driver.get("https://www.baidu.com");
    driver.quit();
} catch (MalformedURLException e) {
    e.printStackTrace();
}

运行效果

运行脚本后,可以在 VNC 中实时看到运行界面

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

 这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

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

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

相关文章

显示本地 IP 地址和相应的 QR 码,方便用户共享和访问网络信息

这段代码使用了 wxPython、socket、qrcode 和 PIL&#xff08;Python Imaging Library&#xff09;模块来生成一个具有本地 IP 地址和相应 QR 码的窗口应用程序。 C:\pythoncode\new\showipgenqrcode.py 让我们逐行解释代码的功能&#xff1a; import wx&#xff1a;导入 wx…

并发控制:上下文、中断屏蔽和原子变量

一、上下文和并发场合 执行流&#xff1a;有开始有结束总体顺序执行的一段代码 又称上下文 应用编程&#xff1a;任务上下文 内核编程&#xff1a; 任务上下文&#xff1a;五状态 可阻塞 a. 应用进程或线程运行在用户空间 b. 应用进程或线程运行在内核空间&#xff08;通过调…

领导眼中的完美材料:撰写方法与注意事项解析

撰写为领导的材料&#xff0c;往往是一项富有挑战性的任务。领导的时间宝贵&#xff0c;对信息的需求精准&#xff0c;所以他们希望看到的材料要既准确又高效。但究竟如何撰写出领导眼中的“完美材料”呢&#xff1f;以下为你提供撰写方法与注意事项的深入解析&#xff1a; 理解…

美国访问学者签证有哪些要求?

近年来&#xff0c;越来越多的学者选择前往美国进行访问学者签证&#xff0c;以便深入研究、学术交流以及开展合作项目。美国访问学者签证是一个重要的工具&#xff0c;为学者们提供了在美国学术机构进行短期或长期学术活动的机会。下面知识人网将介绍一些申请美国访问学者签证…

浏览器输入URL后的执行过程

浏览器输入URL后&#xff0c;在结果返回浏览器前&#xff0c;主要有以下过程&#xff1a;1、用户输入网址后&#xff0c;浏览器发起DNS查询请求&#xff1b;2、建立TCP连接&#xff1b;3、发送HTTP请求&#xff1b;4、服务器处理请求&#xff1b;5、返回HTTP响应&#xff1b;6、…

JavaScript基本数组操作

在JavaScript中&#xff0c;内置了很多函数让我们可以去对数组进行操作&#xff0c;本文我们就来学习这些函数吧 添加元素 push ● push可以让我们在数组后面再添加一个数据&#xff0c;例如 const friends ["张三", "李四", "王五"]; frie…

winform嵌入浏览器 webView2

1、项目引用nuget 2、winform窗体中初始化 var webView new WebView2();webView.Source new Uri(url);webView.Dock DockStyle.Fill;//接收js调用c#函数的消息webView.WebMessageReceived CoreWebView2_WebMessageReceivedAsync; this.panel1.Controls.Add(…

机器学习笔记之最优化理论与方法(三)凸集的简单认识(下)

机器学习笔记之最优化理论与方法——凸集的简单认识[下] 引言回顾&#xff1a;基本定义——凸集关于保持集合凸性的运算仿射变换 凸集基本性质&#xff1a;投影定理点与凸集的分离支撑超平面定理 引言 继续凸集的简单认识(上)进行介绍&#xff0c;本节将介绍凸集的基本性质以及…

开开心心带你学习MySQL数据库

关于 MySQL 数据库~~ 数据库和数据结构的关系 数据结构,是一个学科,研究数据如何组织, 对于少量的数据,不需要组织…如果是大量的数据,就得好好组织起来,以便于后续进行增删查改!!!~~ 数据库,是一类软件,这个软件就是用来组织/保存/管理数据的. 组织这些数据也是为了后续进…

RHCE——十三、Shell自动化运维编程基础

Shell 一、为什么学习和使用Shell编程二、Shell是什么1、shell起源2、查看当前系统支持的shell3、查看当前系统默认shell4、Shell 概念 三、Shell 程序设计语言1、Shell 也是一种脚本语言2、用途 四、如何学好shell1、熟练掌握shell编程基础知识2、建议 五、Shell脚本的基本元素…

【历史上的今天】8 月 9 日:人工智能理论的奠基者诞生;鸿蒙 OS 发布;“云计算”概念被提出

整理 | 王启隆 图源&#xff1a;维基百科 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 8 月 9 日&#xff0c;在 1859 年的今天&#xff0c;电梯获得了专利。 用于运输货物和建筑材料的起重系统的想法自埃及文明以来就已…

小兔鲜商03

进入可视区加载数据&#xff1a; 首页有很多模块&#xff0c;如果一次性加载所有数据&#xff0c;很卡&#xff0c;&#xff0c;当移动到要显示的地方&#xff0c;才加载数据 使用 vueuse 库中 useIntersectionObserver方法&#xff0c;&#xff0c; 传入要监听的元素 target …

UE5打完包后,启动程序不能全屏

最近看到ue5的打包程序后不能默认自动全屏&#xff0c;效果如下&#xff0c;发现并不是全屏的&#xff0c;而且就算点击放大也不是全屏 解决办法&#xff1a;设置如下之后在打包就可以了 但是会一直打印错误的日志&#xff0c;不过这个不影响使用

【LeetCode算法系列题解】第1~5题

CONTENTS LeetCode 1. 两数之和&#xff08;简单&#xff09;LeetCode 2. 两数相加&#xff08;中等&#xff09;LeetCode 3. 无重复字符的最长子串&#xff08;中等&#xff09;LeetCode 4. 寻找两个正序数组的中位数&#xff08;困难&#xff09;LeetCode 5. 最长回文子串&am…

文献综述|针对图像描述模型的对抗样本攻击

前言&#xff1a;图像描述对抗攻击旨在通过攻击正常的图像描述模型&#xff0c;为正常输入图像添加扰动得到对抗样本&#xff0c;使得正常模型输出目标句子或目标关键词&#xff0c;现将当前相关工作大致汇总如下。本综述初写于2022年8月29日。 部分相关工作介绍 Shekhar 等在…

【使用DataEase数据可视化分析工具访问cpolar】

DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务的改进与优化。是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务的改进与优化。 在本地搭建后,借助cpolar 内…

阿里云国际站不想自己充值怎么办?-unirech阿里云国际站代充

在阿里云国际版官网注册是需要绑定paypal或者visa卡才可以完成注册&#xff0c;但是很多网友表示没有这些&#xff0c;阿里云国际站不想自己充值怎么办&#xff1f;其实通过分销商Unirech来注册的话就完全不用担心这个问题了&#xff0c;因为可以直接省略这一步&#xff0c;阿里…

【Java从入门到大牛】IO流下篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年8月31日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43…

RT-Thread自动初始化机制

自动初始化机制是指初始化函数不需要被显示调用&#xff0c;只需要在函数定义处通过宏定义的方式进行申明&#xff0c;就会在系统启动过程中被执行。 int rt_hw_usart_init(void) {rt_hw_serial_register(&serial1, "uart1",RT_DEVICE_FLAG_RDWR | RT_DEVICE_FL…

Web服务器简介及HTTP协议

一、HTPP请求/响应报文格式 1.客户端连接到Web服务器 一个HTTP客户端&#xff0c;通常是浏览器&#xff0c;与Web服务器的HTTP端口&#xff08;默认为80&#xff09;建立一个TCP套接字连接。例如&#xff0c;http://www.baidu.com(URL) 2.发送HTTP请求 通过TCP套接字&#xff…