selenium-grid分布式测试环境

1.什么时候使用grid

  • 针对不同的操作系统、浏览器类型、浏览器版本
  • 并发执行用例,缩短用例执行时间(单台电脑性能不足)

grid是一个庞大的、复杂的分布式组件,本身有额外的开销

2.启动grid

下载地址:https://www.selenium.dev/downloads/

  1. 下载jar包
  2. 配置jdk
  3. 执行命令,启动jar包

启动命令:java -jar selenium-server-4.18.1.jar  standalone

 启动流程:

  1. 检查CPU内核数量
  2. 检查提示'--selenium-manager true' 参数
  3. 检查已安装浏览器
  4. 检查浏览器驱动版本
  5. 启动web服务http://169.254.250.99:4444

注意:

  1. 如果没有任何合适的浏览器驱动,grid启动失败
  2. 添加参数'--selenium-manager true' 进行驱动自动下载
  3. 也可以使用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

常用的配置项:

  1. 设置账号:username
  2. 设置密码:password
    1. 命令:java -jar selenium-server-4.18.1.jar  standalone --username test001 --password 123456
  3. 设置端口:port
    1. 命令:java -jar selenium-server-4.18.1.jar  standalone --port 8899 
  4. 最大会话数:--max-sessions
    1. 命令:java -jar selenium-server-4.18.1.jar  standalone --max-sessions 4
  5. 最大空闲时间:--session-timeout
    1. 命令: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

 

posted @ 2024-03-02 08:34  万溪汇海  阅读(132)  评论(0编辑  收藏  举报