2023年6月21日发(作者:)

seleniumGrid详解什么是selenium Grid① Selenium Grid 是Selenium套件的⼀部分,它专门⽤于并⾏运⾏多个测试⽤例在不同的浏览器、操作系统和机器上。② Selenium Grid 主要使⽤ master-slaves 或者 hub-nodes 理念 :⼀个 master/hub 和多个基于 master/hub 注册的⼦节点 slaves/nodes 。当我们在master上基于不同的浏览器/系统运⾏测试⽤例时,master将会将测试⽤例分发给适当的node运⾏。(当然也可以作为兼容性测试⼯具将测试⽤例运⾏在不同的web浏览器上)③④ selenium Grid 主要的作⽤:实现分布式执⾏测试,解决浏览器兼容性问题。【通过 Selenium Grid 的可以控制多台机器多个浏览器执⾏测试⽤例,分布式上执⾏的环境在 Selenium Grid 中称为node节点。】⑤举例:当⾃动化测试⽤例达到⼀定数量的时候,⽐如上万,⼀台机器执⾏全部测试⽤例耗时5个⼩时(只是举例,真正的耗时是需要根据测试⽤例场景的复杂度决定的),⽽如果需要覆盖主流浏览器⽐如Chrome、Firefox,加起来就是10个⼩时;这时候领导跟你说有什么办法可以解决这个执⾏速度?当然最笨的办法就是另外拿台机器,然后部署环境,把测试⽤例分开去执⾏然后合并结果即可。⽽Selenium也想到了这点,所以有了Selenium Grid的出现,它就是解决分布式执⾏测试的痛点。⑥总结:Slenium Grid 分布式测试由hub主节点和node节点组成Hub节点⽤来管理node节点注册信息。脚本——》Hub节点——》node节点——》浏览器什么时候⽤Selenium Grid①同时在不同的浏览器、操作系统和机器上运⾏测试。最⼤程度⽤于兼容性测试。②减少测试⽤例的运⾏时间。Selenium Grid⼯作原理① Selenium Grid 实际它是基于Selenium RC的,⽽所谓的分布式结构就是由⼀个hub节点和若⼲个node代理节点组成。②Hub节点⽤来管理各个代理节点的注册信息和状态信息,并且接受远程客户端代码的请求调⽤,然后把请求的命令转发给代理节点来执⾏。如何启动Selenium Grid启动 Selenium Grid 有三种⽅式:⼀种直接⽤命令⾏⽅式;另⼀种⽤JSON配置⽂件;最后⼀种docker启动。⾸先需要下载:【可以理解为搭建selenium Grid环境】1、命令⾏⽅式启动 selenium Grid

①进⼊⽂件所在的⽬录位置。②进⼊cmd命令⾏终端中。③启动Hub,命令如下:java -jar -role hub -maxSession 10 -port 4444运⾏结果如下图:命令参数解析: - role :此参数后跟hub或者node;表⽰此机器启动hub节点或者node⼦节点; - port :此参数后跟端⼝号;设置启动hub或者node节点服务的端⼝号;hub的默认端⼝是4444;这⾥使⽤的是默认的端⼝,当然可以⾃⼰配置; - maxSession :此参数后跟最⼤会话请求数;最⼤会话请求,这个参数主要⽤于并发执⾏测试⽤例,默认是1,建议设置10及以上。⑤启动node节点【启动hub节点后最少需要⼀个node节点,不然启动hub节点就没有意义】⽽node节点同样可以与hub节点在同⼀台机器上运⾏,如下例就是hub节点与node节点同机的例⼦。hub机ip:10.200.145.226node1机ip:10.200.145.226命令⾏:java -jar -role node -port 6666 -hub 10.200.145.226:4444/grid/register/ -maxSession 5 -browser browserName=chrome,seleniumProtocol=WebDriver,maxInstances=5,platform=WINDOWS,version运⾏结果如下图:命令参数解析: -role node :表⽰启动的是node节点 -port 5555 :指定node节点端⼝ - browser :启动的node节点服务设置浏览器参数信息1.    browsderName=chrome :浏览器的名称2.    seleniumProtocol=WebDriver :selenium⼯具的实现协议3.    maxInstances=5 :最⼤实例(该node节点上最多可运⾏的浏览器数),该值不能⼤于前⾯开启hub节点服务时 maxSession 参数的值4.    platform=WINDOWS :表⽰操作系统。5.    version=96.0 :表⽰浏览器版本。6.    = :浏览器驱动,如果是其他浏览器就写对应的浏览器驱动的名字;如⽕狐浏览器: =

- hub :此参数后⾯跟开启hub节点时⽣成的Nodes节点应该连接的地址,表⽰需要连接的hub机地址【注意】如果使⽤的与版本或者浏览器chrome版本不匹配都会报错提⽰,具体原因需要具体解决。2、Json配置⽂件启动 selenium Grid

①创建hub的Json配置⽂件。代码如下:将下述代码保存为 hub_ ⽂件,放在hub节点机器的与selenium server(即)相同的路径下。{ "port": 4444, "newSessionWaitTimeout": -1, "servlets" : [], "withoutServlets": [], "custom": {}, "capabilityMatcher": "tCapabilityMatcher", "registry": "tGridRegistry", "throwOnCapabilityNotPresent": true, "cleanUpCycle": 5000, "role": "hub", "debug": false, "browserTimeout": 0, "timeout": 1800}②创建nodes的Json配置⽂件。代码如下:保存为 node_ ⽂件(注意将hub对应的值改为node节点机器的IP地主),放在node节点上和selenium server相同的路径下。(当多个node时需将该⽂件放在多个node机器上或者同⼀个机器上启动多个node){ "capabilities": [ { "browserName": "firefox", "marionette": true, "maxInstances": 5, "seleniumProtocol": "WebDriver" }, { "browserName": "chrome", "maxInstances": 5, "seleniumProtocol": "WebDriver" }, { "browserName": "internet explorer", "platform": "WINDOWS", "maxInstances": 1, "seleniumProtocol": "WebDriver" }, { "browserName": "safari", "technologyPreview": false, "platform": "MAC", "maxInstances": 1, "seleniumProtocol": "WebDriver" } ], "proxy": "tRemoteProxy", "maxSession": 5, "port": -1, "register": true, "registerCycle": 5000, "hub": "192.168.1.100:4444", "nodeStatusCheckTimeout": 5000, "nodePolling": 5000, "role": "node", "unregisterIfStillDownAfter": 60000, "downPollingLimit": 2, "debug": false, "servlets" : [], "withoutServlets": [], "custom": {}}③hub机器上命令⾏运⾏: java -jar -role hub -hubConfig hub_

node机器上命令⾏运⾏: java -jar -role node -nodeConfig node_

【注意】命令⾏⽅式启动 selenium Grid、Json配置⽂件启动 selenium Grid 两种⽅式的缺点:不易启动和维护每个node需要下载和配置依赖java 进程占内存出现问题时需⼿动启动不易维护扩展性差3、docker启动 selenium Grid

docker简介docker启动 Selenium Grid

docker上已经有selenium官⽅的Selenium Grid镜像,只有你已经安装了docker,即可使⽤。启动hub:docker run -d -p 4444:4444 --name selenium-hub selenium/hub启动node(Chrome&&Firefox):  docker run -d --link selenium-hub:hub selenium/node-chrome

docker run -d --link selenium-hub:hub selenium/node-firefox如果需要多个Chrome node则继续运⾏这个命令: docker run -d --link selenium-hub:hub selenium/node-chrome ,刷新则看到多了⼀个Chrome实例。通过运⾏命令: docker ps ,显⽰正在运⾏的容器:docker 组件启动 Selenium Grid

①selenium Grid通常需要启动⼀个hub,多个nodes像Chrome、Firefox等。我们可以把他们定义到⼀个⽂件中叫做 ,通过⼀个命令来整体启动,docker提供了⼀个这样的⼯具 –Docker-Compose。②安装docker-compose,⼀旦安装成功,则创建⼀个新的⽂件夹,创建⽂件 , 内容:version: "3"services: selenium-hub: image: selenium/hub container_name: selenium-hub ports: - "4444:4444" chrome: image: selenium/node-chrome depends_on: - selenium-hub environment: - HUB_PORT_4444_TCP_ADDR=selenium-hub - HUB_PORT_4444_TCP_PORT=4444 firefox: image: selenium/node-firefox depends_on: - selenium-hub environment: - HUB_PORT_4444_TCP_ADDR=selenium-hub - HUB_PORT_4444_TCP_PORT=4444docker-compose命令:运⾏命令启动(到路径下):docker-compose up -d查看启动是否成功:docker-compose ps创建更多实例:docker-compose scale chrome=5关闭命令:docker-compose downimport unittestfrom selenium import webdriverclass MyTestCase(se): def setUp(self): ds = {'platform': 'ANY', 'browserName': "chrome", 'version': '', 'javascriptEnabled': True } = ('localhost:4444/wd/hub', desired_capabilities=ds) def test_something(self): ("") Equal(, "chrome") def test_search_button(self): ("") True(_element_by_id("su").is_displayed()) def tearDown(self): ()if __name__ == '__main__': ()Selenium Grid 脚本执⾏(在node节点机器上执⾏)单node节点单浏览器执⾏代码脚本:import timefrom selenium import webdriverfrom import Bycap = dict(browserName="chrome", version="96.0", platform="WINDOWS")# 初始化连接driver = ('10.200.145.226:4444/wd/hub', desired_capabilities=cap)("/")_element(, "kw").send_keys("selenium grid")print()(2)()单node节点多浏览器并⾏执⾏代码脚本:import threadingimport timefrom selenium import webdriverfrom import Bydef task(driver): ("/") _element(, "kw").send_keys("selenium grid") (2) ()def getDrivder(browser): # 浏览器描述 cap = None # 判断浏览器种类 if browser == "chrome": cap = () # 该类封装了各个浏览器的运⾏参数 elif browser == "firefox": cap = () # 重构浏览器描述 cap["platform"] = "WINDOWS" # 返回驱动对象 return ('10.200.145.226:6666/wd/hub', desired_capabilities=cap)if __name__ == '__main__': browsers = ("chrome", "firefox") for b in browsers: # 获取驱动 driver = getDrivder(b) # 创建线程执⾏任务 (target=task, args=(driver,)).start()

2023年6月21日发(作者:)

seleniumGrid详解什么是selenium Grid① Selenium Grid 是Selenium套件的⼀部分,它专门⽤于并⾏运⾏多个测试⽤例在不同的浏览器、操作系统和机器上。② Selenium Grid 主要使⽤ master-slaves 或者 hub-nodes 理念 :⼀个 master/hub 和多个基于 master/hub 注册的⼦节点 slaves/nodes 。当我们在master上基于不同的浏览器/系统运⾏测试⽤例时,master将会将测试⽤例分发给适当的node运⾏。(当然也可以作为兼容性测试⼯具将测试⽤例运⾏在不同的web浏览器上)③④ selenium Grid 主要的作⽤:实现分布式执⾏测试,解决浏览器兼容性问题。【通过 Selenium Grid 的可以控制多台机器多个浏览器执⾏测试⽤例,分布式上执⾏的环境在 Selenium Grid 中称为node节点。】⑤举例:当⾃动化测试⽤例达到⼀定数量的时候,⽐如上万,⼀台机器执⾏全部测试⽤例耗时5个⼩时(只是举例,真正的耗时是需要根据测试⽤例场景的复杂度决定的),⽽如果需要覆盖主流浏览器⽐如Chrome、Firefox,加起来就是10个⼩时;这时候领导跟你说有什么办法可以解决这个执⾏速度?当然最笨的办法就是另外拿台机器,然后部署环境,把测试⽤例分开去执⾏然后合并结果即可。⽽Selenium也想到了这点,所以有了Selenium Grid的出现,它就是解决分布式执⾏测试的痛点。⑥总结:Slenium Grid 分布式测试由hub主节点和node节点组成Hub节点⽤来管理node节点注册信息。脚本——》Hub节点——》node节点——》浏览器什么时候⽤Selenium Grid①同时在不同的浏览器、操作系统和机器上运⾏测试。最⼤程度⽤于兼容性测试。②减少测试⽤例的运⾏时间。Selenium Grid⼯作原理① Selenium Grid 实际它是基于Selenium RC的,⽽所谓的分布式结构就是由⼀个hub节点和若⼲个node代理节点组成。②Hub节点⽤来管理各个代理节点的注册信息和状态信息,并且接受远程客户端代码的请求调⽤,然后把请求的命令转发给代理节点来执⾏。如何启动Selenium Grid启动 Selenium Grid 有三种⽅式:⼀种直接⽤命令⾏⽅式;另⼀种⽤JSON配置⽂件;最后⼀种docker启动。⾸先需要下载:【可以理解为搭建selenium Grid环境】1、命令⾏⽅式启动 selenium Grid

①进⼊⽂件所在的⽬录位置。②进⼊cmd命令⾏终端中。③启动Hub,命令如下:java -jar -role hub -maxSession 10 -port 4444运⾏结果如下图:命令参数解析: - role :此参数后跟hub或者node;表⽰此机器启动hub节点或者node⼦节点; - port :此参数后跟端⼝号;设置启动hub或者node节点服务的端⼝号;hub的默认端⼝是4444;这⾥使⽤的是默认的端⼝,当然可以⾃⼰配置; - maxSession :此参数后跟最⼤会话请求数;最⼤会话请求,这个参数主要⽤于并发执⾏测试⽤例,默认是1,建议设置10及以上。⑤启动node节点【启动hub节点后最少需要⼀个node节点,不然启动hub节点就没有意义】⽽node节点同样可以与hub节点在同⼀台机器上运⾏,如下例就是hub节点与node节点同机的例⼦。hub机ip:10.200.145.226node1机ip:10.200.145.226命令⾏:java -jar -role node -port 6666 -hub 10.200.145.226:4444/grid/register/ -maxSession 5 -browser browserName=chrome,seleniumProtocol=WebDriver,maxInstances=5,platform=WINDOWS,version运⾏结果如下图:命令参数解析: -role node :表⽰启动的是node节点 -port 5555 :指定node节点端⼝ - browser :启动的node节点服务设置浏览器参数信息1.    browsderName=chrome :浏览器的名称2.    seleniumProtocol=WebDriver :selenium⼯具的实现协议3.    maxInstances=5 :最⼤实例(该node节点上最多可运⾏的浏览器数),该值不能⼤于前⾯开启hub节点服务时 maxSession 参数的值4.    platform=WINDOWS :表⽰操作系统。5.    version=96.0 :表⽰浏览器版本。6.    = :浏览器驱动,如果是其他浏览器就写对应的浏览器驱动的名字;如⽕狐浏览器: =

- hub :此参数后⾯跟开启hub节点时⽣成的Nodes节点应该连接的地址,表⽰需要连接的hub机地址【注意】如果使⽤的与版本或者浏览器chrome版本不匹配都会报错提⽰,具体原因需要具体解决。2、Json配置⽂件启动 selenium Grid

①创建hub的Json配置⽂件。代码如下:将下述代码保存为 hub_ ⽂件,放在hub节点机器的与selenium server(即)相同的路径下。{ "port": 4444, "newSessionWaitTimeout": -1, "servlets" : [], "withoutServlets": [], "custom": {}, "capabilityMatcher": "tCapabilityMatcher", "registry": "tGridRegistry", "throwOnCapabilityNotPresent": true, "cleanUpCycle": 5000, "role": "hub", "debug": false, "browserTimeout": 0, "timeout": 1800}②创建nodes的Json配置⽂件。代码如下:保存为 node_ ⽂件(注意将hub对应的值改为node节点机器的IP地主),放在node节点上和selenium server相同的路径下。(当多个node时需将该⽂件放在多个node机器上或者同⼀个机器上启动多个node){ "capabilities": [ { "browserName": "firefox", "marionette": true, "maxInstances": 5, "seleniumProtocol": "WebDriver" }, { "browserName": "chrome", "maxInstances": 5, "seleniumProtocol": "WebDriver" }, { "browserName": "internet explorer", "platform": "WINDOWS", "maxInstances": 1, "seleniumProtocol": "WebDriver" }, { "browserName": "safari", "technologyPreview": false, "platform": "MAC", "maxInstances": 1, "seleniumProtocol": "WebDriver" } ], "proxy": "tRemoteProxy", "maxSession": 5, "port": -1, "register": true, "registerCycle": 5000, "hub": "192.168.1.100:4444", "nodeStatusCheckTimeout": 5000, "nodePolling": 5000, "role": "node", "unregisterIfStillDownAfter": 60000, "downPollingLimit": 2, "debug": false, "servlets" : [], "withoutServlets": [], "custom": {}}③hub机器上命令⾏运⾏: java -jar -role hub -hubConfig hub_

node机器上命令⾏运⾏: java -jar -role node -nodeConfig node_

【注意】命令⾏⽅式启动 selenium Grid、Json配置⽂件启动 selenium Grid 两种⽅式的缺点:不易启动和维护每个node需要下载和配置依赖java 进程占内存出现问题时需⼿动启动不易维护扩展性差3、docker启动 selenium Grid

docker简介docker启动 Selenium Grid

docker上已经有selenium官⽅的Selenium Grid镜像,只有你已经安装了docker,即可使⽤。启动hub:docker run -d -p 4444:4444 --name selenium-hub selenium/hub启动node(Chrome&&Firefox):  docker run -d --link selenium-hub:hub selenium/node-chrome

docker run -d --link selenium-hub:hub selenium/node-firefox如果需要多个Chrome node则继续运⾏这个命令: docker run -d --link selenium-hub:hub selenium/node-chrome ,刷新则看到多了⼀个Chrome实例。通过运⾏命令: docker ps ,显⽰正在运⾏的容器:docker 组件启动 Selenium Grid

①selenium Grid通常需要启动⼀个hub,多个nodes像Chrome、Firefox等。我们可以把他们定义到⼀个⽂件中叫做 ,通过⼀个命令来整体启动,docker提供了⼀个这样的⼯具 –Docker-Compose。②安装docker-compose,⼀旦安装成功,则创建⼀个新的⽂件夹,创建⽂件 , 内容:version: "3"services: selenium-hub: image: selenium/hub container_name: selenium-hub ports: - "4444:4444" chrome: image: selenium/node-chrome depends_on: - selenium-hub environment: - HUB_PORT_4444_TCP_ADDR=selenium-hub - HUB_PORT_4444_TCP_PORT=4444 firefox: image: selenium/node-firefox depends_on: - selenium-hub environment: - HUB_PORT_4444_TCP_ADDR=selenium-hub - HUB_PORT_4444_TCP_PORT=4444docker-compose命令:运⾏命令启动(到路径下):docker-compose up -d查看启动是否成功:docker-compose ps创建更多实例:docker-compose scale chrome=5关闭命令:docker-compose downimport unittestfrom selenium import webdriverclass MyTestCase(se): def setUp(self): ds = {'platform': 'ANY', 'browserName': "chrome", 'version': '', 'javascriptEnabled': True } = ('localhost:4444/wd/hub', desired_capabilities=ds) def test_something(self): ("") Equal(, "chrome") def test_search_button(self): ("") True(_element_by_id("su").is_displayed()) def tearDown(self): ()if __name__ == '__main__': ()Selenium Grid 脚本执⾏(在node节点机器上执⾏)单node节点单浏览器执⾏代码脚本:import timefrom selenium import webdriverfrom import Bycap = dict(browserName="chrome", version="96.0", platform="WINDOWS")# 初始化连接driver = ('10.200.145.226:4444/wd/hub', desired_capabilities=cap)("/")_element(, "kw").send_keys("selenium grid")print()(2)()单node节点多浏览器并⾏执⾏代码脚本:import threadingimport timefrom selenium import webdriverfrom import Bydef task(driver): ("/") _element(, "kw").send_keys("selenium grid") (2) ()def getDrivder(browser): # 浏览器描述 cap = None # 判断浏览器种类 if browser == "chrome": cap = () # 该类封装了各个浏览器的运⾏参数 elif browser == "firefox": cap = () # 重构浏览器描述 cap["platform"] = "WINDOWS" # 返回驱动对象 return ('10.200.145.226:6666/wd/hub', desired_capabilities=cap)if __name__ == '__main__': browsers = ("chrome", "firefox") for b in browsers: # 获取驱动 driver = getDrivder(b) # 创建线程执⾏任务 (target=task, args=(driver,)).start()