如何在Ubuntu Linux上使用FireWatir进行基本身份验证?

时间:2010-03-31 20:43:48

标签: watir firewatir

我正在尝试使用FireWatir(1.6.5)使用Basic访问网站 身份验证,我一直无法找到适用的解决方案 Linux中的Firefox。 FireWatir 1.6.5是否支持基本身份验证 在Linux上?我已经在网上搜索了2天而且无法获得 直接回答如何做到这一点。

我找到的唯一有用的线索是这个( http://groups.google.com/group/watir-general/browse_thread/thread/d8ab9a177d282ce4/fc1bf2319fb387d8?lnk=gst&q=basic+authentication#fc1bf2319fb387d8)。

Aedorn Varanis说“Angrez的叉子有解决方案所以我正在使用它 现在。谢谢Angrez,工作得很完美!“,但他没有提到他是什么 做得好事。

最初我尝试使用以下方法绕过身份验证对话框:

browser.goto( 'http://admin:password@172.20.1.1')

然而,这会生成一个“确认”对话框,其中显示:

“您即将使用用户名登录网站”172.20.1.1“ “admin”。“[取消,确定]

此对话框阻止,直到我单击“确定”后才会返回goto调用。

然后我尝试添加:

browser.startClicker( “OK”) browser.goto( 'http://admin:password@172.20.1.1')

但是这个ALSO会生成相同的“确认”对话框。

我使用单元测试/ var /测试了startClicker功能 LIB /宝石/ 1.8 /宝石/ firewatir-1.6.5 /单元测试/ HTML / JavascriptClick.html 它工作正常,这让我觉得使用startClicker 方法不是处理确认对话框的正确方法。

其他人找到了让Basic Auth工作或如何点击的方法 确认对话框上的确定?我的智慧结束了......

3 个答案:

答案 0 :(得分:0)

这可能是一个长期丑陋的解决方法,也可能违反了watir哲学的简单性,但是因为你的智慧结束了......

1)Sahi(http://sahi.co.in/)通过将其转换为常规网页来处理401认证对话框。

2)Sahi的代理需要运行,并指向浏览器使用Sahi的代理。

3)然后,您可以导航到您的页面,只需使用watir / firewatir在转换后的401认证网页中输入用户名密码(就像常规表格一样)。

你会承担代理的额外负担,但Sahi的表现相当好,所以你应该能够让它发挥作用。

如果您需要进一步的帮助,可以在这里或在Sahi的论坛上发帖。

希望有所帮助。 -Narayan

答案 1 :(得分:0)

在Aedorn Varanis的帮助下,我已经开始使用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发送   插座,它会停转并坐在那里   永远直到被杀而且,没有   真正的方法来检测是否   验证窗口出现。那   意味着你需要始终确保它   每次都以相同的方式工作,或者它,   也会导致问题。最后,   方法总是必须在   另一个线程,因为曾经的   验证窗口出现了,它   停止所有其他处理,直到它   消失了。除此之外,它有效。

由此,我能够使用a将FireWatir :: Firefox类子类化 新的Browser类,它支持“credentials =”方法,就像 Celerity ::浏览器。所以,就像使用celerity一样,你可以这样做:

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

这将自动填写Basic Auth对话框并登​​录 该网站。

我已经在下面发布了我的browser.rb文件的内容(请注意这一点 适用于linux中的ruby + firewatir和jruby + celerity:

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

答案 2 :(得分:-1)

直到今天,我一直在努力解决这个问题。显然我多次忽略了这个答案,因为它看起来并不合理。但是,解决方案在于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)