web-dev-qa-db-fra.com

Sélénium Chrome 60 Boîte de dialogue Authentification de base de la poignée sans tête SAML via HTTPS

Chrome 59 suppression de la prise en charge des URL https: // user: [email protected] .

J'ai un test C # Selenium qui doit fonctionner avec Chrome Version 60 sur Windows en mode ' sans tête '

ChromeOptions options = new ChromeOptions();
options.AddArgument("headless");
driver = new ChromeDriver(chrome, options);

Voici la boîte de dialogue d'authentification SAML requise que j'essaie de gérer sous Windows: Basic Auth Dialog

Basé sur la réponse donnée ici: Comment gérer le popup d'authentification avec Selenium WebDriver en utilisant Java ) Je peux voir plusieurs solutions de contournement pour gérer cela dans FireFox, mais rien pour Chrome 60 en mode sans tête.

J'ai essayé le code suivant pour visiter une URL avec des informations d'identification avant de visiter l'URL en cours de test (sans informations d'identification) mais il semble qu'il y ait un bug avec Chrome 60.

goTo("http://user:password@localhost"); // Caches auth, but page itself is blocked
goTo("http://localhost"); // Uses cached auth, page renders fine
// Continue test as normal

Je peux voir le code suivant dans Firefox gère l'authentification et la boîte de dialogue ne s'affiche jamais:

FirefoxProfile profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris", "https://saml.domain.com");
profile.EnableNativeEvents = false;`

J'ai essayé la deuxième approche ( en utilisant AutoIt ) et cela fonctionne sur Chrome 60 mais ne fonctionne pas [~ # ~] pas [~ # ~] fonctionne sur Chrome 60 en mode sans tête ).

//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();

J'espère qu'il y a une meilleure solution maintenant en 2017 et qu'il existe une approche qui fonctionnera avec Chrome 60 in headless mode, des pointeurs?

Juste pour être clair: essayer d'utiliser informations d'identification intégrées ne fonctionnera PAS en utilisant chrome v59 + car les demandes de sous-ressources seront bloquées.

32
IanC

Je sais que cela fait presque un an, mais c'est ce qui a fini par travailler pour moi dans une situation similaire. Il est vrai que le pop-up d'authentification a changé et que ChromeDriver ne semble plus le prendre en charge ni le schéma http(s)://user:[email protected], mais la solution de contournement que j'ai trouvée ici semble faire l'affaire. Il a été écrit à l'origine pour authentifier un système proxy, mais peut être modifié pour fonctionner avec n'importe quel système d'authentification.

Fondamentalement, vous devez créer une extension chrome qui gère la saisie des informations de connexion sur la page. Une extension chrome peut être ajoutée avec ChromeOptions.AddExtension(string FilePath) et une extension est juste un fichier Zip avec un manifest.json et tous les fichiers de code pour effectuer le travail. Voici les fichiers dont vous aurez besoin.

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']
);
1
Cory

Vous pouvez peut-être effectuer une connexion précédente à l'aide d'un XMLHttpRequest à l'aide de la méthode setRequestHeader afin de pouvoir spécifier l'en-tête d'authentification. Après avoir effectué une seule demande, vous serez authentifié auprès de tous les autres types de demandes. Le plus gros problème pourrait être XSS, selon votre scénario, vous pouvez peut-être le contourner.

0
user1039663