Python中的分布式运行:Selenium Grid

这篇具有很好参考价值的文章主要介绍了Python中的分布式运行:Selenium Grid。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Selenium Grid 是 Selenium 测试框架的一个关键组件,它为测试人员提供了在多个计算机和浏览器上并行执行测试的能力。通过 Selenium Grid,我们能够更高效地进行大规模测试,并确保应用程序在不同环境中的稳定性和一致性。

我们将从以下几点深入解析Selenium Grid分布式运行的逻辑:

  • Selenium Grid 的核心特性

  • Selenium Grid的组件

  • Selenium Grid 的工作原理

  • Selenium Grid运行环境配置

  • Selenium Grid单机模式(standalone)

  • Selenium Grid中心模式(Hub & Node)

  • Hub and Node在不同的机器上配置

Selenium Grid 的核心特性

Selenium Grid 具有以下核心特性,使其成为分布式测试的首选工具之一:

  1. 并行执行测试: Selenium Grid 允许在多个计算机上同时运行测试,从而显著缩短测试执行时间。这对于大规模测试套件和需要在不同配置下运行的测试非常有用。

  2. 支持多浏览器和多平台: Selenium Grid 提供了在不同浏览器(如 Chrome、Firefox、Safari)和操作系统(Windows、Linux、macOS)上同时执行测试的能力。这样,您可以确保应用程序在各种环境中都能够正常工作。

  3. 节点管理: Selenium Grid 通过节点管理实现测试的分发和执行。Grid 包含一个主节点(Hub)和多个从节点(Node),测试脚本在主节点上启动,然后分发到可用的从节点上执行。

  4. 灵活的配置选项: Selenium Grid 提供了丰富的配置选项,可以根据测试需求进行灵活配置。您可以选择在本地计算机上设置 Grid,也可以在云服务上创建 Grid 集群。

Selenium Grid的组件

主要包括:

1. 路由器(Router)

2. 分发器(Distributor)

3. 会话映射(Session Map)

4. 新会话队列(New Session Queue)

5. 节点(Node)

6. 事件总线(Event Bus)

示意图:

selenium grid python,python,分布式,selenium

1. 路由器(Router)
  • 作用: 充当 Grid 的入口点,接收所有外部请求,并将它们转发到正确的组件。

  • 功能:

    • 处理新的会话请求,转发到新会话队列。

    • 查询会话映射,将请求转发到相应的节点。

    • 平衡负载,将请求发送到更好地处理请求的组件。

2. 分发器(Distributor)
  • 作用: 注册并跟踪所有节点及其功能,查询新会话队列并处理挂起的新会话请求。

  • 功能:

    • 注册节点并跟踪其功能。

    • 查询新会话队列,处理新会话请求,并将其分配给适当的节点。

    • 通过 GridModel 跟踪所有节点的功能。

3. 会话映射(Session Map)
  • 作用: 保存会话 ID 和运行会话的节点之间的关系。

  • 功能:

    • 被路由器查询,以确定与会话 ID 相关联的节点。

4. 新会话队列(New Session Queue)
  • 作用: 以 FIFO 顺序保存所有新的会话请求。

  • 功能:

    • 将新的会话请求添加到队列中。

    • 定期检查队列中的请求是否超时。

    • 轮询队列,将请求分配给可用的节点插槽。

5. 节点(Node)
  • 作用: 管理运行它的机器上可用浏览器的插槽。

  • 功能:

    • 注册到分发服务器,报告自己的配置。

    • 自动注册运行机器上可用的所有浏览器驱动程序。

    • 创建浏览器插槽,并执行接收到的命令。

6. 事件总线(Event Bus)
  • 作用: 充当节点、分发器、新会话队列和会话映射之间的通信路径。

  • 功能:

    • 处理节点注册事件和其他内部通信。

    • 通过消息进行内部通信,避免昂贵的 HTTP 调用。

Selenium Grid 的工作原理

Selenium Grid 的工作原理涉及到主节点(Hub)和从节点(Node)之间的协作。以下是 Selenium Grid 的基本工作流程:

  1. Hub 启动: 在网络中的一台计算机上启动 Selenium Grid Hub。Hub 负责接收测试脚本的请求,并将其分发给可用的从节点执行。

  2. Node 注册: 在每个需要参与分布式测试的计算机上启动 Selenium Grid Node。Node 将自己注册到 Hub,宣告其可用的浏览器和操作系统配置。

  3. 测试脚本提交: 测试脚本由测试开发人员编写,并通过 Selenium Grid 提交到 Hub。测试脚本包含要执行的测试步骤和所需的浏览器/操作系统配置。

  4. 分发和执行: Hub 接收到测试脚本后,根据配置选择一个或多个可用的 Node,并将测试脚本分发到这些节点上执行。每个节点负责打开指定浏览器,执行测试脚本,并将结果返回给 Hub。

  5. 结果聚合: Hub 收集所有节点的测试结果,并提供一个汇总报告。测试人员可以从 Hub 获取整个分布式测试的结果,包括成功的测试用例和失败的断言。

Selenium Grid运行环境配置

  1. 安装 Java: Selenium Grid 是基于 Java 的,因此您需要安装 Java 运行时环境。

    官网下载:Java Downloads | Oracle

    选择自己对应的系统类别,电脑支持的位数/芯片,点击下载地址即可下载(建议使用目前稳定的版本 1.8)

selenium grid python,python,分布式,selenium

后续进行傻瓜式安装,直接点击 下一步 即可,安装完成后,需要配置JDK的环境变量,按照以下步骤进行:

a. 右键点击 我的电脑→属性→高级系统设置→环境变量

selenium grid python,python,分布式,selenium

b. 系统变量→新建,新建一个变量名 JAVA_HOME,变量值为JDK的安装目录

selenium grid python,python,分布式,selenium

c. 系统变量→新建,新建一个变量名 CLASSPATH,变量值为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

selenium grid python,python,分布式,selenium

d. 找到 path 变量,双击开始编辑,点击 新建,输入第一个值 %JAVA_HOME%\bin,再点击 新建,输入第二个值 %JAVA_HOME%\jre\bin

selenium grid python,python,分布式,selenium

e. 点击 确定,关闭所有已打开的环境变量配置窗口,打开一个新的CMD命令窗口,输入 java -version,检查安装java的版本,再输入 java,查看输出内容是否正确(只要出现相关的提示即可),再输入 javac,一样的进行检查

java -version的检查结果:

java version "1.8.0_341"
Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)

java的检查结果:

用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -d32	  使用 32 位数据模型 (如果可用)
    -d64	  使用 64 位数据模型 (如果可用)
    -server	  选择 "server" VM
                  默认 VM 是 server,
                  因为您是在服务器类计算机上运行。


    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 : 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|gc|jni]
                  启用详细输出
    -version      输出产品版本并退出
    -version:<值>
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  需要指定的版本才能运行
    -showversion  输出产品版本并继续
    -jre-restrict-search | -no-jre-restrict-search
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  在版本搜索中包括/排除用户专用 JRE
    -? -help      输出此帮助消息
    -X            输出非标准选项的帮助
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  按指定的粒度启用断言
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  禁用具有指定粒度的断言
    -esa | -enablesystemassertions
                  启用系统断言
    -dsa | -disablesystemassertions
                  禁用系统断言
    -agentlib:<libname>[=<选项>]
                  加载本机代理库 <libname>, 例如 -agentlib:hprof
                  另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
    -agentpath:<pathname>[=<选项>]
                  按完整路径名加载本机代理库
    -javaagent:<jarpath>[=<选项>]
                  加载 Java 编程语言代理, 请参阅 java.lang.instrument
    -splash:<imagepath>
                  使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

javac的检查结果:

用法: javac <options> <source files>
其中, 可能的选项包括:
  -g                         生成所有调试信息
  -g:none                    不生成任何调试信息
  -g:{lines,vars,source}     只生成某些调试信息
  -nowarn                    不生成任何警告
  -verbose                   输出有关编译器正在执行的操作的消息
  -deprecation               输出使用已过时的 API 的源位置
  -classpath <路径>            指定查找用户类文件和注释处理程序的位置
  -cp <路径>                   指定查找用户类文件和注释处理程序的位置
  -sourcepath <路径>           指定查找输入源文件的位置
  -bootclasspath <路径>        覆盖引导类文件的位置
  -extdirs <目录>              覆盖所安装扩展的位置
  -endorseddirs <目录>         覆盖签名的标准路径的位置
  -proc:{none,only}          控制是否执行注释处理和/或编译。
  -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
  -processorpath <路径>        指定查找注释处理程序的位置
  -parameters                生成元数据以用于方法参数的反射
  -d <目录>                    指定放置生成的类文件的位置
  -s <目录>                    指定放置生成的源文件的位置
  -h <目录>                    指定放置生成的本机标头文件的位置
  -implicit:{none,class}     指定是否为隐式引用文件生成类文件
  -encoding <编码>             指定源文件使用的字符编码
  -source <发行版>              提供与指定发行版的源兼容性
  -target <发行版>              生成特定 VM 版本的类文件
  -profile <配置文件>            请确保使用的 API 在指定的配置文件中可用
  -version                   版本信息
  -help                      输出标准选项的提要
  -A关键字[=值]                  传递给注释处理程序的选项
  -X                         输出非标准选项的提要
  -J<标记>                     直接将 <标记> 传递给运行时系统
  -Werror                    出现警告时终止编译
  @<文件名>                     从文件读取选项和文件名
  1. 下载 Selenium Grid JAR 文件: 下载 Selenium Grid 的 JAR 文件。

官网地址:https://github.com/SeleniumHQ/selenium/releases/tag/selenium-4.5.0

selenium grid python,python,分布式,selenium

Selenium Grid单机模式(standalone)

启动命令(打开CMD命令窗口运行以下命令,要在jar包所在的目录运行命令才可,否则的话要给出jar存放的路径,包名最好使用Tab自动补全,防止写错字符):

 java -jar selenium-server-4.5.0.jar standalone

启动后的命令窗口页面:

selenium grid python,python,分布式,selenium

成功后用浏览器访问页面(http://127.0.0.1:4444):

selenium grid python,python,分布式,selenium

启动成功后,需要在脚本中对浏览器对象进行配置(将WebDriver指向到启动的监听服务):

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4444',
    options=chrome_options
)

创建简单的自动化用例:

import time

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4444',
    options=chrome_options
)

driver.get("http://www.baidu.com")
driver.find_element("id", "kw").send_keys("Selenium Grid")
time.sleep(10)
driver.quit()

通过浏览器访问 Grid 的控制台,查看测试的执行情况和结果(运行用例的时候,打开Grid 的控制台进行查看):selenium grid python,python,分布式,selenium

Selenium Grid中心模式(Hub & Node)

Hub(主控制节点)

Hub 是 Selenium Grid 的中心控制节点,负责管理和分发测试请求。Hub 接收来自测试脚本的请求,然后将这些请求分发给连接到 Grid 的各个 Node 上执行。

功能:

  • 管理测试分发: Hub 负责将测试分发给 Grid 中可用的 Node。

  • 维护节点信息: Hub 会维护连接到它的各个 Node 的信息,包括节点的浏览器类型和版本。

  • 处理测试结果: Hub 负责收集并汇总各个 Node 返回的测试结果。

启动命令(打开CMD命令窗口运行以下命令,要在jar包所在的目录运行命令才可,否则的话要给出jar存放的路径,包名最好使用Tab自动补全,防止写错字符):

 java -jar selenium-server-4.5.0.jar hub

启动后的命令窗口页面:

selenium grid python,python,分布式,selenium

成功后用浏览器访问页面(http://127.0.0.1:4444),此时是没有服务被监听的,需要添加node节点才行:

selenium grid python,python,分布式,selenium

Node(执行测试的节点)

Node 是 Selenium Grid 中的工作节点,负责实际执行测试用例。一个 Grid 中可以有多个 Node,每个 Node 都可以运行在不同的机器上,甚至可以具有不同的操作系统和浏览器组合。

启动命令(打开CMD命令窗口运行以下命令,要在jar包所在的目录运行命令才可,否则的话要给出jar存放的路径,包名最好使用Tab自动补全,防止写错字符):

 java -jar selenium-server-4.5.0.jar node
 ​
 # 可以通过不同的端口号,启动多个node节点
 # 示例:
 java -jar selenium-server-4.5.0.jar node --port 6666

启动后的命令窗口页面:

selenium grid python,python,分布式,selenium

成功后用浏览器访问页面(http://127.0.0.1:4444),会发现添加了node节点到hub中心监控平台:

selenium grid python,python,分布式,selenium

启动成功后,需要在脚本中对浏览器对象进行配置(将WebDriver指向到启动的监听服务):

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4444',
    options=chrome_options
)

创建简单的自动化用例(利用pytest框架中的多线程并发运行的模式):

import time

import pytest
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4444',
    options=chrome_options
)


def testcase01():
    driver.get("http://www.baidu.com")
    driver.find_element("id", "kw").send_keys("Selenium Grid")
    time.sleep(10)
    driver.quit()


def testcase02():
    driver.get("http://www.baidu.com")
    driver.find_element("id", "kw").send_keys("Selenium Grid")
    time.sleep(10)
    driver.quit()

def testcase03():
    driver.get("http://www.baidu.com")
    driver.find_element("id", "kw").send_keys("Selenium Grid")
    time.sleep(10)
    driver.quit()
    
    
if __name__ == '__main__':
    pytest.main(['-n', '3'])

通过浏览器访问 Grid 的控制台,查看测试的执行情况和结果(运行用例的时候,打开Grid 的控制台进行查看):

selenium grid python,python,分布式,selenium

Hub and Node在不同的机器上配置

在其他服务器上执行添加的命令(要把监听服务指向主控制节点,并且要确保两者的ip可以互相ping通才行):

 java -jar selenium-server-4.5.0.jar node --hub http://{主控制节点的IP}:4444

其他服务器上命令启动的页面:

selenium grid python,python,分布式,selenium

添加成功后的页面:selenium grid python,python,分布式,selenium

创建简单的自动化用例(利用pytest框架中的多线程并发运行的模式):

import time

import pytest
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Remote(
    command_executor='http://127.0.0.1:4444',
    options=chrome_options
)


def testcase01():
    driver.get("http://www.baidu.com")
    driver.find_element("id", "kw").send_keys("Selenium Grid")
    time.sleep(10)
    driver.quit()


def testcase02():
    driver.get("http://www.baidu.com")
    driver.find_element("id", "kw").send_keys("Selenium Grid")
    time.sleep(10)
    driver.quit()


def testcase03():
    driver.get("http://www.baidu.com")
    driver.find_element("id", "kw").send_keys("Selenium Grid")
    time.sleep(10)
    driver.quit()


def testcase04():
    driver.get("http://www.baidu.com")
    driver.find_element("id", "kw").send_keys("Selenium Grid")
    time.sleep(10)
    driver.quit()


def testcase05():
    driver.get("http://www.baidu.com")
    driver.find_element("id", "kw").send_keys("Selenium Grid")
    time.sleep(10)
    driver.quit()


def testcase06():
    driver.get("http://www.baidu.com")
    driver.find_element("id", "kw").send_keys("Selenium Grid")
    time.sleep(10)
    driver.quit()
    

if __name__ == '__main__':
    pytest.main(['-n', '6'])

运行时的页面:selenium grid python,python,分布式,selenium

结语

Selenium Grid 提供了强大的分布式测试能力,使测试人员能够更高效地执行测试,并确保应用程序在不同环境和配置下的稳定性。通过理解 Selenium Grid 的核心特性、工作原理以及正确的配置和使用方法,您可以充分利用这一强大工具,提升测试效率和覆盖范围。在日益复杂和多样化的 web 应用环境中,Selenium Grid 是确保软件质量的重要工具之一。文章来源地址https://www.toymoban.com/news/detail-849287.html

到了这里,关于Python中的分布式运行:Selenium Grid的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学点Selenium玩点新鲜~,让分布式测试有更多玩法

    我们都知道 Selenium 是一款在 Web 应用测试领域使用的自动化测试工具,而 Selenium Grid 是 Selenium 中的一大组件,通过它能够实现分布式测试,能够帮助团队简单快速在不同的环境中测试他们的 Web 应用。 分布式执行测试其实并不是一个非常难以理解的概念,简单来说,就是能够

    2024年02月12日
    浏览(29)
  • 机器学习分布式框架ray运行TensorFlow实例

    使用Ray来实现TensorFlow的训练是一种并行化和分布式的方法,它可以有效地加速大规模数据集上的深度学习模型的训练过程。Ray是一个高性能、分布式计算框架,可以在集群上进行任务并行化和数据并行化,从而提高训练速度和可扩展性。 以下是实现TensorFlow训练的概括性描述

    2024年02月15日
    浏览(50)
  • 机器学习分布式框架ray运行xgboost实例

            Ray是一个开源的分布式计算框架,专门用于构建高性能的机器学习和深度学习应用程序。它的目标是简化分布式计算的复杂性,使得用户能够轻松地将任务并行化并在多台机器上运行,以加速训练和推理的速度。Ray的主要特点包括支持分布式任务执行、Actor模型、

    2024年02月15日
    浏览(43)
  • 聊聊分布式架构09——分布式中的一致性协议

    目录 01从集中式到分布式 系统特点 集中式特点 分布式特点 事务处理差异 02一致性协议与Paxos算法 2PC(Two-Phase Commit) 阶段一:提交事务请求 阶段二:执行事务提交 优缺点 3PC(Three-Phase Commit) 阶段一:CanCommit 阶段二:PreCommit 阶段三:doCommit 优缺点 Paxos算法 拜占庭将军问题

    2024年02月08日
    浏览(47)
  • 分布式服务框架_Zookeeper--管理分布式环境中的数据

    安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础,最新的版本可以通过官网   http://hadoop.apache.org/zookeeper/ 来获取, Zookeeper 的安装非常简单,下面将从单机模式和集群模式两个方面介绍 Zookeeper 的安装和配置。 单机模式

    2024年02月12日
    浏览(39)
  • 基于docker部署的Selenium Grid分布式自动化测试

    Selenium Grid是Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。 Selenium Grid有两个版本——老版本Grid 1和新版本Grid 2。我们只对新版本做介绍,因为Selenium团队已经逐渐遗弃老版本了。 Selenium Grid 主要使用 master-slaves (or hub-nodes) 理念

    2024年02月13日
    浏览(31)
  • 分布式系统中的数据复制

    本文翻译自国外论坛 medium,原文地址:https://medium.com/@interviewready/data-replication-in-distributed-system-87f7d265ff28 数据复制是指将数据复制到一个或多个数据容器以确保可用性的过程。复制的数据通常存储在不同的数据库实例中,即使一个实例发生故障,我们也可以从其他实例获取数

    2024年02月16日
    浏览(45)
  • 深度解析Redisson框架的分布式锁运行原理与高级知识点

    分布式系统中的锁管理一直是一个复杂而关键的问 题。在这个领域,Redisson框架凭借其出色的性能和功能成为了开发者的首选之一。本篇博客将深入探讨Redisson框架的分布式锁运行原理以及涉及的高级知识点。通过详细的解释和示例代码,您将更好地理解如何在分布式环境中

    2024年02月09日
    浏览(46)
  • 分布式任务调度平台XXL-JOB学习笔记-helloworld运行

    环境:win10 eclipse java17 mysql8.0.17 xxl-job 2.4 源码:https://github.com/xuxueli/xxl-job/ 导入时按Existing Maven Projects导入,先导入xxl-job-admin(管理平台)和xxl-job-executor-sample-springboot(通过springboot管理的执行器实例)。 如果导入时速度非常慢,或者报错如 Plugin ‘org.apache.maven.plugins:maven-

    2024年02月13日
    浏览(49)
  • 分布式系统中的区块链应用

    作者:禅与计算机程序设计艺术 分布式系统正在成为越来越多的企业级应用的架构模式。越来越多的应用从单机数据库扩展到分布式系统,通过无缝集成服务框架,实现了数据可靠性、服务高可用、容错等目标。但是传统的分布式系统没有引入更加先进的技术,如区块链技术

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包