Chrome 59 и базовая аутентификация с использованием Selenium/Fluentlenium
В Chrome 59 удалена поддержка URL-адресов https: // user: password@example.com.
У меня есть тест, который использовал эту функцию, которая сейчас не работает, поэтому я пытаюсь заменить ее версией, которая ожидает всплывающее окно аутентификации и заполняет детали. Но следующее не работает в Chrome (который не видит всплывающее окно аутентификации как предупреждение):
alert().authenticateUsing(new UserAndPassword("test", "test"));
Версия только для селена имеет ту же проблему:
WebDriverWait wait = new WebDriverWait(getDriver(), 10);
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
alert.authenticateUsing(new UserAndPassword("test", "test"));
(основываясь на ответе, приведенном здесь: как обрабатывать всплывающее окно аутентификации с помощью Selenium WebDriver с использованием Java)
Я вижу несколько обходных путей для обработки этого в FireFox, но ничего для Chrome. Есть ли альтернативный подход?
4 ответа
Я уверен, что решения Florent B жизнеспособны, но для повторной установки старого теста я обнаружил, что решение zoonabar, опубликованное для этого дублирующего вопроса, проще в реализации, требует значительно меньше кода и не требует специальной подготовки тестового окна. Также кажется, что новым разработчикам будет проще следить за кодом.
Вкратце: посещение любого URL-адреса с учетными данными перед посещением тестируемого URL-адреса (без учетных данных) заставит браузер запомнить эти учетные данные.
goTo("http://user:password@localhost"); // Caches auth, but page itself is blocked
goTo("http://localhost"); // Uses cached auth, page renders fine
// Continue test as normal
Это может показаться уязвимостью в браузере, который будет исправлен, но я думаю, что это маловероятно; ограничение было введено, чтобы избежать фишинговых рисков (где выбранное имя пользователя выглядит как домен, например " http://google.com:long-token-here-which-makes-the-real-domain-disappear@example.com/"), и этот обходной путь для установки учетных данных не представляет такой же риск.
Одним из решений является запуск прозрачного прокси-сервера для введения заголовка с необходимыми учетными данными.
Но другое и более простое решение - создать небольшое расширение для автоматической установки учетных данных:
https://gist.github.com/florentbr/25246cd9337cebc07e2bbb0b9bf0de46
Флоран Б. нашел решение с помощью хромированного расширения, которое добавляется на лету в тесте на селен. Расширение обрабатывает основные учетные данные аутентификации, если требуется:
ChromeOptions options = new ChromeOptions();
options.addExtensions(new File("C:/path_to/credentials_extension.zip"));
driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), options);
Код расширения Chrome: https://gist.github.com/florentbr/25246cd9337cebc07e2bbb0b9bf0de46
(просто измените имя пользователя и пароль в background.js, а затем заархивируйте файлы background.js и manifest.json в credentials_extension.zip)
Найдено здесь: Selenium - базовая аутентификация через URL
В https://bugs.chromium.org/p/chromium/issues/detail?id=435547 вы можете увидеть, что mkwst говорит, что произошла ошибка, связанная с базовыми учетными данными аутентификации, и сайты того же происхождения сделали его стабильным.
Если вы используете "--disable-blink-features=BlockCredentialedSubresources" или перейдете к сборке Chrome Canary, вы можете обнаружить, что исходная проблема, с которой вы столкнулись, больше не возникает...