如何在 Selenium Grid 中终止会话(附加)
How to terminate session in Selenium Grid(Extras)
如何在 Selenium Grid 中终止会话?我的问题是,如果我的测试失败集线器仍然保持此测试的会话并且我不能 运行 另一个测试(它 运行 但失败是因为无法获得空闲节点,因为它已在集线器中注册).我找到了这个 How to kill thread in a Selenium Grid node 并且有一个使用 DELETE /session/:sessionId
的答案,但它对我不起作用。 Selenium Grid 或 Extras 的文档非常纯粹,也许有人有类似的问题并且知道如何解决它?
集线器从不拒绝新的会话请求,因为插槽不可用。新会话在网格的队列中结束。
您需要查看您的代码以检查为什么 driver.quit()
没有一直被调用(不管测试失败的原因)。
有时您的客户端可能会崩溃(例如,您的测试用例 运行 所在的 JVM 可能会崩溃,或者您可能会点击 IDE 中的 stop button
来终止您的测试。在这种情况下,您最终会创建孤立的会话。
但是 Grid 也有清除它们的机制,通过您可以在启动 Grid 时指定给 Grid 的属性。
selenium Grid 专门具有三个用于此类清理的参数。
-browserTimeout
以秒为单位:当 WebDriver 命令 运行ning 时允许浏览器会话挂起的秒数(示例:driver.get(url))。如果在 WebDriver 命令仍在处理时达到超时,会话将退出。最小值为 60。未指定的零值或负值表示无限期等待。 Default: 0
-cleanUpCycle
以毫秒为单位:指定集线器轮询 运行ning 代理超时(即挂起)的频率线程。还必须指定 timeout
选项。Default: 5000
(5 秒)
-timeout
, -sessionTimeout
in seconds : 指定服务器超时前自动终止在过去 X 秒内没有任何 activity 的会话。然后将释放测试槽以供另一次测试使用。这通常用于处理客户端崩溃。对于网格 hub/node 角色,还必须设置 cleanUpCycle。 Default: 1800
结合使用上述所有 3 个参数,您可以将节点配置为自动关闭 孤立 浏览器实例和会话。
此文档在 selenium uber jar 本身中作为命令行文档提供。您可以参考 SO 答案以了解如何获取它并查看其他可用选项。
Grid'2 维基页面 here.
上有一些与 timeouts
相关的附加文档
有关更多信息,请参阅我在 Whosebug post 中的评论:
删除方法对我有用。这是我的 python 代码:
def clear_sessions(session_id=None):
"""
Here we query and delete orphan sessions
docs: https://www.selenium.dev/documentation/grid/advanced_features/endpoints/
:return: None
"""
url = "http://127.0.0.1:4444"
if not session_id:
# delete all sessions
r = requests.get("{}/status".format(url))
data = json.loads(r.text)
for node in data['value']['nodes']:
for slot in node['slots']:
if slot['session']:
id = slot['session']['sessionId']
r = requests.delete("{}/session/{}".format(url, id))
else:
# delete session from params
r = requests.delete("{}/session/{}".format(url, session_id))
希望对您有所帮助
如何在 Selenium Grid 中终止会话?我的问题是,如果我的测试失败集线器仍然保持此测试的会话并且我不能 运行 另一个测试(它 运行 但失败是因为无法获得空闲节点,因为它已在集线器中注册).我找到了这个 How to kill thread in a Selenium Grid node 并且有一个使用 DELETE /session/:sessionId
的答案,但它对我不起作用。 Selenium Grid 或 Extras 的文档非常纯粹,也许有人有类似的问题并且知道如何解决它?
集线器从不拒绝新的会话请求,因为插槽不可用。新会话在网格的队列中结束。
您需要查看您的代码以检查为什么 driver.quit()
没有一直被调用(不管测试失败的原因)。
有时您的客户端可能会崩溃(例如,您的测试用例 运行 所在的 JVM 可能会崩溃,或者您可能会点击 IDE 中的 stop button
来终止您的测试。在这种情况下,您最终会创建孤立的会话。
但是 Grid 也有清除它们的机制,通过您可以在启动 Grid 时指定给 Grid 的属性。
selenium Grid 专门具有三个用于此类清理的参数。
-browserTimeout
以秒为单位:当 WebDriver 命令 运行ning 时允许浏览器会话挂起的秒数(示例:driver.get(url))。如果在 WebDriver 命令仍在处理时达到超时,会话将退出。最小值为 60。未指定的零值或负值表示无限期等待。Default: 0
-cleanUpCycle
以毫秒为单位:指定集线器轮询 运行ning 代理超时(即挂起)的频率线程。还必须指定timeout
选项。Default: 5000
(5 秒)-timeout
,-sessionTimeout
in seconds : 指定服务器超时前自动终止在过去 X 秒内没有任何 activity 的会话。然后将释放测试槽以供另一次测试使用。这通常用于处理客户端崩溃。对于网格 hub/node 角色,还必须设置 cleanUpCycle。Default: 1800
结合使用上述所有 3 个参数,您可以将节点配置为自动关闭 孤立 浏览器实例和会话。
此文档在 selenium uber jar 本身中作为命令行文档提供。您可以参考
Grid'2 维基页面 here.
上有一些与timeouts
相关的附加文档
有关更多信息,请参阅我在 Whosebug post 中的评论:
删除方法对我有用。这是我的 python 代码:
def clear_sessions(session_id=None):
"""
Here we query and delete orphan sessions
docs: https://www.selenium.dev/documentation/grid/advanced_features/endpoints/
:return: None
"""
url = "http://127.0.0.1:4444"
if not session_id:
# delete all sessions
r = requests.get("{}/status".format(url))
data = json.loads(r.text)
for node in data['value']['nodes']:
for slot in node['slots']:
if slot['session']:
id = slot['session']['sessionId']
r = requests.delete("{}/session/{}".format(url, id))
else:
# delete session from params
r = requests.delete("{}/session/{}".format(url, session_id))
希望对您有所帮助