Как программно отключить Cloud Print «Новый принтер в вашей сети» для Selenium ChromeDriver? - PullRequest
0 голосов
/ 29 ноября 2018

Как программно отключить облачную печать Chrome «Новый принтер в вашей сети» при настройке параметров ChromeDriver для Selenium?

При каждом запуске ChromeDriver всплывающее окно облачной печати появляется в течение нескольких секунд.

Cloud Print Chrome popup

Можно отключить всплывающее окно Cloud Print для обычного пользователя Chrome, отключив его в chrome://settings.

Chrome settings to disable the cloud print popup

AFAIK отключает его для профиля Chrome, но это не работает для Selenium, поскольку каждый новый экземпляр драйвера имеет профиль чистого листа.Кроме того, я не хочу делать автоматизацию пользовательского интерфейса, чтобы отключить это для каждого нового экземпляра драйвера, я бы просто хотел, чтобы в этот момент появлялось всплывающее окно (слишком много добавленной сложности и места для сбоя для компромисса).

Использование ChromeOptions.setExperimentalOption("prefs", prefs)

Я попытался использовать Документацию Chrome для ChromeDriver по настройке Chrome , чтобы установить различные настройки для отключения облачной печати.

Ниже приведен пример установки предпочтения Chrome

ChromeOptions options = new ChromeOptions();
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.default_content_settings.popups", 0);
options.setExperimentalOption("prefs", prefs);

Ни один из переключателей Chrome ( больше переключателей ) не выглядитони сделают трюк с отключением всплывающего окна, но некоторые из Chrome Preferences выглядят так, как будто они могут работать.

// Enable notifications for new devices on the local network that can be
// registered to the user's account, e.g. Google Cloud Print printers.
const char kLocalDiscoveryNotificationsEnabled[] = "local_discovery.notifications_enabled";

// *************** SERVICE PREFS ***************
// These are attached to the service process.

// ...

const char kCloudPrintProxyEnabled[] = "cloud_print.enabled";

Так что давайте попробуем использовать их:

ChromeOptions options = new ChromeOptions();

final Map<String, Object> prefs = new HashMap<>();
prefs.put("local_discovery.notifications_enabled", 0);
prefs.put("cloud_print.enabled", 0);
options.setExperimentalOption("prefs", prefs);

return new ChromeDriver(options);

Попытка использовать эти настройки, однако, не работает при предоставлении 0, как показано на странице документов Chromium ChromeDriver .

ПРИМЕЧАНИЕ. Когда я использовал "false" вместо 0, я больше не мог воспроизводить всплывающее окно облачного принтера, но, опять же, я не мог воспроизвести проблему (вызвать ее), как раньшепереключая настройки в моем обычном браузере без драйверов.Использование строки "false" может быть ответом, но пока я не смогу подтвердить, переключаясь между ними, я не поверю в это, и я перебираю это в шуток сетевого принтера, пока пишуэтот вопрос.

Я чувствую, что это самое близкое решение, которое я получил, а все остальное - просто догадки и исследования.

РЕДАКТИРОВАТЬ: После выделения изменения предпочтения, как предложено в этом (очень разумном) SO-ответе , разница показала:

<     "notifications_enabled": true
---
>     "notifications_enabled": false

, что, если следовать его фактической строке / значению в JSON, то будет выглядеть так:

"local_discovery": {
  "notifications_enabled": true

, из-за чего кажется, что prefs.put("local_discovery.notifications_enabled", 0); - это именно то, что мы ищем!Теперь последний трюк состоит в том, чтобы пригвоздить его и воспроизводимо включить / отключить всплывающее окно на основе true / false входов ... так близко!

Другие возможные преимущества или альтернативы (но, вероятно, просто тупики)

У меня есть еще одна идея / план резервного копирования для решения этой проблемы: если невозможно программно отключить всплывающее окно через настройки Chrome, я подумал, что создание профиля Chrome с настройкой Cloud PrintВыключение и разделение его между тестами может сработать, поскольку ChromeDriver, похоже, имеет флаг / аргумент командной строки для установки каталога профиля.Было бы намного проще, если бы мы могли правильно использовать настройки Chrome.


У меня также есть несколько вспомогательных вопросов, которые облегчили бы это, пожалуйста, прокомментируйте, если вы знаете, что делать с любым из них:

  1. Есть ли способ для меняскажите что настройка параметров ExperimentalOption что-то делает?Существуют ли какие-либо предпочтения Hello World, в которых было бы легко увидеть разницу?
  2. Я ищу правильные места для имен предпочтений? Этот исходный файл Chromium - правильное место для поиска?Есть ли более легкое место для меня, чтобы найти предпочтительные имена?
  3. Какой самый простой способ заставить Cloud Print думать, что в сети есть принтер?В какой-то момент я потерял тот принтер, который вызывал всплывающее окно, и это сделало невозможным тестирование / воспроизведение проблемы / решения.Если я могу подтвердить, я могу закрыть этот вопрос и опубликовать ответ.

Привет Selenium.Chrome, где я могу найти список всех доступных аргументов ChromeOption?C # как единственный результат поиска в Google или SO, который указал мне на настройки Chrome.Я хотел бы, чтобы была лучшая документация для этого ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...