找回密码
 会员注册
查看: 10|回复: 0

Python中的分布式运行:SeleniumGrid

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71610
发表于 2024-9-6 12:58:37 | 显示全部楼层 |阅读模式
前言SeleniumGrid是Selenium测试框架的一个关键组件,它为测试人员提供了在多个计算机和浏览器上并行执行测试的能力。通过SeleniumGrid,我们能够更高效地进行大规模测试,并确保应用程序在不同环境中的稳定性和一致性。我们将从以下几点深入解析SeleniumGrid分布式运行的逻辑:SeleniumGrid的核心特性SeleniumGrid的组件SeleniumGrid的工作原理SeleniumGrid运行环境配置SeleniumGrid单机模式(standalone)SeleniumGrid中心模式(Hub&Node)HubandNode在不同的机器上配置SeleniumGrid的核心特性SeleniumGrid具有以下核心特性,使其成为分布式测试的首选工具之一:并行执行测试:SeleniumGrid允许在多个计算机上同时运行测试,从而显著缩短测试执行时间。这对于大规模测试套件和需要在不同配置下运行的测试非常有用。支持多浏览器和多平台:SeleniumGrid提供了在不同浏览器(如Chrome、Firefox、Safari)和操作系统(Windows、Linux、macOS)上同时执行测试的能力。这样,您可以确保应用程序在各种环境中都能够正常工作。节点管理:SeleniumGrid通过节点管理实现测试的分发和执行。Grid包含一个主节点(Hub)和多个从节点(Node),测试脚本在主节点上启动,然后分发到可用的从节点上执行。灵活的配置选项:SeleniumGrid提供了丰富的配置选项,可以根据测试需求进行灵活配置。您可以选择在本地计算机上设置Grid,也可以在云服务上创建Grid集群。SeleniumGrid的组件主要包括:1.路由器(Router)2.分发器(Distributor)3.会话映射(SessionMap)4.新会话队列(NewSessionQueue)5.节点(Node)6.事件总线(EventBus)示意图:1.路由器(Router)作用:充当Grid的入口点,接收所有外部请求,并将它们转发到正确的组件。功能:处理新的会话请求,转发到新会话队列。查询会话映射,将请求转发到相应的节点。平衡负载,将请求发送到更好地处理请求的组件。2.分发器(Distributor)作用:注册并跟踪所有节点及其功能,查询新会话队列并处理挂起的新会话请求。功能:注册节点并跟踪其功能。查询新会话队列,处理新会话请求,并将其分配给适当的节点。通过GridModel跟踪所有节点的功能。3.会话映射(SessionMap)作用:保存会话ID和运行会话的节点之间的关系。功能:被路由器查询,以确定与会话ID相关联的节点。4.新会话队列(NewSessionQueue)作用:以FIFO顺序保存所有新的会话请求。功能:将新的会话请求添加到队列中。定期检查队列中的请求是否超时。轮询队列,将请求分配给可用的节点插槽。5.节点(Node)作用:管理运行它的机器上可用浏览器的插槽。功能:注册到分发服务器,报告自己的配置。自动注册运行机器上可用的所有浏览器驱动程序。创建浏览器插槽,并执行接收到的命令。6.事件总线(EventBus)作用:充当节点、分发器、新会话队列和会话映射之间的通信路径。功能:处理节点注册事件和其他内部通信。通过消息进行内部通信,避免昂贵的HTTP调用。SeleniumGrid的工作原理SeleniumGrid的工作原理涉及到主节点(Hub)和从节点(Node)之间的协作。以下是SeleniumGrid的基本工作流程:Hub启动:在网络中的一台计算机上启动SeleniumGridHub。Hub负责接收测试脚本的请求,并将其分发给可用的从节点执行。Node注册:在每个需要参与分布式测试的计算机上启动SeleniumGridNode。Node将自己注册到Hub,宣告其可用的浏览器和操作系统配置。测试脚本提交:测试脚本由测试开发人员编写,并通过SeleniumGrid提交到Hub。测试脚本包含要执行的测试步骤和所需的浏览器/操作系统配置。分发和执行:Hub接收到测试脚本后,根据配置选择一个或多个可用的Node,并将测试脚本分发到这些节点上执行。每个节点负责打开指定浏览器,执行测试脚本,并将结果返回给Hub。结果聚合:Hub收集所有节点的测试结果,并提供一个汇总报告。测试人员可以从Hub获取整个分布式测试的结果,包括成功的测试用例和失败的断言。SeleniumGrid运行环境配置安装Java:SeleniumGrid是基于Java的,因此您需要安装Java运行时环境。官网下载:JavaDownloads|Oracle选择自己对应的系统类别,电脑支持的位数/芯片,点击下载地址即可下载(建议使用目前稳定的版本1.8)后续进行傻瓜式安装,直接点击下一步即可,安装完成后,需要配置JDK的环境变量,按照以下步骤进行:a.右键点击我的电脑→属性→高级系统设置→环境变量b.系统变量→新建,新建一个变量名JAVA_HOME,变量值为JDK的安装目录c.系统变量→新建,新建一个变量名CLASSPATH,变量值为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;d.找到path变量,双击开始编辑,点击新建,输入第一个值%JAVA_HOME%\bin,再点击新建,输入第二个值%JAVA_HOME%\jre\bine.点击确定,关闭所有已打开的环境变量配置窗口,打开一个新的CMD命令窗口,输入java-version,检查安装java的版本,再输入java,查看输出内容是否正确(只要出现相关的提示即可),再输入javac,一样的进行检查java-version的检查结果:javaversion"1.8.0_341"Java(TM)SERuntimeEnvironment(build1.8.0_341-b10)JavaHotSpot(TM)64-BitServerVM(build25.341-b10,mixedmode)java的检查结果:用法:java[-options]class[args...](执行类)或java[-options]-jarjarfile[args...](执行jar文件)其中选项包括:-d32 使用32位数据模型(如果可用)-d64 使用64位数据模型(如果可用)-server 选择"server"VM默认VM是server,因为您是在服务器类计算机上运行。-cp-classpath用:分隔的目录,JAR档案和ZIP档案列表,用于搜索类文件。-D=设置系统属性-verbose:[class|gc|jni]启用详细输出-version输出产品版本并退出-version:警告:此功能已过时,将在未来发行版中删除。需要指定的版本才能运行-showversion输出产品版本并继续-jre-restrict-search|-no-jre-restrict-search警告:此功能已过时,将在未来发行版中删除。在版本搜索中包括/排除用户专用JRE-?-help输出此帮助消息-X输出非标准选项的帮助-ea[: ...|:]-enableassertions[: ...|:]按指定的粒度启用断言-da[: ...|:]-disableassertions[: ...|:]禁用具有指定粒度的断言-esa|-enablesystemassertions启用系统断言-dsa|-disablesystemassertions禁用系统断言-agentlib:[=]加载本机代理库,例如-agentlib:hprof另请参阅-agentlib:jdwp=help和-agentlib:hprof=help-agentpath: [=]按完整路径名加载本机代理库-javaagent:[=]加载Java编程语言代理,请参阅java.lang.instrument-splash:使用指定的图像显示启动屏幕有关详细信息,请参阅http://www.oracle.com/technetwork/java/javase/documentation/index.html。javac的检查结果:用法:javac其中,可能的选项包括:-g生成所有调试信息-g:none不生成任何调试信息-g:{lines,vars,source}只生成某些调试信息-nowarn不生成任何警告-verbose输出有关编译器正在执行的操作的消息-deprecation输出使用已过时的API的源位置-classpath指定查找用户类文件和注释处理程序的位置-cp指定查找用户类文件和注释处理程序的位置-sourcepath指定查找输入源文件的位置-bootclasspath覆盖引导类文件的位置-extdirs覆盖所安装扩展的位置-endorseddirs覆盖签名的标准路径的位置-proc:{none,only}控制是否执行注释处理和/或编译。-processor[,,...]要运行的注释处理程序的名称;绕过默认的搜索进程-processorpath指定查找注释处理程序的位置-parameters生成元数据以用于方法参数的反射-d指定放置生成的类文件的位置-s指定放置生成的源文件的位置-h指定放置生成的本机标头文件的位置-implicit:{none,class}指定是否为隐式引用文件生成类文件-encoding指定源文件使用的字符编码-source提供与指定发行版的源兼容性-target生成特定VM版本的类文件-profile请确保使用的API在指定的配置文件中可用-version版本信息-help输出标准选项的提要-A关键字[=值]传递给注释处理程序的选项-X输出非标准选项的提要-J直接将传递给运行时系统-Werror出现警告时终止编译@从文件读取选项和文件名下载SeleniumGridJAR文件:下载SeleniumGrid的JAR文件。官网地址:https://github.com/SeleniumHQ/selenium/releases/tag/selenium-4.5.0SeleniumGrid单机模式(standalone)启动命令(打开CMD命令窗口运行以下命令,要在jar包所在的目录运行命令才可,否则的话要给出jar存放的路径,包名最好使用Tab自动补全,防止写错字符): java-jarselenium-server-4.5.0.jarstandalone启动后的命令窗口页面:成功后用浏览器访问页面(http://127.0.0.1:4444):启动成功后,需要在脚本中对浏览器对象进行配置(将WebDriver指向到启动的监听服务):fromseleniumimportwebdriverchrome_options=webdriver.ChromeOptions()driver=webdriver.Remote(command_executor='http://127.0.0.1:4444',options=chrome_options)创建简单的自动化用例:importtimefromseleniumimportwebdriverchrome_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("SeleniumGrid")time.sleep(10)driver.quit()通过浏览器访问Grid的控制台,查看测试的执行情况和结果(运行用例的时候,打开Grid的控制台进行查看):SeleniumGrid中心模式(Hub&Node)Hub(主控制节点)Hub是SeleniumGrid的中心控制节点,负责管理和分发测试请求。Hub接收来自测试脚本的请求,然后将这些请求分发给连接到Grid的各个Node上执行。功能:管理测试分发:Hub负责将测试分发给Grid中可用的Node。维护节点信息:Hub会维护连接到它的各个Node的信息,包括节点的浏览器类型和版本。处理测试结果:Hub负责收集并汇总各个Node返回的测试结果。启动命令(打开CMD命令窗口运行以下命令,要在jar包所在的目录运行命令才可,否则的话要给出jar存放的路径,包名最好使用Tab自动补全,防止写错字符): java-jarselenium-server-4.5.0.jarhub启动后的命令窗口页面:成功后用浏览器访问页面(http://127.0.0.1:4444),此时是没有服务被监听的,需要添加node节点才行:Node(执行测试的节点)Node是SeleniumGrid中的工作节点,负责实际执行测试用例。一个Grid中可以有多个Node,每个Node都可以运行在不同的机器上,甚至可以具有不同的操作系统和浏览器组合。启动命令(打开CMD命令窗口运行以下命令,要在jar包所在的目录运行命令才可,否则的话要给出jar存放的路径,包名最好使用Tab自动补全,防止写错字符): java-jarselenium-server-4.5.0.jarnode ​ #可以通过不同的端口号,启动多个node节点 #示例: java-jarselenium-server-4.5.0.jarnode--port6666启动后的命令窗口页面:成功后用浏览器访问页面(http://127.0.0.1:4444),会发现添加了node节点到hub中心监控平台:启动成功后,需要在脚本中对浏览器对象进行配置(将WebDriver指向到启动的监听服务):fromseleniumimportwebdriverchrome_options=webdriver.ChromeOptions()driver=webdriver.Remote(command_executor='http://127.0.0.1:4444',options=chrome_options)创建简单的自动化用例(利用pytest框架中的多线程并发运行的模式):importtimeimportpytestfromseleniumimportwebdriverchrome_options=webdriver.ChromeOptions()driver=webdriver.Remote(command_executor='http://127.0.0.1:4444',options=chrome_options)deftestcase01():driver.get("http://www.baidu.com")driver.find_element("id","kw").send_keys("SeleniumGrid")time.sleep(10)driver.quit()deftestcase02():driver.get("http://www.baidu.com")driver.find_element("id","kw").send_keys("SeleniumGrid")time.sleep(10)driver.quit()deftestcase03():driver.get("http://www.baidu.com")driver.find_element("id","kw").send_keys("SeleniumGrid")time.sleep(10)driver.quit()if__name__=='__main__':pytest.main(['-n','3'])通过浏览器访问Grid的控制台,查看测试的执行情况和结果(运行用例的时候,打开Grid的控制台进行查看):HubandNode在不同的机器上配置在其他服务器上执行添加的命令(要把监听服务指向主控制节点,并且要确保两者的ip可以互相ping通才行): java-jarselenium-server-4.5.0.jarnode--hubhttp://{主控制节点的IP}:4444其他服务器上命令启动的页面:添加成功后的页面:创建简单的自动化用例(利用pytest框架中的多线程并发运行的模式):importtimeimportpytestfromseleniumimportwebdriverchrome_options=webdriver.ChromeOptions()driver=webdriver.Remote(command_executor='http://127.0.0.1:4444',options=chrome_options)deftestcase01():driver.get("http://www.baidu.com")driver.find_element("id","kw").send_keys("SeleniumGrid")time.sleep(10)driver.quit()deftestcase02():driver.get("http://www.baidu.com")driver.find_element("id","kw").send_keys("SeleniumGrid")time.sleep(10)driver.quit()deftestcase03():driver.get("http://www.baidu.com")driver.find_element("id","kw").send_keys("SeleniumGrid")time.sleep(10)driver.quit()deftestcase04():driver.get("http://www.baidu.com")driver.find_element("id","kw").send_keys("SeleniumGrid")time.sleep(10)driver.quit()deftestcase05():driver.get("http://www.baidu.com")driver.find_element("id","kw").send_keys("SeleniumGrid")time.sleep(10)driver.quit()deftestcase06():driver.get("http://www.baidu.com")driver.find_element("id","kw").send_keys("SeleniumGrid")time.sleep(10)driver.quit()if__name__=='__main__':pytest.main(['-n','6'])运行时的页面:结语SeleniumGrid提供了强大的分布式测试能力,使测试人员能够更高效地执行测试,并确保应用程序在不同环境和配置下的稳定性。通过理解SeleniumGrid的核心特性、工作原理以及正确的配置和使用方法,您可以充分利用这一强大工具,提升测试效率和覆盖范围。在日益复杂和多样化的web应用环境中,SeleniumGrid是确保软件质量的重要工具之一。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 05:00 , Processed in 0.572982 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表