如何在 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))

希望对您有所帮助