【问题标题】:How to distribute the load efficiently with Selenium Grid如何使用 Selenium Grid 有效地分配负载
【发布时间】:2017-01-28 08:17:57
【问题描述】:

业务案例:我正在尝试自动化生产流程以用自动化取代人工。我在给定的一天以不同的时间间隔从应用程序收到许多触发器,一旦我得到触发器,脚本应该会自动开始运行。我有 80 个节点(在 80 台机器中)配置到 Selenium 集线器。

场景:触发器 1 应在其中一个空闲节点中执行 脚本 1。 触发器 2 应在其中一个空闲节点中执行脚本 2。 触发器 3 应在其中一个空闲节点中执行脚本 3。 触发器 4 应在其中一个空闲节点中执行 脚本 1

在上述场景中,脚本 1 将始终仅在一台特定机器上执行。这是因为在创建远程 Web 驱动程序对象时必须指定远程主机 url。所以如果我得到两个触发器来同时执行脚本 1时间然后执行将在同一台机器上按顺序发生,尽管我有很多机器处于空闲状态。并行执行不是这里的理想选择,因为我得到触发器来同时启动 50-60 次执行同一脚本。

问题说明:我无法有效地在空闲机器之间分配负载。

是硒网格的限制吗?有没有更好的方法来管理负载分布?是否可以在不指定节点url的情况下创建远程webdriver?

【问题讨论】:

    标签: selenium selenium-webdriver selenium-grid


    【解决方案1】:

    在上述场景中,脚本 1 总是会被一次性执行 仅限特定机器。这是因为必须指定 创建远程 Web 驱动程序对象时的远程主机 url。所以如果我得到 两个触发器同时执行脚本 1 然后执行 尽管我有很多,但会在同一台机器上按顺序发生 机器闲置。并行执行不是这里的理想选择 当我得到触发器来启动相同脚本的 50-60 次执行 同一时间。

    Grid 的构建是为了确保分配正确进行,您的测试不必解决这个问题。你是如何实例化你的 RemoteWebDriver 的?你传递给它的 URL 是什么?您应该传入 Grid Hub 的 URL,而不是节点的 URL。

    只要您的测试仅限于 DesiredCapabilities 中的浏览器风格,Hub 就能够将测试均匀地分布在所有节点上。如果您也将PLATFORM 包含在等式中,则适合匹配的节点数将减少。无论哪种情况,您都需要为您的问题提供以下附加详细信息才能获得具体答案:

    1. 你是如何启动你的节点的? [是否涉及任何节点配置 JSON? ]
    2. 你如何实例化你的RemoteWebDriver

    【讨论】:

    • 我正在使用命令“java -jar selenium-server-standalone-3.0.0.jar -role node -hub http://:4444/grid/ 手动启动节点register -browser browserName=firefox,maxInstances=1 -maxSession 1"。当节点的 url 传递给远程 Web 驱动程序对象时,我能够在远程机器中调用脚本。但是,如果传递集线器的 url,那么我就是得到以下错误
    • 2017 年 1 月 30 日上午 10:12:55 org.openqa.selenium.remote.ProtocolHandshake createSession INFO:尝试双语会话,假设 Postel 定律在远程端成立 2017 年 1 月 30 日 10 :12:55 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFO:回退到原始 OSS JSON 有线协议。 2017 年 1 月 30 日上午 10:12:55 org.openqa.selenium.remote.ProtocolHandshake createSession INFO:回退到直接 W3C 远程端连接
    • 线程“主”org.openqa.selenium.SessionNotCreatedException 中的异常:无法创建新的远程会话。所需功能 = Capabilities [{marionette=true, browserName=firefox, version=48.0.1, platform=WINDOWS}],所需功能 = Capabilities [{}] 构建信息:版本:'3.0.0',修订:'350cf60' , time: '2016-10-13 10:48:16 -0700' 系统信息: host: '', ip: '', os.name: 'Windows Server 2012 R2', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_101' 驱动信息: driver.version: RemoteWebDriver
    • 下面是实例化远程webdriver的简单脚本。System.setProperty("webdriver.gecko.driver", "D:/grid/geckodriver.exe"); DesiredCapabilities 能力 = new DesiredCapabilities("firefox", "48.0.1", Platform.ANY);能力.setCapability(“木偶”,真); RemoteWebDriver driver =new RemoteWebDriver(new URL(":4444/wd/hub"),capabilities); driver.get("myurl");
    • @SonaShetty - 网格基本上告诉你它没有任何节点可以支持 Firefox 版本 48.0.1 的自动化(这是你在 DesiredCapabilities 中要求的)。请删除 Firefox 版本,然后重试。 PS:您可能希望通过更新而不是 cmets 在原始问题本身中包含您用于创建 RemoteWEBDriver 的所有命令、日志和 java 代码。
    【解决方案2】:

    当使用 Selenium Grid 时,会设置一个 Hub,物理机在该 Hub 上注册自己的特定功能。例如,Mac 会将自己注册为带有 Safari 的 Mac。具有 FireFox 的 linux 机器和具有 IE 功能的机器的 Windows 机器。

    在您的测试中,您连接到 HUB 并请求连接到具有特定功能的机器。然后集线器回复脚本随后连接到的可用机器的地址。这是 Hub 所扮演的唯一角色,因此它应该正是您正在寻找的。​​p>

    浏览Selenium HQ 网站上的示例,它应该会为您阐明。此示例可以在单台机器上运行,但理想情况下最好将其拆分到多台机器上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多