33 votes

Selenium Chrome 60 Headless Manipulez le dialogue d'authentification de base SAML sur HTTPS

Chrome 59 suppression du support pour les URLs https://user:password@example.com .

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

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

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

J'ai essayé d'utiliser le code suivant pour visiter une URL avec des informations d'identification avant de visiter l'URL testée (sans informations d'identification), mais il semble qu'il y ait un problème d'accès. 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 PAS travail sur Chrome 60 dans Sans tête mode.

//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 dans sans tête mode, des pistes ?

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

1 votes

Vous pouvez vérifier ceci Question/discussion/filière également.

0 votes

Moi aussi, je reçois toujours l'invite de connexion dans Chrome lorsque je lance le test Selenium. Et les deux suggestions ne fonctionnent pas avec Chrome 60 en mode sans tête sur Windows.

3voto

Cory Dohm Points 36

Je sais que cela date de presque un an, mais c'est ce qui a fini par fonctionner pour moi dans une situation similaire. Il est vrai que la fenêtre pop-up d'authentification a changé et que ChromeDriver ne semble pas la prendre en charge, ni la fonction http(s)://user:password@url.com plus, mais la solution de contournement que j'ai trouvée aquí semble faire l'affaire. Il a été écrit à l'origine pour authentifier un système de proxy, mais peut être modifié pour fonctionner avec n'importe quel système d'authentification.

En fait, vous devez créer une extension pour chrome qui gère la saisie des données 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 tout fichier de code pour faire le travail. Voici les fichiers dont vous aurez besoin.

manifeste.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']
);

0 votes

Cette approche a fonctionné pour moi alors que d'autres ne l'ont pas fait. J'ai essayé d'obtenir l'alerte de connexion et de modifier l'URL de la page pour inclure le nom d'utilisateur et le mot de passe, mais les deux tentatives ont échoué.

0voto

user1039663 Points 153

Vous pouvez peut-être effectuer une connexion précédente à l'aide d'un XMLHttpRequest en utilisant 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é pour tous les autres types de demandes. Le problème le plus important pourrait être le XSS. Selon votre scénario, vous pouvez peut-être le contourner.

-1voto

Vous pouvez utiliser l'option " MultiPass pour l'authentification de base HTTP " Extension Chrome pour gérer cela.

Vous pouvez le faire via GitHub MultiPass pour l'authentification de base HTTP

(ou)

Téléchargez l'extension depuis le Chrome Web Store - Extension Chrome MultiPass

(Or)

Téléchargez l'extension en tant que crx. Vous pouvez l'obtenir en tant que crx à partir de chrome-extension-downloader

Une fois que vous avez téléchargé l'extension sous forme de fichier crx, il est très simple de la configurer dans votre test/source.

Et ceci peut être testé en utilisant le Exemple de site d'authentification de base .

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

NOTE : Ceci est tiré de ce Réponse : .

J'espère que cela vous aidera !

0 votes

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses ne comportant qu'un lien peuvent devenir invalides si la page liée change. - De la revue

0 votes

@MarkRotteveel - Ajouté les éléments essentiels - merci pour la critique. Veuillez me faire savoir si quelque chose manque encore/si ma réponse peut être améliorée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X