Как обрабатывать всплывающее окно аутентификации с помощью Selenium WebDriver с использованием Java

Я пытаюсь обработать всплывающее окно аутентификации, используя код ниже:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.http.phishy-userpass-length", 255);
profile.setPreference("network.automatic-ntlm-auth.trusted-uris", "x.x.x.x");
driver = new FirefoxDriver(profile);
baseUrl="http://" + login + ":" + password + "@" + url;
driver.get(baseUrl + "/");

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

8 ответов

Метод оповещения, authenticateUsing() позволяет пропустить поле Базовая аутентификация Http.

WebDriverWait wait = new WebDriverWait(driver, 10);      
Alert alert = wait.until(ExpectedConditions.alertIsPresent());     
alert.authenticateUsing(new UserAndPassword(username, password));

Начиная с Selenium 3.4 он все еще находится в бета-версии

В настоящее время реализация осуществляется только для InternetExplorerDriver

Не используйте профиль Firefox и попробуйте следующий код:

driver.get("http://UserName:Password@Example.com");

Если вы реализуете это в браузере IE, есть определенные вещи, которые вам нужно сделать.

Если вашему серверу аутентификации требуется имя пользователя с доменом типа "domainuser", вам необходимо добавить двойную косую черту / на URL:

//localdomain\user:password@example.com

Попробуйте следующее решение и дайте мне знать в случае каких-либо проблем:

driver.get('https://example.com/')
driver.switchTo().alert().sendKeys("username" + Keys.TAB + "password");
driver.switchTo().alert().accept();

Это работает нормально для меня

Я сталкивался с этой проблемой несколько раз в моем приложении.

Как правило, мы можем справиться с этим с помощью следующих 2 подходов.

  1. Передайте имя пользователя и пароль в самом URL

  2. Вы можете создать скрипт AutoIT и вызвать скрипт перед открытием URL.

Пожалуйста, проверьте ниже статью, в которой я упомянул оба способа:
Обрабатывать окно аутентификации / входа в Selenium Webdriver

Это должно работать для Firefox с помощью плагина AutoAuth:

FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default");
File ffPluginAutoAuth = new File("D:\\autoauth-2.1-fx+fn.xpi");
firefoxProfile.addExtension(ffPluginAutoAuth);
driver = new FirefoxDriver(firefoxProfile);

Selenium 4 поддерживает аутентификацию с использованием Basic и Digest auth. Он использует CDP и в настоящее время поддерживает только браузеры на основе хрома.

Пример Java:

      Webdriver driver = new ChromeDriver();

((HasAuthentication) driver).register(UsernameAndPassword.of("username", "pass"));

driver.get("http://sitewithauth");

Примечание. В Alpha-7 есть ошибка , из- за которой имя пользователя отправляется как для пользователя, так и для пароля. Необходимо дождаться следующего выпуска версии селена, так как исправление доступно в стволе https://github.com/SeleniumHQ/selenium/commit/4917444886ba16a033a81a2a9676c9267c472894 .

Популярным решением является добавление имени пользователя и пароля в URL-адрес, например, http://username:password@website.com/. Однако, если ваше имя пользователя или пароль содержит специальный символ, он может не работать. Поэтому при создании URL-адреса убедитесь, что вы кодируете эти специальные символы.

String username = URLEncoder.encode(user, StandardCharsets.UTF_8.toString());
String password = URLEncoder.encode(pass, StandardCharsets.UTF_8.toString());
String url = “http://“ + username + “:” + password + “@website.com”;
driver.get(url);

Если вам приходится иметь дело с аутентификацией прокси-сервера NTLM, хорошей альтернативой является использование конфигурации локального прокси-сервера с использованием CNTLM.

Учетные данные и домен настраиваются в /etc/cntlm.conf,

После этого вы можете просто использовать свой собственный прокси, который обрабатывает все NTLM.

DesiredCapabilities capabilities = DesiredCapabilities.chrome();

Proxy proxy = new Proxy();
proxy.setHttpProxy("localhost:3128");
capabilities.setCapability(CapabilityType.PROXY, proxy);

driver = new ChromeDriver(capabilities);
Другие вопросы по тегам