Selenium Chrome 60 Headless Handle Базовая аутентификация Диалог SAML по HTTPS
В Chrome 59 удалена поддержка URL-адресов https://user: [email protected].
У меня есть тест на селен С#, который должен работать с Chrome Версии 60 в Windows в режиме " без головы "
ChromeOptions options = new ChromeOptions();
options.AddArgument("headless");
driver = new ChromeDriver(chrome, options);
Вот диалог проверки подлинности SAML, который я пытаюсь обработать в Windows: ![Basic Auth Dialog]()
Основываясь на ответе, приведенном здесь: как обрабатывать всплывающее окно аутентификации с помощью Selenium WebDriver с использованием Java), я вижу несколько обходных путей для обработки этого в FireFox, но ничего для Chrome 60 в режиме без головы.
Я пробовал следующий код для посещения URL-адреса с учетными данными перед посещением тестируемого URL-адреса (без учетных данных), однако в Chrome 60 обнаружена ошибка.
goTo("http://user:[email protected]"); // Caches auth, but page itself is blocked
goTo("http://localhost"); // Uses cached auth, page renders fine
// Continue test as normal
Я вижу следующий код в Firefox, который обрабатывает аутентификацию, и диалоговое окно никогда не появляется:
FirefoxProfile profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris", "https://saml.domain.com");
profile.EnableNativeEvents = false;'
Я попробовал второй подход (используя AutoIt), и он работает на Chrome 60, но НЕ работает на Chrome 60 в режиме без головы.
//Use AutoIt to wait 4 seconds for the authentication required dialog to appear
au3.Sleep(4000);
//Use AutoIT to send in the credentials from app.config that are encrypted
au3.Send(USERNAME + "{TAB}" + PASSWORD + "{ENTER}");
//Refresh the page
driver.Navigate().Refresh();
Я надеюсь, что в 2017 году появится лучшее решение, и что есть подход, который будет работать с Chrome 60 в режиме без головы, какие-нибудь указатели?
Просто чтобы прояснить: попытка использовать встроенные учетные данные НЕ будет работать с использованием chrome v59+, потому что запросы подресурсов будут заблокированы.
Ответы
Ответ 1
Возможно, вы можете выполнить предыдущее соединение с помощью XMLHttpRequest, используя метод setRequestHeader, чтобы вы могли указать заголовок аутентификации. После выполнения одного запроса вы будете аутентифицированы ко всем другим типам запросов. Большей проблемой может быть XSS, в зависимости от вашего сценария, который вы, возможно, сможете обойти.
Ответ 2
Я знаю, что это почти год, но это то, что в конечном итоге работает для меня в аналогичной ситуации. Это правда, что всплывающее окно аутентификации изменилось, и ChromeDriver, кажется, больше не поддерживает его или схему http(s)://user:[email protected]
, но обнаруженный здесь обходной путь кажется сделать трюк. Первоначально он был написан для аутентификации прокси-системы, но может быть изменен для работы с любой системой аутентификации.
По сути, вам нужно сделать расширение Chrome, которое будет обрабатывать ввод данных для входа на страницу. Расширение chrome может быть добавлено с помощью ChromeOptions.AddExtension(string FilePath)
а расширение представляет собой просто zip файл с manifest.json
и любыми файлами кода для выполнения работы. Вот файлы, которые вам понадобятся.
manifest.json
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
},
"minimum_chrome_version":"22.0.0"
}
background.js
function callbackFn(details) {
return {
authCredentials: {
username: "YOUR_PROXY_USERNAME",
password: "YOUR_PROXY_PASSWORD"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["YOUR_WEBSITE_ADDRESS"]},
['blocking']
);
Ответ 3
Для этого вы можете использовать расширение Chrome "MultiPass для HTTP базовой аутентификации".
Вы можете сделать через GitHub MultiPass для базовой аутентификации HTTP
(или же)
Загрузите расширение из Интернет-магазина Chrome - MultiPass Chrome Extension
(Или же)
Загрузите расширение как crx. Вы можете получить его как crx из chrome-extension-downloader
Как только вы загрузите расширение в виде файла crx - настроить его в свой Test/Source очень просто.
И это можно проверить с помощью Sample Basic Auth-Site.
public class ChromeAuthTest {
WebDriver driver;
public ChromeAuthTest() {
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
}
private void initDriver() {
ChromeOptions cOptions = new ChromeOptions();
cOptions.addExtensions(new File("MultiPass-for-HTTP-basic-authentication_v.crx"));
driver = new ChromeDriver(cOptions);
configureAuth(
"https://the-internet.herokuapp.com/basic_auth",
"admin",
"admin");
}
private void configureAuth(String url, String username, String password) {
driver.get("chrome-extension://enhldmjbphoeibbpdhmjkchohnidgnah/options.html");
driver.findElement(By.id("url")).sendKeys(url);
driver.findElement(By.id("username")).sendKeys(username);
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.className("credential-form-submit")).click();
}
public void doTest() {
initDriver();
driver.get("https://the-internet.herokuapp.com/basic_auth");
System.out.println(driver.getTitle());
driver.quit();
}
public static void main(String[] args) {
new ChromeAuthTest().doTest();
}
}
ПРИМЕЧАНИЕ: это взято из этого ответа.
Надеюсь это поможет!