Selenium Grid:节点API?

时间:2018-11-26 18:57:47

标签: selenium selenium-grid

问题:

我想在AWS上运行Selenium Grid,并希望使用其动态缩放。按比例缩小时,它将仅终止一个实例……这意味着节点可以像这样消失。不是我想要的行为,而是使用脚本或生命周期挂钩,我可以尝试确保节点上的任何会话在终止之前都不处于活动状态。

好像我可以点击此API断开节点与集线器的连接:http://NODE-IP:5555/selenium-server/driver/?cmd=shutDownSeleniumServer

理想情况下,我需要直接找到该节点的API来收集会话活动的数据。

替代品?会话日志?

1 个答案:

答案 0 :(得分:0)

注意: 此答案仅对Selenium 3.x系列有效(3.14.1是今天的Selenium 3系列的最后一个构建版本)。 Selenium 4网格体系结构是一种完全不同的体系结构,因此,此答案不一定与Selenium 4网格相关(尚未发布)。

事物的结合。您所要求的声音就像您需要一种自我修复机制。普通的香草硒网格味无法提供此功能。

Selenium节点不具有跟踪其中运行的会话的功能。

您需要在Selenium Hub(所有这些信息所在的位置)中构建所有这些文件。

从总体上讲,您需要执行以下操作

  1. 通过扩展org.openqa.grid.selenium.proxy.DefaultRemoteProxy来构建自定义代理,该代理将具有以下功能:
    1. 添加一个API,使用该API会将代理标记为 quiesced (表示该节点已被标记为维护且将不再接受任何新的会话请求)
    2. 覆盖getNewSession(Map<String, Object> requestedCapability),以便它首先检查节点是否处于静止状态,然后才促进新会话。
  2. 构建一个自定义servlet,在调用它时可以执行以下操作:
    1. 给定一个节点,它可以使用通过1.1构建的API,并将节点标记为 quiesced
    2. 将返回没有任何会话在其中运行的节点的列表。如果您通过扩展org.openqa.grid.web.servlet.RegistryBasedServlet来构建servlet,则在servlet中您应该能够通过执行以下操作来获取空闲节点网址的列表
List<RemoteProxy> freeProxies =
    StreamSupport.stream(getRegistry().getAllProxies().spliterator(), false)
        .filter(remoteProxy -> !remoteProxy.isBusy())
        .collect(Collectors.toList());
List<URL> urls =
    freeProxies.stream().map(RemoteProxy::getRemoteHost).collect(Collectors.toList());

现在我们有了自定义的集线器,该集线器现在已经启用了执行清理的功能,您现在可以首先调用2.1端点以将节点标记为关闭,然后继续轮询2.2端点以检索所有IP和不再支持任何测试会话的节点的端口组合,然后在它们上调用http://NODE-IP:5555/selenium-server/driver/?cmd=shutDownSeleniumServer

从总体上讲,它可以满足您的需求。

一些有用的链接可以帮助您了解这一点(所有提供的链接都是我在不同时间撰写的博客)。

  1. 自我修复网格-https://rationaleemotions.wordpress.com/2013/01/28/building-a-self-maintaining-grid-environment/
  2. 构建自定义代理-https://rationaleemotions.github.io/gridopadesham/CUSTOM_PROXY.html
  3. 为中心构建自定义servlet-https://rationaleemotions.github.io/gridopadesham/CUSTOM_SERVLETS.html