selenium 实现多机器部署分布式执行
1、selenium-grid
selenium实现多机器分布式执行,依靠的是:selenium-grid(selenium的三大组件之一)。selenium-grid允许用户在不同的机器上并行地针对不同的浏览器运行测试。selenium-grid采用的是Hub和Node模式,允许在分布式测试执行环境中运行测试。
selenium Hub用来管理各个selenium Node的注册信息和状态信息,并且接收远程客户端代码的测试调用请求,并把请求命令发送给符合要求的selenium Node执行。
优点:
- 可以减少测试的执行时间;
- 支持针对多个运行环境的运行—不同系统的兼容性;
- 支持所有场景拥有相同浏览器、类型、版本的测试—不同浏览器的兼容性。
2、环境搭建
2.1 运行环境的准备
***所有的Hub和Node的环境均按⤵️要求配置
- 下载selenium-server:https://www.selenium.dev/downloads/。我下载的是:selenium-server-standalone-3.141.59.jar
- 下载java环境,并配置java环境。Java环境分为JDK和JRE两种,JDK是面向开发者使用的SDK,它提供了java的开发环境和运行环境,JRE是java的运行环境,它面向的是java程序的使用者,而不是开发者。这里我们直接下载JDK,下载地址如下:https://www.oracle.com/technetwork/java/javase/downloads/index.html (验证:java --version)
- 下载浏览器驱动,chromedriver:http://chromedriver.storage.googleapis.com/index.html。(注意与chrome浏览器的版本相匹配)
2.2 selenium-grid搭建
- 准备2+台机器
- 选择其中一台机器作为Hub。在该机器上启动一个Hub和一个Node,打开两个终端分别输入:
java -jar selenium-server-standalone-3.141.59.jar -role hub #端口默认4444
java -jar selenium-server-standalone-3.141.59.jar -role node -port 5555
# 扩展
如果需要多个节点,改变端口增加即可。
# 观察node节点的信息
可以在这台计算机上访问 http://localhost:4444/grid/console
- 在所有的node节点的机器的终端执行如下命令:
java -jar selenium-server-standalone-3.141.59.jar -role node -port 8888 -hub http://hub机器的ip:4444/grid/register
- 回到hub机器上运行自动化脚本即可,Demo代码如下:
1 # coding = utf-8 2 3 from threading import Thread 4 from time import sleep, ctime 5 from selenium import webdriver 6 7 8 def test_sample(host, browser): 9 """测试用例""" 10 print('start:%s' % ctime()) 11 print(host, browser) 12 dc = {'browserName': browser} 13 driver = webdriver.Remote(command_executor=host, desired_capabilities=dc) 14 driver.get('http://www.baidu.com') 15 driver.find_element_by_id('kw').send_keys(browser) 16 driver.find_element_by_id('su').click() 17 sleep(5) 18 driver.close() 19 20 21 if __name__ == '__main__': 22 lists = {'http://10.9.xxx.xx:7777/wd/hub': 'chrome1', 23 'http://10.9.xxx.xx:5555/wd/hub': 'chrome2', 24 'http://10.9.xxx.xx:8888/wd/hub': 'chrome', 25 'http://10.9.xxx.xx:9999/wd/hub': 'chrome' 26 } 27 threads = [] 28 files = range(len(lists)) 29 30 # 创建线程 31 for host, browser in lists.items(): 32 t = Thread(target=test_sample, args=(host, browser)) 33 threads.append(t) 34 35 # 启动线程 36 for i in files: 37 threads[i].start() 38 for i in files: 39 threads[i].join() 40 print('end:%s' % ctime())