Ubuntu Linux で FireWatir を使用して基本認証を行うにはどうすればよいですか?
質問
FireWatir(1.6.5)を使用してBasicを使用してサイトにアクセスしようとしています 認証と動作するソリューションを見つけることができませんでした LinuxのFirefox。FireWatir 1.6.5は基本認証をサポートしていますか Linuxで?2日間Webを検索していますが、 これを行う方法については、どこでもまっすぐな答えがあります。
私が見つけた唯一役に立ちそうなスレッドはこれでした (http://groups.google.com/group/watir-general/browse_thread/thread/d8ab9a177d282ce4/fc1bf2319fb387d8?lnk=gst&q=basic+authentication#fc1bf2319fb387d8).
Aedorn Varanisは「Angrezのフォークには解決策があったので、それを使っています 今。おかげでアングレズ、完璧に動作します!」と書かれていますが、彼は彼が何であるかについて言及していません。 物事を機能させるためにしました。
最初に、次を使用して認証ダイアログ ボックスをバイパスしようとしました。
ブラウザ.goto('http://admin:password@172.20.1.1')
ただし、これにより次のような「確認」ダイアログが生成されます。
「ユーザー名でサイト「172.20.1.1」にログインしようとしています "admin"です。[キャンセル、OK]
このダイアログはブロックされ、「OK」をクリックするまで goto 呼び出しは戻りません。
それから私は追加してみました:
browser.startClicker("わかりました") browser.goto('http://admin:password@172.20.1.1')
ただし、これでも同じ「確認」ダイアログが生成されます。
単体テスト/var/を使用してstartClicker機能をテストしました lib/gems/1.8/gems/firewatir-1.6.5/unittests/html/JavascriptClick.html そしてそれはうまくいったので、startClickerを使用していると思います メソッドは、確認ダイアログを処理する正しい方法ではありません。
他の誰かが基本認証を機能させる方法、またはクリックする方法を見つけました 確認ダイアログでOK?途方に暮れています...
解決 2
物事は中のFirefoxに取り組んで持っています Linuxのます。
Aedornは私にそのjsshコマンドを発行し、「ログオン」の方法を送りました 「認証が必要」ダイアログをチェックし、それが存在する場合、塗りつぶし ユーザ名/パスワードと提出ダイアログでます。
私は彼が下に送ってくれたものをコピーして貼り付けました
あなたはこのようになり、そのメソッドを使用します
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
次に、あなた自身の中でそれを呼び出すことができます スレッドだけのは、サイトに行く前に、 ログイン要件を持つ:
Thread.new { logon(user, pass) } @ff.goto("http://some_url.com") sleep 3
場合は、待機して睡眠時間を増やします ページには、負荷にしばらくかかります。もしあなたの メインプロセスが実行しようとしながら、 コマンドはJSSHを介して送信されています ソケット、それが失速し、そこに座ってます 永遠に殺されるまで。また、何もありません かどうかを検出するための現実的な方法 認証ウィンドウが起動します。それ あなたはいつも必ずそれを作るために必要があることを意味 毎回、同じように動作するか、または、 あまりにも、問題が発生します。最後に、 この方法は、常にでなければならないだろう 別のスレッド、一度理由 認証ウィンドウは、それをアップします これまで、他のすべての処理を停止し 離れて行きます。それ以外は、それが動作します。
このことから、私はFireWatir :: Firefoxのクラスをサブクラス化することができました 同じように「資格証明書=」メソッドをサポートする新しいブラウザのクラス セレリティ::ブラウザはありません。だから、ちょうどセレリティを使用してのように、あなたが行うことができます:
require 'browser'
browser = Browser.new
browser.credentials = 'user:pass'
browser.goto('http://some.basic.auth.url')
これは自動的に基本認証ダイアログに記入し、へのログインが行われます サイトます。
私は(予告この下に私のbrowser.rbファイルの内容を掲載しました
:ルビー+ firewatirおよびLinuxでのJRuby +セレリティ)で動作します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
他のヒント
これは長い醜い回避策であってもよく、また、ワチールの哲学のシンプルさに違反する可能性がありますが、あなたのウィットにあるので、...
終了します1)Sahi( http://sahi.co.in/ の)ハンドル401個の認証ダイアログによって通常のWebページに変換します。
2)Sahiのプロキシニーズ実行されている、とあなたはSahiのプロキシを使用するには、ブラウザをポイントします。
3)あなたが)その後、自分のページに移動し、普通の形のように401認証ウェブページを、(変換にユーザー名・パスワードを入力するようにワチール/ firewatir使用することができます。
あなたは、プロキシの余分な負荷がかかるだろうが、あなたはそれを動作させることができるはずですので、Sahiはかなり行儀されます。
さらにサポートが必要な場合は、ここかSahiのフォーラムに投稿することができます。
希望に役立ちます。 -Narayan
私は今日までこの問題と長く懸命に闘いました。どうやら、私はその答えが妥当に思えなかったため、何度も答えを見落としていたようです。ただし、解決策は Firefox の「network.http.phishy-userpass-length」プロファイル設定にあります。FireWatir で Firefox インスタンスのプロファイルを変更できる場合は、「network.http.phishy-userpass-length」の値を 255 に設定すると、ダイアログが表示されなくなります。チェック http://kb.mozillazine.org/Network.http.phishy-userpass-length 詳細については。
注記:Ruby の Capybara + selenium-webdriver を使用して、私はそうしました。
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)