web-dev-qa-db-fra.com

HTTP Basic L'authentification via URL dans Firefox ne fonctionne pas?

Je sais que vous pouvez normalement vous connecter à des sites nécessitant une authentification de base HTTP avec Selenium en transmettant le nom d'utilisateur et le mot de passe dans l'URL, par exemple:

Selenium.open("http://myusername:[email protected]/mypath");

J'ai exécuté un test Selenium avec Firefox 2 ou 3 et j'obtiens toujours la fenêtre de dialogue "Authentification requise"?

Mise à jour: Cela ne semble pas être un problème de Selenium, mais plutôt un problème de Firefox. Si j'entre l'URL manuellement dans FF, j'obtiendra la boîte de dialogue d'authentification, mais si j'entre l'URL dans Opera, ma page s'affiche sans afficher de boîte de dialogue d'authentification.

18
Peter

En contribuant à la réponse de Druska, vous pouvez effectuer la même configuration à l'aide de l'API Selenium 2:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.http.phishy-userpass-length", 255);
profile.setPreference("network.automatic-ntlm-auth.trusted-uris","yourDomain");
new FirefoxDriver(profile);

Cette approche est plus simple et il n’est pas nécessaire de demander à tous les développeurs de modifier leur configuration Firefox. J'ai seulement testé avec le pilote Firefox.

UPDATE:

Pour une raison quelconque (peut-être celles expliquées à https://stackoverflow.com/a/14348701/256245 ), la solution ci-dessus ne fonctionne pas avec les versions plus récentes de Firefox. Voici ce qui fonctionne pour moi maintenant (testé avec Firefox 19.0.2):

  1. Installer AutoAuth Firefox plugin;
  2. Visitez le site où l'authentification est nécessaire. Entrez votre nom d'utilisateur et votre mot de passe et assurez-vous de choisir de sauvegarder les informations d'identification.
  3. Enregistrez le fichier d'installation AutoAuth sur votre disque dur: sur la page du plug-in, cliquez avec le bouton droit de la souris sur «Ajouter à Firefox» et «Enregistrer le lien sous».
  4. Instanciez Firefox WebDriver comme suit:

    FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("default");
    File pluginAutoAuth = new File("src/test/resources/autoauth-2.1-fx+fn.xpi");
    firefoxProfile.addExtension(pluginAutoAuth);
    return new FirefoxDriver(firefoxProfile);
    

Veillez à instancier le fichier pluginAutoAuth avec le chemin correct dans lequel vous avez enregistré l'installation du plug-in. Si vous ne vous sentez pas à l'aise avec le profil par défaut, vous pouvez utiliser le gestionnaire de profil Firefox et en créer un spécifique à vos tests.

Référence à cette nouvelle solution: http://watirmelon.com/2012/06/27/automatic-firefox-authentication-when-using-Selenium-webdriver-with-autoauth/

11
Fabricio Lemos

J'ai une solution pour Firefox et Internet Explorer.

Pour Firefox, vous devez entrer dans about: config et créer l’entier network.http.phishy-userpass-length d’une longueur de 255. Ceci indique à Firefox de ne pas afficher une boîte d’authentification si le nom d'utilisateur et le mot de passe ont moins de 255 caractères. Vous pouvez maintenant utiliser http: // user: [email protected] pour vous authentifier.

Pour Internet Explorer, vous devez modifier le registre. Dans la clé HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE, créez les valeurs DWORD iexplore.exe et Explorer.exe et vérifiez que leurs valeurs sont 0..

J'ai dû remplacer l'authentification NTLM aussi. Pour authentifier NTLM à l'aide de la syntaxe d'authentification de base HTTP dans Firefox, spécifiez simplement les domaines utilisés dans la chaîne de configuration de Firefox network.automatic-ntlm-auth.trusted-uris (accompagnant la première option de configuration). Cela fonctionnera dans IE avec la modification du registre uniquement.

10
Druska

Ajoutez une barre oblique après la racine de contexte:

Au lieu de: Selenium.open("http://myusername:[email protected]/mypath");

utiliser: Selenium.open("http://myusername:[email protected]/mypath/");

Cela fait toute la différence du monde en ajoutant la barre oblique à la fin de la racine de contexte. Sans la barre oblique, la fenêtre contextuelle s'ouvre. Elle s'authentifie comme prévu.

Notez que ce n’est pas un bug de Selenium ou quoi, mais un truc firefox. Vous pouvez également utiliser votre ligne de commande pour voir par vous-même:

 C:\Program Files\Mozilla Firefox>firefox http://myusername:[email protected]/mypath/

Pour moi, cela fonctionne même sans paramétrage des uris des réseaux:

FirefoxProfile profile = new FirefoxProfile();
//profile.setPreference("network.automatic-ntlm-auth.trusted-uris", "mydomain.com");
//profile.setPreference("network.negotiate-auth.trusteduris", "mydomain.com");

WebDriver driver = new FirefoxDriver(profile);

driver.navigate().to("http://myusername:[email protected]/mypath/");


versions
Firefox 19.0, 
Selenium-Java 2.31.0

7

Si vous utilisez le pilote FireFox ... Vous pouvez créer un profil FireFox, enregistrer le nom d'utilisateur/mot de passe dans le gestionnaire de mots de passe et utiliser un module complémentaire pour la connexion automatique. N'oubliez pas que si vous créez un pilote FireFox ou Chrome dans Selenium, il utilise par défaut un profil anonyme. Donc, aucun de vos extensions/add-ons/etc réguliers ne sera utilisé. Il est donc préférable de créer un profil pouvant être distribué et enregistré dans le contrôle de source.

1) Sous Windows, dans le menu Démarrer/Démarrer, tapez "firefox.exe -p" pour afficher le gestionnaire de profils, en créer un personnalisé et le sauvegarder dans un emplacement contenant le reste de votre code.

2) Ne pas demander au démarrage est vérifié

3) Téléchargez le module complémentaire AutoAuth https://addons.mozilla.org/en-US/firefox/addon/autoauth/

4) Visitez le site qui requiert l’authentification HTTP de base et enregistrez les informations d’identité.

Lors de votre prochaine visite sur le site, AutoAuth vous connectera sans l'invite d'authentification requise.

Si vous avez NTLM, vous pouvez modifier le paramètre de configuration pour inclure les noms d'hôte: network.automatic-ntlm-auth.trusted-uris

5
Joey V.

Vous pouvez essayer de manipuler les en-têtes directement comme ceci:

Tout d’abord, vous devez activer Selenium ti manipuler les en-têtes:

Selenium.start("addCustomRequestHeader=true");

Ensuite, vous devez utiliser un encodage de base et une manipulation d’en-tête comme ceci:

    String authHeader = "";
    try {
    BASE64Encoder coder = new BASE64Encoder();
    authHeader = coder.encode("developers:Str492ight".getBytes());
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    setUpSelenium();
    startSelenium();
    Selenium.addCustomRequestHeader("Authorization", "Basic " + authHeader);
    Selenium.open("/");
    Selenium.waitForPageToLoad("10000");

L'espace après Basic est nécessaire. Voici à quoi ressemble un en-tête d'authentification HTTP basique.

De plus, vous pouvez utiliser certains observateurs Http pour voir si la demande contient votre demande d’autorisation.

Utilisez soit Wireshark, soit Mieux encore Fiddler ou Charles Proxy.

J'espère que cela a aidé. Gergely.

2
Hannibal

Comme indiqué précédemment, la solution addCustomRequestHeader ne peut fonctionner qu'en mode d'injection proxy. Mais lorsque j'ai essayé de l'implémenter, j'ai eu d'autres problèmes liés à ce mode d'injection proxy.

Ce n'est pas clair pour moi si l'injection de proxy fonctionne même avec le client Java. À chaque fois que j'appellerais open (), une erreur étrange se produirait: "this.onXhrStateChange.bind n'est pas une fonction". La seule solution que j'ai trouvée impliquait que vous deviez ajouter un paramètre supplémentaire avec la valeur ' true 'à la méthode open () mais l'API client Java n'accepte qu'un seul paramètre.

Je devais donc me contenter des solutions de configuration de navigateur expliquées ci-dessus, avec lesquelles je ne me sens pas vraiment à l'aise, car elles dépendent de la volonté du fournisseur de les prendre en charge.

Porter vos tests sur Selenium 2 (toujours alpha pour le moment) pourrait être une meilleure perspective, mais dans mon cas, cela ne sera possible que si Selenium Grid prend en charge Selenium 2.

J'espère que cela peut aider n'importe qui, Sébastien

0
Sebastien B.

Eh bien, vous pouvez utiliser le script Sikuli pour gérer cette fenêtre contextuelle d’authentification Firefox sous Windows ainsi que dans un environnement Linux.

  • Télécharger et installer Sikuli sous Windows/Linux (Nécessité d'installer des dépendances) 
  • Utilisez le script Sikuli suivant pour gérer les fenêtres contextuelles: où Authentilcat1.png est l’image contextuelle et gérera 100 fenêtres contextuelles.

for i in range (100): while exists(Pattern("Authentlcatl.png").similar(0.99)): print("Found Authentication Popup") wait(2) type("admin" + Key.TAB) type("admin" + Key.ENTER)

  • Utilisez le code suivant pour déclencher et terminer le script Sikuli à partir de code Java:

Pour déclencher le script Sikuli :

String[] lincmd = { "bash", "-c", "Sudo Java -jar Sikuli-X/Sikuli-IDE/sikuli-script.jar Sikuli-X/Sikuli-IDE/new1.sikuli/" };

Java.lang.Runtime.getRuntime (). Exec (lincmd);

Pour terminer le script Sikuli :

String[] lincmd = { "bash", "-c", "Sudo kill $(ps aux | grep '[s]ikuli' | awk '{print $2}')" };

Java.lang.Runtime.getRuntime (). Exec (lincmd);

  • Après avoir déclenché le script Sikuli à partir de code Java, le script Sikuli s'exécutera séparément en tant que processus différent, donc dans le code Java qui termine le script Sikuli.

  • Ainsi, chaque fois que la fenêtre contextuelle apparaît à l'écran, le script Sikuli se chargera.

0
Ramkumar

Le traitement «nom d'utilisateur: mot de passe» (RFC1738) dans Firefox 17 est interdit par défaut dans Firefox (il fonctionnait auparavant). Cependant, j'ai découvert qu'il peut être réactivé par:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("network.negotiate-auth.trusteduris", hostname);
driver = new FirefoxDriver(profile);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
Selenium = new WebDriverBackedSelenium(driver, "http:// + username + ":"
    + password + "@"
    + hostname + ":" + port + baseUrl);

Fonctionne sur Selenium 2.28.0, Firefox 17; utilisé pour la connexion à DigestAuth.

0
MitchSundt