В моем 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?
В этом 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 с допустимым набором учетных данных и он работает.
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");
}
}
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");
}
}
Базовая аутентификация через 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
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
синхронизирует два запроса, обеспечивающие порядок.
Новые функции для хромирования и базовой аутентификации с помощью удаленной отладки: просто для ее связывания, так что люди, которые застряли, могут найти решение для хром и многое другое: Удаленная отладка Chrome в seleniumgrid