selenium-grid分布式测试环境
1.什么时候使用grid
- 针对不同的操作系统、浏览器类型、浏览器版本
- 并发执行用例,缩短用例执行时间(单台电脑性能不足)
grid是一个庞大的、复杂的分布式组件,本身有额外的开销
2.启动grid
下载地址:https://www.selenium.dev/downloads/
- 下载jar包
- 配置jdk
- 执行命令,启动jar包
启动命令:java -jar selenium-server-4.18.1.jar standalone
启动流程:
- 检查CPU内核数量
- 检查提示'--selenium-manager true' 参数
- 检查已安装浏览器
- 检查浏览器驱动版本
- 启动web服务http://169.254.250.99:4444
注意:
- 如果没有任何合适的浏览器驱动,grid启动失败
- 添加参数'--selenium-manager true' 进行驱动自动下载
- 也可以使用webdriver-helper加速下载驱动,下载后要重新启动grid
3.连接到grid
连接到grid一定要记得关闭浏览器
- pytest的fixture后置操作
- python的上下文管理器with
from selenium import webdriver url = 'http://169.254.250.99:4444' driver = webdriver.Chrome() # 启动本地chrome options = webdriver.ChromeOptions() # 申明浏览器类型 driver = webdriver.Remote(url, options=options) # 启动远程的chrome with driver: driver.get('https://qq.com') #driver.quit() #关闭远程chrome
连接到grid之后,使用方法和本地selenium webdriver完全一致
4.配置grid
常用的配置项:
- 设置账号:username
- 设置密码:password
- 命令:java -jar selenium-server-4.18.1.jar standalone --username test001 --password 123456
- 设置端口:port
- 命令:java -jar selenium-server-4.18.1.jar standalone --port 8899
- 最大会话数:--max-sessions
- 命令:java -jar selenium-server-4.18.1.jar standalone --max-sessions 4
- 最大空闲时间:--session-timeout
- 命令:java -jar selenium-server-4.18.1.jar standalone --session-timeout 10
java -jar selenium-server-4.18.1.jar standalone --username test001 --password 123456 --port 6666 --max-sessions 6 --session-timeout 60
from selenium import webdriver url = 'http://test001:123456@169.254.250.99:6666' driver = webdriver.Chrome() # 启动本地chrome options = webdriver.ChromeOptions() # 申明浏览器类型 driver = webdriver.Remote(url, options=options) # 启动远程的chrome with driver: driver.get('https://qq.com') #driver.quit() #关闭远程chrome
5.和框架集成
commons/driver.py
1 from selenium import webdriver 2 from commons.settings import * 3 4 remote_webdriver_url = 'http://test001:123456@169.254.250.99:4444' #远程chrome地址,账号 5 6 7 def get_webdriver(): 8 '''启动本地chrome''' 9 return webdriver.Chrome() # 1.启动浏览器 10 11 12 def get_remote_webdriver(): 13 '''启动远程chrome''' 14 15 driver = webdriver.Chrome() # 启动本地chrome 16 17 options = webdriver.ChromeOptions() # 申明浏览器类型 18 driver = webdriver.Remote(remote_webdriver_url, options=options) # 启动远程的chrome 19 return driver
conftest.py
1 @pytest.fixture(scope='session') 2 def remote_user_driver(): 3 driver = get_remote_webdriver() # 1.启动浏览器 4 driver.maximize_window() 5 base_url = 'http://101.34.221.219:8010' 6 driver.get(f'{base_url}/?s=user/logininfo.html') 7 8 page = LoginPage(driver) 9 msg = page.login(username, password) 10 11 assert msg == '登录成功' 12 13 yield driver 14 15 driver.quit() # 关闭浏览器
tests/excel/test_login.xlsx
6.架构
第一次请求:client->router->session queue->distributor->nodes-session map
第一次请求 通过路由,把请求放入队列,distributor从队列拿出请求,去nodes里面找相应的资源(webdriver),在通过distributor,最后存入到map中
第二次请求:client->router->session map->nodes
第二次请求 通过路由,直接进入node(已经有第一次连接了,不需要再走第一次的流程),在通过distributor,,最后存入到map中
内部资源:event bus
event bus:内部通信及资源控制
外部资源:session map