Как программно отключить облачную печать Chrome «Новый принтер в вашей сети» при настройке параметров ChromeDriver для Selenium?
При каждом запуске ChromeDriver всплывающее окно облачной печати появляется в течение нескольких секунд.
![Cloud Print Chrome popup](https://i.stack.imgur.com/43uCi.png)
Можно отключить всплывающее окно Cloud Print для обычного пользователя Chrome, отключив его в chrome://settings
.
![Chrome settings to disable the cloud print popup](https://i.stack.imgur.com/fEMtg.png)
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.
У меня также есть несколько вспомогательных вопросов, которые облегчили бы это, пожалуйста, прокомментируйте, если вы знаете, что делать с любым из них:
- Есть ли способ для меняскажите что настройка параметров ExperimentalOption что-то делает?Существуют ли какие-либо предпочтения Hello World, в которых было бы легко увидеть разницу?
- Я ищу правильные места для имен предпочтений? Этот исходный файл Chromium - правильное место для поиска?Есть ли более легкое место для меня, чтобы найти предпочтительные имена?
- Какой самый простой способ заставить Cloud Print думать, что в сети есть принтер?В какой-то момент я потерял тот принтер, который вызывал всплывающее окно, и это сделало невозможным тестирование / воспроизведение проблемы / решения.Если я могу подтвердить, я могу закрыть этот вопрос и опубликовать ответ.
Привет Selenium.Chrome, где я могу найти список всех доступных аргументов ChromeOption?C # как единственный результат поиска в Google или SO, который указал мне на настройки Chrome.Я хотел бы, чтобы была лучшая документация для этого ...