Подтвердить что ты не робот

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

4b9b3361

Ответ 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();
    }
}

ПРИМЕЧАНИЕ: это взято из этого ответа.

Надеюсь это поможет!