Как обрабатывать всплывающее окно аутентификации с помощью 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 подходов.
Передайте имя пользователя и пароль в самом URL
Вы можете создать скрипт 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);