Selenium RemoteWebDriver против службы Windows ChromeDriver

Контекст:

  • 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 для 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 я создал приложение С# следующим образом:

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);

Когда я шагаю по программе, я получаю The HTTP request to the remote WebDriver server for URL http://localhost:12942/session timed out after 60 seconds. в строке new RemoteWebDriver.

В 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

У меня есть далекое воспоминание об успешном общении с chromedriver.exe, обернутым в NSSM, в начале этого года. Я не могу найти код сейчас. Что мне здесь не хватает?


person bugmagnet    schedule 11.08.2016    source источник


Ответы (1)


Вы используете RemoteWebDriver в качестве клиента. Указанный вами адрес должен быть URL-адресом концентратора Selenium Grid, а не URL-адресом chromedriver.

Вы должны либо настроить 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 с Интернетом (или с вашим веб-приложением).

person Paul Hicks    schedule 11.08.2016
comment
Я не использую Selenium Grid (еще не читал дружественное руководство по этому поводу.) Итак, этот подход подключается к службе Windows ChromeDriverService, обернутой в NSSM, или обходит ее в пользу явного Selenium ChromeDriverService? - person bugmagnet; 11.08.2016
comment
Уместно ли добавить service.PortServerAddress = localhost; сервис.Порт = 12942; ? - person bugmagnet; 11.08.2016
comment
Вам не нужно PortServerAddress, если вы работаете на локальном хосте. Обновление порта — это хорошо, если только вы не используете порт по умолчанию. - person Paul Hicks; 11.08.2016
comment
Однако попытка поместить порт в ChromeOptions не работает. - person bugmagnet; 11.08.2016
comment
Запуск chromedriver.exe через NSSM в порядке. Использование ChromeDriver не устраняет необходимость в chromedriver.exe. Название неудачное, потому что ChromeDriver класс — это клиент, а chromedriver.exe — это сервер для клиента. Это также клиент, поскольку он отправляет запросы запущенному экземпляру Chrome. Но это выходит за рамки проблемной области Selenium; Selenium останавливается на службе json, предоставляемой chromedriver.exe. - person Paul Hicks; 11.08.2016
comment
Ой мой плохой. Порт предназначен для настройки службы, а не параметров. Onesec, я обновлю ответ. - person Paul Hicks; 11.08.2016