Selenium - базовая аутентификация через URL

4

В моем Selenium-Testchromedriver-2.24) я пытаюсь получить доступ к моей веб-странице с помощью базовой аутентификации со следующим утверждением:

WebDriver driver  = ...;
driver.get("http://admin:admin@localhost:8080/project/");

Но Google Chrome дает мне следующее предупреждение в консоли:

[Усталость] Запросы субресурсов, URL-адреса которых содержат встроенные учетные данные (например, https://user:pass@host/), блокируются. Подробнее см. https://www.chromestatus.com/feature/5669008342777856.

В помеченной ссылке упоминается, что поддержка была удалена:

Поддержка отбрасывания встроенных учетных данных в запросах на подсети. (Удалено)

Теперь мой вопрос: есть ли другой способ базового аутентификации из Selenium?

ПРИМЕЧАНИЕ: это не помогло: Как обрабатывать заголовки HTTP Basic Auth в Selenium Webdriver с помощью Java?

  • 0
    Попробуйте решение от: stackoverflow.com/a/44588777/5546988
  • 0
    @jadupl решение, предложенное по ссылке, не работает для меня, учетные данные не кэшируются после первого вызова ...
Показать ещё 1 комментарий
Теги:
selenium
selenium-webdriver
google-chrome
http-basic-authentication

4 ответа

3
Лучший ответ

В этом link появилось несколько обновлений, в которых публично объявлено, что:

Поддержка отбрасывания встроенных учетных данных в запросах на подсети. (Удалено)

Мы должны блокировать запросы для подресурсов, которые содержат встроенные учетные данные (например, http://ima_user:[email protected]/yay.tiff "). Такие ресурсы будут обрабатываться как сетевые ошибки.

Эта информация соответствует Chromium Issue 435547

Я хотел бы поделиться тем, что функциональность Basic Authentication по-прежнему работает с привязками Selenium 3.4.0, geckodriver v0.18.0, chromedriver v2.31.488763, Google Chrome 60.x и Mozilla Firefox 53.0 через Selenium-Java.

Вот пример кода, который пытается открыть URL http://the-internet.herokuapp.com/basic_auth с допустимым набором учетных данных и он работает.

Firefox:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class BasicAuthentication_FF 
{
    public static void main(String[] args) 
    {
        System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
        WebDriver driver =  new FirefoxDriver();
        driver.navigate().to("http://admin:[email protected]/basic_auth");
    }
}

Chrome:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class BasicAuthentication_Chrome 
{
    public static void main(String[] args) 
    {
        System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("start-maximized");
        options.addArguments("disable-infobars");
        options.addArguments("--disable-extensions");
        WebDriver driver =  new ChromeDriver(options);
        driver.navigate().to("http://admin:[email protected]/basic_auth");
    }
}
4

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

driver.get("http://admin:admin@localhost:8080");
driver.get("http://localhost:8080/project");

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

options = webdriver.ChromeOptions()
options.add_extension(r'C:\dev\credentials.zip')

https://gist.github.com/florentbr/25246cd9337cebc07e2bbb0b9bf0de46

  • 0
    Ваше первое предложение не работает для меня: / Я все еще получаю приглашение для входа в Chrome при запуске теста на селен. Другой я не смотрел на
  • 1
    @ florent-b, я везде искал что-то подобное! Вариант № 2 решает проблему запросов AJAX, отправки форм CGI, перенаправлений и т. Д.
Показать ещё 1 комментарий
2

Florent B. подход вызова .get на URL дважды работал у меня с небольшой модификацией. В JS:

driver
        .get('http://admin:admin@localhost:8080')
        .then( () => driver.get('http://localhost:8080') )

работает на google chrome 62.0.3202.94 с ChromeDriver 2.33.506092, и этот подход кажется совместимым с firefox 56.0.2 с geckodriver 0.19.1 и phantomjs 2.1.1 под Debian linux 9.

Я считаю, что первый вызов устанавливает заголовок авторизации, отправленный браузером. Второй вызов удаляет учетные данные из URL-адреса, и учетные данные больше не применяются к подресурсам. then синхронизирует два запроса, обеспечивающие порядок.

1

Новые функции для хромирования и базовой аутентификации с помощью удаленной отладки: просто для ее связывания, так что люди, которые застряли, могут найти решение для хром и многое другое: Удаленная отладка Chrome в seleniumgrid

Ещё вопросы

Сообщество Overcoder
Наверх
Меню