Ubuntu Linux で FireWatir を使用して基本認証を行うにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2556334

  •  23-09-2019
  •  | 
  •  

質問

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

Aedorn Varanis Iからの助けを借りて、物事は中の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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top