Selenium - базовая аутентификация через URL
В моем Selenium-Test
(с chromedriver-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+"')");