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

时间:2016-12-13 17:22:12

标签: c# selenium internet-explorer selenium-webdriver selenium-grid2

我在使用Selenium Grid并尝试使用特定版本的IE注册节点时遇到问题,然后调用Grid Hub以获取该浏览器的实例。我的设置:

  • 带有C#绑定的Selenium 3.0.1
  • 使用我的NUnit 3.5测试定义我的页面对象/框架和一个类库的一个类库
  • 一台运行Server 2008托管数据库的虚拟机和我的Selenium Grid Hub,以“java -jar C:\ Selenium \ selenium-server-standalone-3.0.1.jar -role hub -maxSession 20”开头
  • 一台运行带有IE9和我的webdriver节点的Windows 7的虚拟机

我启动了我的节点(为了便于阅读,我添加了换行符,它是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时,集线器返回:

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”并将browserName设置为“iexplore”而不是“Internet explorer”,因为我在网上发现的一些帖子没有成功。我花了两个小时挖掘谷歌和Selenium文档,但似乎没有人对各种浏览器的“版本”功能的预期格式进行枚举,所以我甚至无法确定我是否正在使用正确的价值观如果我从节点启动批处理中删除版本标志,并在我的C#代码中调用setCapability调用版本,则浏览器启动正常。但是,我将要有一个带有多个IE变体的网格进行测试,并且需要能够指定我想要的IE版本。任何人都可以帮助我以正确的方式为特定版本的IE启动节点,将该节点注册到集线器,并使用RemoteWebDriver调用它吗?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案 - 虽然我无法使用命令行参数获取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中的int,所以通过命令行传入的参数可能被错误地解释了?无论哪种方式,这都很有效,我更喜欢用命令行args配置JSON节点。它更干净。