2010-03-31 5 views
2

J'essaie d'utiliser FireWatir (1.6.5) pour accéder à un site en utilisant l'authentification de base et j'ai été incapable de trouver une solution qui fonctionne sur Firefox sous Linux. FireWatir 1.6.5 prend-il en charge l'authentification de base sous Linux? J'ai été la recherche sur le web pendant 2 jours et ne peut pas obtenir une réponse directe n'importe où sur la façon de le faire.Comment faire une authentification basique avec FireWatir sous Ubuntu Linux?

Le seul thread que j'ai trouvé qui m'a semblé utile était celui-ci ( http://groups.google.com/group/watir-general/browse_thread/thread/d8ab9a177d282ce4/fc1bf2319fb387d8?lnk=gst&q=basic+authentication#fc1bf2319fb387d8).

Aedorn Varanis dit « La fourchette de Angrez avait la solution, donc je me sers que maintenant. Merci Angrez, fonctionne parfaitement! », Mais il ne mentionne pas ce qu'il a fait pour que tout fonctionne. Dans un premier temps

J'ai essayé de contourner la boîte de dialogue d'authentification en utilisant:

browser.goto ('http://admin:[email protected]')

Cependant, cela génère une "Confirmer" dialogue qui dit:

« Vous êtes sur le point de vous connecter sur le site "172.20.1.1" avec le nom d'utilisateur "admin". " [Annuler, OK]

Cette boîte de dialogue est bloquée et l'appel goto ne sera pas renvoyé tant que je n'aurai pas cliqué sur "OK".

J'ai essayé d'ajouter:

browser.startClicker ("ok") browser.goto ('http://admin:[email protected]')

Mais cela génère aussi la même boîte de dialogue "Confirmer".

J'ai testé la fonctionnalité startClicker à l'aide du test unitaire/var/lib /gemmes/1.8/gemmes/firewatir-1.6.5/unittests/html/JavascriptClick.html et il a bien fonctionné, ce qui me fait penser que L'utilisation de la méthode startClicker n'est PAS la méthode correcte pour prendre en charge la boîte de dialogue Confirmer.

Quelqu'un d'autre a trouvé un moyen de faire fonctionner Basic Auth, ou comment cliquer sur sur OK dans la boîte de dialogue de confirmation? Je suis à la fin de mon esprit ...

Répondre

0

Avec l'aide d'Aedorn Varanis, j'ai des choses qui fonctionnent sur Firefox en Linux.

Aedorn m'a envoyé une méthode « d'ouverture de session », qui émet une commande jssh qui vérifie une boîte de dialogue « Authentification requise » et si elle existe, remplit le nom d'utilisateur/mot de passe et présente la boîte de dialogue.

Je l'ai copié et collé ce qu'il m'a envoyé ci-dessous:

vous utilisez une méthode qui ressemble à ceci:

def logon(username, password, wait=3) 
     jssh_command = "var length = getWindows().length; var win;var found=false; for(var i = 0; i < length; i++) { win = getWindows()[i]; if(win.document.title == \"Authentication Required\") { found = true; break; }} if(found) { var jsdocument = win.document; var dialog = jsdocument.getElementsByTagName(\"dialog\")[0];" 
     jssh_command << " jsdocument.getElementsByTagName(\"textbox\")[0].value = \"#{username}\";" 
     jssh_command << " jsdocument.getElementsByTagName(\"textbox\")[1].value = \"#{password}\";" 
     jssh_command << " dialog.getButton(\"accept\").click(); }\n" 
     sleep(wait) 
     $jssh_socket.send(jssh_command,0) 
     read_socket() 
     wait() 
end 

Ensuite, vous pouvez l'appeler dans son propre fil juste avant aller sur le site avec l'exigence de connexion:

Thread.new { logon(user, pass) } 
@ff.goto("http://some_url.com") 
sleep 3 

Augmentez le temps d'attente et de veille si la page prend un certain temps à charger. Si votre processus principal essaie de s'exécuter alors que la commande est en cours d'envoi via le socket JSSH , il se bloque et reste là pour toujours jusqu'à ce qu'il soit tué. En outre, il n'y a pas de moyen réel de détecter si la fenêtre d'authentification apparaît. Ce signifie que vous devez vous assurer qu'il fonctionne toujours de la même manière à chaque fois, ou qu'il cause également des problèmes. Enfin, la méthode devra toujours être dans un autre thread, car une fois la fenêtre d'authentification apparaît, arrête tout autre traitement jusqu'à ce que s'en aille. À part ça, ça fonctionne.

De là, j'ai pu sous-classe de la classe FireWatir :: Firefox avec une nouvelle classe de navigateur qui prend en charge une méthode « credentials de = » comme le Célérité :: navigateur ne. Ainsi, tout comme l'utilisation de rapidité, vous pouvez faire:

require 'browser' 
browser = Browser.new 
browser.credentials = 'user:pass' 
browser.goto('http://some.basic.auth.url') 

Cela remplira automatiquement dans la boîte de dialogue de base Auth et vous vous connectez à le site.

J'ai posté le contenu de mon fichier browser.rb ci-dessous (remarquez cette œuvres en rubis + firewatir et JRuby + sous Linux) rapidité:

ENGINE = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby' 
if ENGINE == 'ruby' 
    require 'firewatir' 

    class Browser < FireWatir::Firefox 

    def initialize(options={}) 
     super(options) 
     @username = nil 
     @password = nil 
    end 

    def credentials=(string) 
     username, password = string.split(":") 
     if username.nil? or password.nil? 
     raise "Invalid credentials: #{string})" 
     else 
     @username = username 
     @password = password 
     end 
    end 

    def goto(url, wait=3) 
     if @username.nil? and @password.nil? 
     return super(url) 
     else 
     t = Thread.new { logon(@username, @password, wait) } 
     result = super(url) 
     t.join 
     return result 
     end 
    end 

    private 

    def logon(username, password, wait) 
     jssh_command = " 
     var length = getWindows().length; 
     var win; 
     var found = false; 
     for (var i = 0; i < length; i++) { 
      win = getWindows()[i]; 
      if(win.document.title == \"Authentication Required\") { 
      found = true; 
      break; 
      } 
     } 
     if (found) { 
      var jsdocument = win.document; 
      var dialog = jsdocument.getElementsByTagName(\"dialog\")[0]; 
      jsdocument.getElementsByTagName(\"textbox\")[0].value = \"#{username}\"; 
      jsdocument.getElementsByTagName(\"textbox\")[1].value = \"#{password}\"; 
      dialog.getButton(\"accept\").click(); 
     } 
     \n" 
     sleep(wait) 
     $jssh_socket.send(jssh_command,0) 
     read_socket() 
    end 
    end 
elsif ENGINE == 'jruby' 
    require 'celerity' 
    class Browser < Celerity::Browser; end 
else 
    raise "Ruby ENGINE '#{ENGINE}' not supported." 
end 
+0

J'ai ajouté un lien vers ce poste à http://wiki.openqa.org/display/WTR/Basic+Authentication, voulez-vous ajouter plus de détails là-bas? –

+0

Désolé, n'a pas vu votre commentaire jusqu'à maintenant. J'ai mis à jour la page. – cdwilson

0

Cela peut être une solution à long laid, et peut également violer la simplicité de la philosophie de watir, mais puisque vous êtes à la fin de votre esprit ...

1) Sahi (http://sahi.co.in/) gère 401 boîtes de dialogue d'authentification en les convertissant en pages Web normales. 2) Le proxy de Sahi doit être en cours d'exécution, et vous pointez votre navigateur pour utiliser le proxy de Sahi.

3) Vous pouvez ensuite naviguer vers votre page et utiliser simplement watir/firewatir pour entrer le mot de passe du nom d'utilisateur dans une page Web d'authentification 401 convertie (comme un formulaire ordinaire).

Vous encourez la charge supplémentaire du proxy, mais Sahi est assez bien comporté donc vous devriez être capable de le faire fonctionner.

Vous pouvez poster ici ou sur les forums de Sahi si vous avez besoin d'aide.

Espérons que ça aide. -Narayan

-1

Je me suis battu long et dur avec cette question jusqu'à ce que aujourd'hui. Apparemment j'ai négligé la réponse plusieurs fois parce que cela ne semblait pas plausible. Cependant, la solution réside dans la configuration du profil "network.http.phishy-userpass-length" de Firefox. Si FireWatir vous permet de modifier votre profil d'instance firefox, vous pouvez donner à "network.http.phishy-userpass-length" une valeur de 255 qui devrait faire disparaître cette boîte de dialogue. vérifiez http://kb.mozillazine.org/Network.http.phishy-userpass-length pour plus de détails.

Note: Avec Capybara + pilote de sélénium-rubis dans Ruby, j'ai fait;

require 'capybara' 
    require 'selenium-webdriver' 

    profile = Selenium::WebDriver::Firefox::Profile.new 
    profile['network.http.phishy-userpass-length'] = 255 
    Capybara::Selenium::Driver.new(:profile => profile, :browser => :firefox) 
+0

Firewatir est essentiellement à la retraite. Il a utilisé JSSH pour contrôler le navigateur et il n'y a pas de support depuis Firefox 3.6. La solution actuellement recommandée pour ceux qui utilisaient FireWatir serait d'utiliser Watir-webdriver, qui utilise webdriver pour piloter le navigateur, et la solution que vous utilisez pour capybara (utilise également le pilote web) devrait fonctionner parfaitement avec Watir-Webdriver quand est utilisé pour créer la nouvelle instance de pilote à la place de Capybara. Voir http://watirmelon.com/tag/capybara/ pour une comparaison intéressante de Webdriver, Watir-webdriver, et Capybara –

Questions connexes