首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ubuntu Linux上使用FireWatir进行基本认证?

如何在Ubuntu Linux上使用FireWatir进行基本认证?
EN

Stack Overflow用户
提问于 2010-04-01 04:43:48
回答 3查看 1.8K关注 0票数 2

我正在尝试使用FireWatir (1.6.5)来访问一个使用基本身份验证的站点,但我一直无法找到在Linux中的火狐上工作的解决方案。FireWatir 1.6.5是否支持Linux上的基本身份验证?我已经在网上搜索了两天了,但是在任何地方都找不到关于如何做到这一点的直接答案。

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

Aedorn Varanis说:“Angrez的fork已经有了解决方案,所以我现在正在使用它。感谢Angrez,它完美地工作了!”,但他没有提到他做了什么让事情正常工作。

最初,我尝试通过使用以下命令绕过身份验证对话框:

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

但是,这会生成一个“确认”对话框,该对话框显示:

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

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

然后我尝试添加:

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

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

我使用单元测试/var/ lib/gems/1.8/gems/firewatir-1.6.5/unittests/html/JavascriptClick.html测试了startClicker功能,它工作得很好,这让我认为使用startClicker方法不是处理确认对话框的正确方式。

还有谁找到了让Basic Auth工作的方法,或者如何单击确认对话框上的OK?我已经无计可施了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-06 01:42:15

在Aedorn Varanis的帮助下,我已经在Linux的Firefox上做了一些工作。

Aedorn向我发送了一个"logon“方法,该方法发出一个jssh命令,该命令检查"Authentication Required”对话框,如果存在,则填写用户名/密码并提交对话框。

我已经复制并粘贴了他在下面发给我的内容:

使用如下所示的方法:

代码语言:javascript
复制
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 (user,pass) } @ff.goto("http://some_url.com")睡眠3

如果页面需要一段时间才能加载,则增加等待和睡眠时间。如果您的主进程试图在通过JSSH套接字发送命令的同时运行,它将停止并永远停留在那里直到终止。此外,没有真正的方法来检测身份验证窗口是否出现。这意味着你需要确保它每次都以相同的方式工作,否则也会导致问题。最后,该方法必须始终在另一个线程中,因为一旦出现身份验证窗口,它就会停止所有其他处理,直到它消失。除此之外,它是有效的。

由此,我可以使用一个新的Browser类来继承FireWatir::Firefox类,该类支持"credentials=“方法,就像Celerity::Browser一样。因此,就像使用celerity一样,您可以这样做:

代码语言:javascript
复制
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中都有效):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-04-01 19:22:09

这可能是一个漫长而丑陋的变通办法,也可能违背watir哲学的简单性,但既然您已经束手无策了……

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

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

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

您可能会招致代理的额外负载,但Sahi的行为相当良好,因此您应该能够使其工作。

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

希望这能有所帮助。-Narayan

票数 0
EN

Stack Overflow用户

发布于 2012-04-17 22:54:46

我与这个问题斗争了很长时间,直到今天。显然,我多次忽略了这个答案,因为它看起来不可信。然而,解决方案在于Firefox的"network.http.phishy-userpass-length“配置文件。如果FireWatir允许你修改你的火狐实例配置文件,那么你可以给"network.http.phishy-userpass-length“一个255的值,这样对话框就会消失。有关更多详细信息,请查看http://kb.mozillazine.org/Network.http.phishy-userpass-length

注意:在Ruby中使用Capybara + selenium-webdriver,我做到了;

代码语言:javascript
复制
    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)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2556334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档