Подтвердить что ты не робот

HTTP Basic Auth через URL в Firefox не работает?

Я знаю, что обычно вы можете заходить на сайты, для которых требуется базовая аутентификация HTTP с помощью Selenium, передавая имя пользователя и пароль в URL-адресе, например:

selenium.open("http://myusername:[email protected]/mypath");

Я тестировал Selenium с Firefox 2 или 3, и там я все еще получаю диалоговое окно "Требуется проверка подлинности"?

Обновление: похоже, это не проблема селена, а проблема с Firefox. Если я вручную ввожу URL в FF, я получу диалог проверки подлинности, но если я укажу URL-адрес в Opera, моя страница будет отображаться без отображения диалогового окна проверки подлинности.

4b9b3361

Ответ 1

В ответ на ответ Друски вы можете сделать ту же конфигурацию, используя Selenium 2 API:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.http.phishy-userpass-length", 255);
profile.setPreference("network.automatic-ntlm-auth.trusted-uris","yourDomain");
new FirefoxDriver(profile);

Этот подход проще, и вам не нужно просить каждого разработчика изменять свою конфигурацию Firefox. Я тестировал только драйвер Firefox.

UPDATE

По какой-то причине (возможно, объясняемые в fooobar.com/questions/282876/...), вышеупомянутое решение не работает с более новыми версиями Firefox. Вот что работает для меня сейчас (проверено с помощью Firefox 19.0.2):

  • Установите AutoAuth плагин Firefox;
  • Посетите сайт, где требуется аутентификация. Введите свое имя пользователя и пароль и не забудьте сохранить учетные данные;
  • Сохраните файл установки AutoAuth на вашем жестком диске: на странице плагина щелкните правой кнопкой мыши "Добавить в Firefox" и "Сохранить ссылку как";
  • Создайте веб-браузер Firefox следующим образом:

    FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default");
    File pluginAutoAuth = new File("src/test/resources/autoauth-2.1-fx+fn.xpi");
    firefoxProfile.addExtension(pluginAutoAuth);
    return new FirefoxDriver(firefoxProfile);
    

Обязательно создайте файл pluginAutoAuth с правильным путем, где вы сохранили установку плагина. Если вы не чувствуете себя комфортно с помощью профиля по умолчанию, вы можете использовать Firefox Profile Manager и создать один для своих тестов.

Ссылка на это новое решение: http://watirmelon.com/2012/06/27/automatic-firefox-authentication-when-using-selenium-webdriver-with-autoauth/

Ответ 2

У меня есть решение для Firefox и Internet Explorer.

Для Firefox вам нужно перейти к: config и создать целое число network.http.phishy-userpass-length с длиной 255. Это говорит Firefox, чтобы не всплывать окно проверки подлинности, если имя пользователя и пароль меньше 255 символов. Теперь вы можете использовать http://user:[email protected] для аутентификации.

Для Internet Explorer вы должны отредактировать реестр. В ключе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE создайте значения DWORD iexplore.exe и explorer.exe и убедитесь, что их значения 0.

Мне также пришлось переопределить аутентификацию NTLM. Для аутентификации NTLM с использованием базового синтаксиса проверки подлинности HTTP в Firefox просто укажите домены, которые используются в строке конфигурации Firefox network.automatic-ntlm-auth.trusted-uris (сопровождающей первый вариант конфигурации). Это будет работать в IE с редактированием только для редактирования.

Ответ 3

Добавить косую черту после корня контекста:

Вместо: selenium.open("http://myusername:[email protected]/mypath");

использование: selenium.open("http://myusername:[email protected]/mypath/");

Это делает разницу в мире, добавляя косую черту в конец корня контекста. Без косой черты всплывающее окно открывается, а косая черта становится аутентифицированной, как ожидалось.

Обратите внимание, что это не ошибка селена или еще что-то, но вещь firefox. Вы также можете использовать свою командную строку, чтобы убедиться сами:

 C:\Program Files\Mozilla Firefox>firefox http://myusername:[email protected]/mypath/

Для меня он работает даже без настроек в сетях uris:

FirefoxProfile profile = new FirefoxProfile();
//profile.setPreference("network.automatic-ntlm-auth.trusted-uris", "mydomain.com");
//profile.setPreference("network.negotiate-auth.trusteduris", "mydomain.com");

WebDriver driver = new FirefoxDriver(profile);

driver.navigate().to("http://myusername:[email protected]/mypath/");


версии
Firefox 19.0,
selenium-java 2.31.0

Ответ 4

Если вы используете FireFox Driver... Вы можете создать профиль FireFox и сохранить имя пользователя/пароль в менеджере паролей и использовать надстройку для автоматического входа в систему. Помните, если вы создаете драйвер FireFox или Chrome в Selenium, по умолчанию он использует анонимный профиль. Поэтому ни одно из ваших обычных расширений/надстроек/etc не будет использоваться. Поэтому лучше всего создать профиль, который может быть распределен и сохранен в исходном управлении.

1) В Windows из меню run/start введите "firefox.exe -p", чтобы открыть Диспетчер профилей и создать собственный и сохранить его в месте с остальной частью вашего кода.

2) Не запрашивать при запуске проверяется

3) Загрузите надстройку AutoAuth https://addons.mozilla.org/en-US/firefox/addon/autoauth/

4) Посетите сайт, на котором требуется базовая проверка подлинности HTTP, и сохраните учетные данные

В следующий раз, когда вы заходите на сайт, AutoAuth войдет в систему без приглашения на проверку подлинности.

Если у вас есть NTLM, вы можете изменить настройку конфигурации, чтобы включить имена хостов: network.automatic-ntlm-auth.trusted-uris

Ответ 5

Вы можете попытаться манипулировать заголовками прямо следующим образом:

Сначала, когда вы начинаете, вы должны активировать заголовки Selenium ti:

selenium.start("addCustomRequestHeader=true");

Затем вы должны использовать некоторые основные кодировки и манипуляции с заголовками, например:

    String authHeader = "";
    try {
    BASE64Encoder coder = new BASE64Encoder();
    authHeader = coder.encode("developers:Str492ight".getBytes());
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    setUpSelenium();
    startSelenium();
    selenium.addCustomRequestHeader("Authorization", "Basic " + authHeader);
    selenium.open("/");
    selenium.waitForPageToLoad("10000");

Требуется пробел после Basic. Вот как выглядит основной заголовок HTTP-аутентификации.

Кроме того, вы можете использовать некоторые наблюдатели Http, чтобы узнать, содержит ли запрос ваш запрос auth.

Либо используйте Wireshark, либо лучше Fiddler или Charles Proxy.

Надеюсь, что это помогло. Gergely.

Ответ 6

Как уже упоминалось, решение addCustomRequestHeader может работать только с режимом впрыска прокси. Но когда я попытался реализовать его, у меня возникли другие проблемы, связанные с этим режимом впрыска прокси.

Мне не ясно, работает ли прокси-инъекция даже при использовании клиента Java. В любое время, когда я вызывал open(), у меня возникла странная ошибка: "this.onXhrStateChange.bind не является функцией". Единственное найденное мной решение подразумевает, что вам нужно добавить дополнительный параметр со значением "true" к методу open(), но API-интерфейс клиента Java принимает только один параметр.

Таким образом, мне пришлось согласиться с описанными выше решениями для конфигурации браузера, которые мне действительно не нравятся, поскольку они зависят от желания поставщиков поддерживать их.

Портирование ваших тестов на Selenium 2 (все еще альфа на данный момент) может быть лучшей перспективой, но в моем случае это будет невозможно, пока Selenium Grid не поддержит Selenium 2.

Надеюсь, что это поможет кому угодно, Себастьен

Ответ 7

Firefox 17 "имя пользователя: пароль" (RFC1738) обрабатывается по умолчанию в Firefox (он работал раньше). Однако я обнаружил, что его можно включить повторно:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.negotiate-auth.trusteduris", hostname);
driver = new FirefoxDriver(profile);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
selenium = new WebDriverBackedSelenium(driver, "http:// + username + ":"
    + password + "@"
    + hostname + ":" + port + baseUrl);

Работает на Selenium 2.28.0, Firefox 17; используется для входа в DigestAuth.

Ответ 8

Хорошо, вы можете использовать Sikuli script для обработки этого всплывающего окна Firefox в Windows, а также в среде Linux.

  • Загрузка и настройка Sikuli в Windows/Linux (требуется установить зависимости)
  • Используйте следующие Sikuli script для обработки всплывающих окон: где Authentilcat1.png - это всплывающее изображение, и оно будет обрабатывать 100 всплывающих окон

for i in range (100): while exists(Pattern("Authentlcatl.png").similar(0.99)): print("Found Authentication Popup") wait(2) type("admin" + Key.TAB) type("admin" + Key.ENTER)

  • Используйте следующий код для запуска и завершения Sikuli script из кода Java:

Запустить Sikuli Script:

String[] lincmd = { "bash", "-c", "sudo java -jar Sikuli-X/Sikuli-IDE/sikuli-script.jar Sikuli-X/Sikuli-IDE/new1.sikuli/" };

java.lang.Runtime.getRuntime() Exec (lincmd);.

Чтобы завершить Sikuli Script:

String[] lincmd = { "bash", "-c", "sudo kill $(ps aux | grep '[s]ikuli' | awk '{print $2}')" };

java.lang.Runtime.getRuntime() Exec (lincmd);.

  • После запуска Sikuli script из Java-кода Sikuli script будет выполняться как отдельный процесс отдельно, поэтому, наконец, в коде Java, заканчивающем Sikuli script.

  • Поэтому всякий раз, когда на экране появляется всплывающее окно, Sikuli script будет обрабатывать.