Grid介绍
Selenium Grid 是 Selenium 提供的⼀个⼯具,⽤于⽀持在多台计算机上并⾏运⾏测试。
它允许将测试分发到不同的机器和浏览器组合上,同时收集结果。
1.并⾏执⾏测试⽤例:在不同的机器上并⾏执⾏测试⽤例,从⽽加速整个测试过程。每个
节点可以并⾏地运⾏测试,⼀般⽤于⼤型测试套件和⼤规模的项⽬
2.多浏览器和多平台测试:在不同的机器上同时运⾏测试,可以同时在不同的浏览器和操作系统上执⾏测试。确保应⽤程序的跨浏览器和跨平台兼容性⾮常重要\
3. 资源最⼤化利⽤: 可以利⽤⽹络上多台机器的资源,⽽不是仅仅依赖于本地机器的资源。可以更有效地使⽤硬件资源,尤其是在⼤规模测试或者需要⼤量浏览器并⾏执⾏的情况下
4.分布式测试环境: 可以设置为在不同的物理位置、不同的⽹络环境或不同的云服务上运⾏测试。这允许你创建 ⼀个分布式的测试环境,以模拟真实的不同使⽤情境
5.提⾼可靠性: 在分布式环境下执⾏测试可以提⾼测试的可靠性。如果⼀个节点失败,其他节点仍然可以继续执⾏测 试,从⽽减⼩了整个测试过程受到⼀个节点失败的影响
Grid快速⼊⻔
1.首先我们要配置jdk的运行环境
2.安装google浏览器,并且配置chromedriver驱动
3.下载selenium-server-4.5.0.jar插件
https://github.c om/SeleniumHQ/selenium/releases/tag/selenium-4.5.0
环境都配置好后,在下载的selenium-server-4.5.0.jar所在的⽬录层级打开cmd,并且输⼊命令启动grid:
⽂件名(selenium-server-<version>.jar)尽可能的⽤tab⾃动补全,
防⽌⼿动输⼊有误
示例:
java -jar selenium-server-4.5.0.jar standalone
注:启动服务之后,切记不要关闭cmd窗⼝,否则服务就会被终⽌,
⽆法访问
启动之后,⽤google浏览器打开: http://127.0.0.1:4444,出现如下⻚⾯及成功
将执⾏⽤例的机器添加到监控端,在代码中进⾏如下配置
import allure
import pytest
from selenium import webdriver
@pytest.fixture()
def browser():
global driver
# 01 用例的前置步骤,初始化浏览器对象
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Remote(
command_executor="http://127.0.0.1:4444",
options=chrome_options
)
# 02 用例执行,返回driver
yield driver
# 03 用例的后置步骤,关闭浏览器
driver.quit()
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport():
# 获取测试用例的执行结果,yield,返回给out对象,然后再去转化为result对象
out = yield
"""
从result对象out获取调用结果的测试报告,返回一个report对象
report对象的属性:
包括when(setup,call,teardown等三个值)、nodeid(测试用例的名称)、
outcome(用例的执行结果, passed, failed)
"""
report = out.get_result() # 返回一个report对象
# 仅仅获取用例call阶段的执行结果,不包含setup、teardown
if report.when == "call":
# 获取用例call执行结果为失败的情况
xfail = hasattr(report, "wasxfail") # hasattr方法会:返回对象是否具有给定名称的属性
# 如果测试用例被跳过且标记为预期失败,或者测试用例执行失败且不是预期失败
if (report.skipped and xfail) or (report.failed and not xfail):
# 添加allure报告截图
with allure.step("添加失败的截图 ---> "):
allure.attach(driver.get_screenshot_as_png(), "失败的截图",
allure.attachment_type.PNG)
elif report.passed:
# 如果测试用例执行通过,添加allure报告截图
with allure.step("添加成功的截图 ---> "):
allure.attach(driver.get_screenshot_as_png(), "成功的截图",
allure.attachment_type.PNG)
Grid模式详解
1.Standalone(独⽴模式)
Standalone将所有Grid组件⽆缝地组合为⼀个。以独⽴模式运⾏Grid可以在单个进程中 使⽤单个命令获得功能完整的Grid。单机只能在⼀台机器上运⾏
Standalone也是运转Selenium Grid最简单的模式。默认情况下,服务器将监听 http://localho st:4444上的RemoteWebDriver请求。默认情况下,服务器将从System PATH(环境变量)中检测可⽤的驱动程序
2.Hub and Node (中⼼和节点模式)
中⼼和节点是使⽤最多的模式,因为它允许:
将不同的机器组合在⼀个Grid中
例如,使⽤不同操作系统和/或浏览器版本的机器
使⽤统⼀⼊⼝点来在不同的环境中运⾏WebDriver测试在不破坏Grid的情况下,增加或 减少组件
3.Hub(主控制节点)
Hub 是 Selenium Grid 的中⼼控制节点,负责管理和分发测试请求。
Hub 接收来⾃测试脚本的请求,然后将这些请求分发给连接到 Grid 的各个 Node 上执 ⾏。
功能:
4.Node(执⾏测试的节点)
Node 是 Selenium Grid 中的⼯作节点,负责实际执⾏测试⽤例。
⼀个 Grid 中可以有多个 Node,每个 Node 都可以运⾏在不同的机器上,甚⾄可以具有 不同的操作系统和浏览器组合。
同⼀机器上的多个节点
设置不同的端⼝
java -jar selenium-server-4.5.0.jar node --port 6666
运⾏的main.py⽂件采⽤多线程的运⾏⽅式
import pytest
if __name__ == '__main__':
pytest.main(['-vs', '-n', '3'])
什么时候应该使⽤Grid
多浏览器和多平台测试
1. 当你需要在不同的浏览器类型、版本和操作系统上同时运⾏测试时,Selenium
Grid 是⼀个理想的选择。它允许在多个节点上并⾏运⾏测试,每个节点可以代表不同的浏览 器和操作系统组合
2.减少测试执⾏时间
对于⼤型测试套件,Selenium Grid 可以显著减少测试执⾏时间。通过并⾏执⾏测试,你可以在相同的时间内完成更多的测试任务,提⾼测试效率
3.提⾼测试覆盖率
通过在不同浏览器和平台上并⾏运⾏测试,你可以更全⾯地测试应⽤程序,确保其在各种环境下的稳定性和⼀致性
4.快速反馈
缩短测试套件执⾏的时间,可以更快地获得测试结果。这对于在持续集成和持续交付环境中迅速反馈开发⼈员和团队⾮常重要
5. 资源最⼤化
利⽤多台计算机(节点)上的浏览器实例,充分利⽤可⽤资源,提⾼测试并⾏性,避免资源浪费
6. ⾃动化平台兼容性测试
当你需要测试应⽤程序在不同浏览器和平台上的兼容性时,Selenium Grid 是⼀个强⼤的⼯具。它使你能够同时在多个环境中验证应⽤程序的性能和功能
服务Grid的组件(了解)
主要包括路由器(Router)、分发器(Distributor)、会话映射(Session Map)、新会 话队列(New Session Queue)、节点(Node)和事件总线(Event Bus)
封装日志
我们新建一个pytest.ini的文件
[pytest]
log_cli = true
log_cli_level = INFO
log_cli_fromat = %(asctimes)s [%(levelname)s] %(message)s
log_cli_date_fromat = %Y-%m-%d %H:%M:%S
log_file = pytest.log
各个名词的解释
[pytest]
; 这个里面的变量名都是固定的,不能随意修改
; 启用在命令行界面(CLI)上输出日志。
log_cli = true
; 设置输出日志级别
log_cli_level = INFO
; 指定命令行页面(CLI)上日志输出的格式
; 日志记录的时间(年月日时分秒,代码格式: %Y-%m-%d %H:%M:%S)
; 日志级别
; 日志消息
log_cli_fromat = %(asctimes)s [%(levelname)s] %(message)s
; 设置时间格式
log_cli_date_fromat = %Y-%m-%d %H:%M:%S
; 设置日志保存文件
log_file = pytest.log
应用到conftest中
import logging
import allure
import pytest
from selenium import webdriver
@pytest.fixture()
def browser():
global driver
# 01 用例的前置步骤,初始化浏览器对象
driver = webdriver.Chrome()
# 02 用例执行,返回driver
yield driver
# 03 用例的后置步骤,关闭浏览器
driver.quit()
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
# 获取测试用例的执行结果,yield,返回给out对象,然后再去转化为result对象
out = yield
"""
从result对象out获取调用结果的测试报告,返回一个report对象
report对象的属性:
包括when(setup,call,teardown等三个值)、nodeid(测试用例的名称)、
outcome(用例的执行结果, passed, failed)
"""
report = out.get_result() # 返回一个report对象
# 仅仅获取用例call阶段的执行结果,不包含setup、teardown
if report.when == "call":
# 修改之前的版本:
# logging.info("--------->日志的头部<---------")
# logging.info(f"用例ID:{report.nodeid}")
# logging.info(f"测试结果:{report.outcome}")
# logging.info(f"故障标识:{report.longrepr}")
# logging.info(f"异常信息:{call.excinfo}")
# logging.info(f"用例耗时:{report.duration}")
# logging.info("--------->日志的尾部<---------")
# 修改之后的版本:
allure.attach("--------->日志的头部<---------")
allure.attach(f"用例ID:{report.nodeid}", name="用例ID")
allure.attach(f"测试结果:{report.outcome}", name="测试结果")
allure.attach(f"故障标识:{report.longrepr}", name="故障标识")
allure.attach(f"异常信息:{call.excinfo}", name="异常信息")
allure.attach(f"用例耗时:{report.duration}", name="用例耗时")
allure.attach("--------->日志的尾部<---------")
# 获取用例call执行结果为失败的情况
xfail = hasattr(report, "wasxfail") # hasattr方法会:返回对象是否具有给定名称的属性
# 如果测试用例被跳过且标记为预期失败,或者测试用例执行失败且不是预期失败
if (report.skipped and xfail) or (report.failed and not xfail):
# 添加allure报告截图
with allure.step("添加失败的截图 ---> "):
allure.attach(driver.get_screenshot_as_png(), "失败的截图",
allure.attachment_type.PNG)
elif report.passed:
# 如果测试用例执行通过,添加allure报告截图
with allure.step("添加成功的截图 ---> "):
allure.attach(driver.get_screenshot_as_png(), "成功的截图",
allure.attachment_type.PNG)