【问题标题】:Selenium RemoteWebDriver against a Windows Service of ChromeDriverSelenium RemoteWebDriver 针对 ChromeDriver 的 Windows 服务
【发布时间】:2016-08-11 02:32:00
【问题描述】:

上下文:

  • Windows 10 家庭版;
  • Visual Studio 2015 社区;
  • C#;
  • NSSM;
  • ChromeDriver 2.23.409699 (49b0fa931cda1caad0ae15b7d1b68004acd05129);
  • Nuget 包 Selenium.WebDriver.2.53.1;
  • Nuget 包 Selenium.WebDriver.ChromeDriver.2.23.0.1

我使用NSSM创建了一个Windows Service wrapping chromedriver.exe,设置如下:

Path: c:\bin\chromedriver.exe
Startup Directory: c:\bin
Arguments: --port=12942 --log-path=c:\temp\chromedriver.log --verbose 
Service Name: ChromeDriverService

在 VS2015Community 中,我创建了一个 C# 应用程序,如下所示:

var uri = new Uri("http://localhost:12942");
DesiredCapabilities dc = DesiredCapabilities.Chrome();
ChromeOptions options = new ChromeOptions();            
options.BinaryLocation = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe";
options.LeaveBrowserRunning = true;
dc.IsJavaScriptEnabled = true;            
IWebDriver driver = new RemoteWebDriver(uri, dc);

当我单步执行该程序时,我在new RemoteWebDriver 行上得到一个The HTTP request to the remote WebDriver server for URL http://localhost:12942/session timed out after 60 seconds.

c:\temp\chromedriver.log 我得到以下信息:

[44.717][INFO]: COMMAND InitSession {
   "desiredCapabilities": {
      "browserName": "chrome",
      "javascriptEnabled": true,
      "platform": "ANY",
      "version": ""
   }
}
[66.168][INFO]: Populating Preferences file: {
   "alternate_error_pages": {
      "enabled": false
   },
   "autofill": {
      "enabled": false
   },
   "browser": {
      "check_default_browser": false
   },
   "distribution": {
      "import_bookmarks": false,
      "import_history": false,
      "import_search_engine": false,
      "make_chrome_default_for_user": false,
      "show_welcome_page": false,
      "skip_first_run_ui": true
   },
   "dns_prefetching": {
      "enabled": false
   },
   "profile": {
      "content_settings": {
         "pattern_pairs": {
            "https://*,*": {
               "media-stream": {
                  "audio": "Default",
                  "video": "Default"
               }
            }
         }
      },
      "default_content_setting_values": {
         "geolocation": 1
      },
      "default_content_settings": {
         "geolocation": 1,
         "mouselock": 1,
         "notifications": 1,
         "popups": 1,
         "ppapi-broker": 1
      },
      "password_manager_enabled": false
   },
   "safebrowsing": {
      "enabled": false
   },
   "search": {
      "suggest_enabled": false
   },
   "translate": {
      "enabled": false
   }
}
[66.171][INFO]: Populating Local State file: {
   "background_mode": {
      "enabled": false
   },
   "ssl": {
      "rev_checking": {
         "enabled": false
      }
   }
}
[68.099][INFO]: Can not set to US keyboard layout - Some keycodes may beinterpreted incorrectly
[68.099][INFO]: Launching chrome: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-background-networking --disable-client-side-phishing-detection --disable-component-update --disable-default-apps --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --disable-web-resources --enable-logging --ignore-certificate-errors --load-component-extension="C:\WINDOWS\TEMP\scoped_dir5436_17406\internal" --log-level=0 --metrics-recording-only --no-first-run --password-store=basic --remote-debugging-port=12772 --safebrowsing-disable-auto-update --test-type=webdriver --use-mock-keychain --user-data-dir="C:\WINDOWS\TEMP\scoped_dir5436_20664" data:,
[68.127][DEBUG]: DevTools request: http://localhost:12772/json/version
[70.154][DEBUG]: DevTools response: {

   "Browser": "Chrome/52.0.2743.116",

   "Protocol-Version": "1.1",

   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",

   "WebKit-Version": "537.36 (@9115ecad1cae66fd5fe52bd9120af643384fd6f3)"

}


[70.155][DEBUG]: DevTools request: http://localhost:12772/json
[70.168][DEBUG]: DevTools response: [  ]

... a minute's worth of the above two lines removed ...

[128.264][INFO]: RESPONSE InitSession unknown error: unable to discover open pages
[128.264][DEBUG]: Log type 'driver' lost 0 entries on destruction
[128.264][DEBUG]: Log type 'browser' lost 0 entries on destruction

我有一个遥远的记忆,今年早些时候成功地与一个 NSSM 包装的 chromedriver.exe 进行了交谈。我现在找不到代码。我在这里错过了什么?

【问题讨论】:

    标签: c# selenium remotewebdriver nssm


    【解决方案1】:

    您使用RemoteWebDriver 作为您的客户。您提供的地址应该是 Selenium Grid hub URL,而不是 chromedriver URL。

    您应该configure Selenium Grid 了解 chromedriver,或者从RemoteWebDriver 切换到ChromeDriver 作为您的客户。

    ChromeDriver 连接到任何机器上由 chromedriver.exe 提供的服务,这可能是关于 RemoteWebDriver 的混淆之处。RemoteWebDriver 表示“任何浏览器,任何地方,由 Selenium Grid 集线器选择使用您提供的标准”。 ChromeDriver 表示“任何 Chrome,在您选择的一个特定位置”。

    如果切换到ChromeDriver,这段代码运行良好:

    var service = ChromeDriverService.CreateDefaultService();
    // service.EnableVerboseLogging = true;
    service.Port = 12942;
    var options = new ChromeOptions
    {
        Proxy = new Proxy {Kind = ProxyKind.Direct}
    };
    
    return new ChromeDriver(service, options);
    

    您可以为该服务提供更多选项。

    除此之外:请注意,您将服务配置为自定义 ChromeDriver 与 chromedriver.exe 对话的方式;您可以配置 ChromeOptions 来自定义 Chrome 与互联网(或您的网络应用程序)对话的方式。

    【讨论】:

    • 我没有使用 Selenium Grid(还没有阅读关于它的友好手册。)所以这种方法是挂钩到 NSSM 包装的 ChromeDriverService Windows 服务或绕过它以支持显式 Selenium ChromeDriverService?
    • 添加service.PortServerAddress = "localhost"是否合适服务端口 = 12942; ?
    • 如果您在本地主机上工作,则不需要PortServerAddress。更新端口很好,除非您使用默认端口。
    • 但是,尝试将端口放入 ChromeOptions 不起作用。
    • 通过 NSSM 运行 chromedriver.exe 没问题。使用 ChromeDriver 并不能消除对 chromedriver.exe 的要求。命名是不幸的,因为ChromeDriver类是客户端,而chromedriver.exe是客户端的服务器。它也是一个客户端,因为它将请求发送到正在运行的 chrome 实例。但这超出了 Selenium 的问题域。 Selenium 在 chromedriver.exe 提供的 json 服务处“停止”。
    猜你喜欢
    • 2012-03-21
    • 2014-12-15
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2010-09-12
    • 2017-03-27
    • 1970-01-01
    相关资源
    最近更新 更多