Selenium Grid - 指定 IE 版本时找不到功能

Selenium Grid - Cannot Find Capabilities When Specifying IE Version

我 运行 在使用 Selenium Grid 并尝试使用特定版本的 IE 注册节点然后为该浏览器的实例调用 Grid Hub 时遇到了一个问题。我的设置:

我开始我的节点(为了便于阅读,我添加了换行符,它是 bat 文件中的一行):

java -Dwebdriver.ie.driver=C:\Selenium\IEDriverServer.exe -Dwebdriver.chrome.driver=C:\Selenium\chromedriver.exe -jar C:\Selenium\selenium-server-standalone-3.0.1.jar -role webdriver -hub http://10.10.1.20:4444/grid/register -port 5566 -maxSession 20
-browser "browserName=internet explorer,version=9,maxInstances=1,platform=ANY,seleniumProtocol=WebDriver"
-browser "browserName=chrome,maxInstances=5"
-browser "browserName=firefox,maxInstances=5"

我调用 RemoteWebDriver 的代码是:

caps = new DesiredCapabilities();
caps.SetCapability("browserName", "internet explorer");
caps.SetCapability("version", "9");
WebDriver = new RemoteWebDriver(new System.Uri("http://10.10.1.20:4444/wd/hub"), caps);

当我 运行 这段代码时,当代码创建新的 RemoteWebDriver 集线器时 returns:

INFO - Got a request to create a new session: Capabilities [{browserName=internet explorer, version=9}]

Visual Studio 然后显示返回以下错误:

System.InvalidOperationException : Error forwarding the new session cannot find : Capabilities [{browserName=internet explorer, version=9}] TearDown : System.NullReferenceException : Object reference not set to an instance of an object.

我尝试将节点和我的代码设置为使用“9.0”而不是“9”,并将浏览器名称设置为 "iexplore" 而不是 "internet explorer",就像我在网上找到的一些帖子一样建议,没有成功。我花了两个小时研究 Google 和 Selenium 文档,但似乎没有人枚举各种浏览器的 "version" 功能的预期格式,所以我什至不能确定我使用的是正确的值。如果我从节点启动批处理中删除版本标志并在我的 C# 代码中删除对版本的 setCapability 调用,浏览器将正常启动。但是,我将有一个包含多个 IE 变体的网格用于测试,并且需要能够指定我想要的 IE 版本。任何人都可以帮助我以正确的方式为特定版本的 IE 启动节点,将该节点注册到集线器,并使用 RemoteWebDriver 调用它吗?

我找到了解决方案 - 虽然我无法使用命令行参数获取特定版本的 IE 实例,但我可以使用基于 JSON 的配置来获取。我现在使用以下命令启动我的 Selenium 网格节点:

java -Dwebdriver.ie.driver=C:\SeleniumGrid\IEDriverServer.exe -Dwebdriver.chrome.driver=C:\SeleniumGrid\chromedriver.exe -jar C:\SeleniumGrid\selenium-server-standalone-3.0.1.jar -role webdriver -nodeConfig "C:\SeleniumGrid\NodeIE9.json"

我的 NodeIE9.json 文件包含以下内容:

{
  "capabilities":
  [

    {
      "browserName": "firefox",
      "maxInstances": 5,
      "seleniumProtocol": "WebDriver"
    },
    {
      "browserName": "chrome",
      "maxInstances": 5,
      "seleniumProtocol": "WebDriver"
    },
    {
      "browserName": "internet explorer",
      "version": "9",
      "maxInstances": 1,
      "seleniumProtocol": "WebDriver"
    }
  ],
  "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
  "maxSession": 11,
  "port": 5555,
  "register": true,
  "registerCycle": 5000,
  "hub": "http://10.10.1.20:4444",
  "nodeStatusCheckTimeout": 5000,
  "nodePolling": 5000,
  "role": "node",
  "unregisterIfStillDownAfter": 60000,
  "downPollingLimit": 2,
  "debug": false,
  "servlets" : [],
  "withoutServlets": [],
  "custom": {}
}

我在某处看到一个建议,提到 "version" 属性 需要是一个字符串而不是 JSON 中的一个整数,所以可能是通过命令行传入的参数被错误地解释了吗?无论哪种方式,这都非常有效,无论如何我更喜欢使用 JSON 配置节点而不是命令行参数。更干净了。