如何确定测试已在 Selenium 网格上完成
How to determine a test has finished on a Selenium Grid
我正在寻找一种方法来确保在对 Selenium Grid 节点进行每次测试后发生某些事情。 (例如控制节点上的某些进程)
在 Selenium Grid 上最好的方法是什么?也许我不需要重新发明轮子,并且有一些方法可以使用 Selenium Grid 基础设施以编程方式确定节点上的测试何时完成?
使用 SessionIds ,
以下 python 代码将从网格中打印会话信息
import urllib.request
import json
grid_url = "http://127.0.0.1:4444/wd/hub"
sessions_req = urllib.request.urlopen(grid_url + "/sessions")
sessions_data = sessions_req.read()
sessions_encoding = sessions_req.info().get_content_charset('utf-8')
sessions = json.loads(sessions_data.decode(sessions_encoding))
for session in sessions["value"]:
print (session["id"])
print (session["capabilities"]["browserName"])
输出应该是:
26294a77-7ab2-47f1-81fd-e11f593bd960
firefox
29aa25cb-a60a-4454-a35c-315f76ff1251
chrome
测试完成后,您可以断言 sessionId 以确定测试的状态。活动会话必须有一个 ID。要深入了解该特定测试,请将会话 ID 注入驱动程序实例并使用 getCurrentUrl() 或 takeScreenshot() 方法。
如果您的重点是管理孤立浏览器,那么 selenium Grid 可以在配置级别为您提供帮助。硒网格特别具有三个用于清理的参数。
browserTimeout 以秒为单位:当 WebDriver 命令为 运行 时允许浏览器会话挂起的秒数(示例:
driver.get(url))。如果在 WebDriver 命令时达到超时
仍在处理中,会话将退出。最小值为 60。
未指定、零或负值意味着无限期等待。
默认值:0
cleanUpCycle in milliseconds : 指定集线器轮询的频率
运行 超时(即挂起)线程的代理。还必须指定
超时 option.Default:5000(5 秒)
timeout, -sessionTimeout in seconds : 指定超时时间
服务器自动终止没有任何会话的会话 activity
在最后 X 秒内。然后将释放测试槽以供另一次测试使用。这通常用于照顾客户
崩溃。对于网格 hub/node 角色,还必须设置 cleanUpCycle。
默认值:1800
结合使用以上所有 3 个参数,您
可以将您的节点配置为自动关闭孤立的浏览器
实例和会话。
您可以通过两种方式做到这一点
- 如果您希望无论测试完成什么都进行清理,即假设您不关心测试,您只想知道用户何时调用 driver.quit() 表示终止向集线器发送会话消息,以便您可以 运行 在节点上进行某种清理。
为了实现这一点,您应该构建自己的自定义代理(通过扩展 org.openqa.grid.selenium.proxy.DefaultRemoteProxy
)并将您的清理逻辑作为 afterSession()
的一部分嵌入,以便它在 [=12] 之后执行=] 被执行但在会话被网格释放之前。您需要确保不会在此处触发任何异常。请参阅我在网格上写的 this 文章,以帮助您了解如何使用自定义代理。
(或)
- 如果您希望仅针对某些特定测试进行清理,即假设您可能已经运行进行了一些特定测试,您希望为这些测试完成屏幕录制并且只想为那些请求它的测试停止它。
如果这是你想要的,那么
- 首先,您应该构建一个 servlet,调用它可以为您进行清理。您只需将此 servlet 注入节点。要了解如何执行此操作,请参阅我的 this 文章。
在调用 driver.quit()
之前,您应该执行以下操作:
现在调用 driver.quit()
后,通过使用从上面获得的 IP 和端口地址,触发对添加到节点的 servlet 的 http 操作 (GET/POST)
。
我正在寻找一种方法来确保在对 Selenium Grid 节点进行每次测试后发生某些事情。 (例如控制节点上的某些进程)
在 Selenium Grid 上最好的方法是什么?也许我不需要重新发明轮子,并且有一些方法可以使用 Selenium Grid 基础设施以编程方式确定节点上的测试何时完成?
使用 SessionIds ,
以下 python 代码将从网格中打印会话信息
import urllib.request
import json
grid_url = "http://127.0.0.1:4444/wd/hub"
sessions_req = urllib.request.urlopen(grid_url + "/sessions")
sessions_data = sessions_req.read()
sessions_encoding = sessions_req.info().get_content_charset('utf-8')
sessions = json.loads(sessions_data.decode(sessions_encoding))
for session in sessions["value"]:
print (session["id"])
print (session["capabilities"]["browserName"])
输出应该是:
26294a77-7ab2-47f1-81fd-e11f593bd960 firefox
29aa25cb-a60a-4454-a35c-315f76ff1251 chrome
测试完成后,您可以断言 sessionId 以确定测试的状态。活动会话必须有一个 ID。要深入了解该特定测试,请将会话 ID 注入驱动程序实例并使用 getCurrentUrl() 或 takeScreenshot() 方法。
如果您的重点是管理孤立浏览器,那么 selenium Grid 可以在配置级别为您提供帮助。硒网格特别具有三个用于清理的参数。
browserTimeout 以秒为单位:当 WebDriver 命令为 运行 时允许浏览器会话挂起的秒数(示例: driver.get(url))。如果在 WebDriver 命令时达到超时 仍在处理中,会话将退出。最小值为 60。 未指定、零或负值意味着无限期等待。 默认值:0
cleanUpCycle in milliseconds : 指定集线器轮询的频率 运行 超时(即挂起)线程的代理。还必须指定 超时 option.Default:5000(5 秒)
timeout, -sessionTimeout in seconds : 指定超时时间 服务器自动终止没有任何会话的会话 activity 在最后 X 秒内。然后将释放测试槽以供另一次测试使用。这通常用于照顾客户
崩溃。对于网格 hub/node 角色,还必须设置 cleanUpCycle。
默认值:1800
结合使用以上所有 3 个参数,您 可以将您的节点配置为自动关闭孤立的浏览器 实例和会话。
您可以通过两种方式做到这一点
- 如果您希望无论测试完成什么都进行清理,即假设您不关心测试,您只想知道用户何时调用 driver.quit() 表示终止向集线器发送会话消息,以便您可以 运行 在节点上进行某种清理。
为了实现这一点,您应该构建自己的自定义代理(通过扩展 org.openqa.grid.selenium.proxy.DefaultRemoteProxy
)并将您的清理逻辑作为 afterSession()
的一部分嵌入,以便它在 [=12] 之后执行=] 被执行但在会话被网格释放之前。您需要确保不会在此处触发任何异常。请参阅我在网格上写的 this 文章,以帮助您了解如何使用自定义代理。
(或)
- 如果您希望仅针对某些特定测试进行清理,即假设您可能已经运行进行了一些特定测试,您希望为这些测试完成屏幕录制并且只想为那些请求它的测试停止它。
如果这是你想要的,那么
- 首先,您应该构建一个 servlet,调用它可以为您进行清理。您只需将此 servlet 注入节点。要了解如何执行此操作,请参阅我的 this 文章。
在调用
driver.quit()
之前,您应该执行以下操作:
现在调用 driver.quit()
后,通过使用从上面获得的 IP 和端口地址,触发对添加到节点的 servlet 的 http 操作 (GET/POST)
。