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

В моем 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?

6 ответов

Решение

Были некоторые обновления в этом link как:

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

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

Однако функция базовой аутентификации по- прежнему работает с привязками Selenium-Java к Selenium 3.4.0, geckodriver v0.18.0, chromedriver v2.31.488763, Google Chrome 60.x и Mozilla Firefox 53.0.

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

Fire Fox:

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:admin@the-internet.herokuapp.com/basic_auth");
    }
}

Хром:

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:admin@the-internet.herokuapp.com/basic_auth");
    }
}

Базовая аутентификация через 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

Selenium 4 поддерживает базовую аутентификацию

      WebDriver driver = new ChromeDriver();
HasAuthentication authentication = (HasAuthentication) driver;
authentication.register(() -> new UsernameAndPassword("username", "pwd"));
driver.get("your-site.com");

https://www.selenium.dev/blog/2021/a-tour-of-4-authentication/

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

Подход Флорента Б. к вызову.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 синхронизирует два запроса, обеспечивая порядок.

Такая базовая аутентификация не будет поддерживаться напрямую с использованием метода selenium driver.get(URL) для загрузки URL-адреса, запрашивающего аутентификацию во всплывающем окне JavaScript, я также застрял здесь на долгое время. Это из-за того, что драйвер Chrome не разрешит такие методы аутентификации после обновления 59 (вероятно). Все еще существуют бэкдоры через Selenium, использующие движок JavaScript в браузере для загрузки таких URL-адресов.

driver.get("https://www.google.com");
JavascriptExecutor jse = (JavascriptExecutor) driver;
URL = "https://username:password@www.example.com";
jse.executeScript("window.open('"+URL+"')");