【问题标题】:How to do Basic Authentication using FireWatir on Ubuntu Linux?如何在 Ubuntu Linux 上使用 FireWatir 进行基本身份验证?
【发布时间】:2012-04-17 22:54:46
【问题描述】:

我正在尝试使用 FireWatir (1.6.5) 访问使用 Basic 的站点 身份验证,我一直无法找到适用的解决方案 Linux 中的火狐。 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” “管理员”。” [取消,好的]

这个对话框被阻塞了,直到我点击“确定”,goto 调用才会返回。

然后我尝试添加:

browser.startClicker("ok") 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 方法不是处理“确认”对话框的正确方法。

其他人找到了让基本身份验证工作的方法,或者如何点击 确认对话框上的确定?我已经束手无策了……

【问题讨论】:

    标签: watir firewatir


    【解决方案1】:

    这可能是一个漫长而丑陋的解决方法,并且也可能违反 watir 哲学的简单性,但既然你无计可施......

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

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

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

    您会承担代理的额外负载,但 Sahi 的表现相当不错,因此您应该能够使其工作。

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

    希望对您有所帮助。 -纳拉扬

    【讨论】:

      【解决方案2】:

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

      由此,我可以将 FireWatir::Firefox 类子类化为 新的 Browser 类,它支持 "credentials=" 方法,就像 Celerity::Browser 可以。所以,就像使用 celerity 一样,你可以这样做:

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

      这将自动填写基本身份验证对话框并让您登录 网站。

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

      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
      

      【讨论】:

      【解决方案3】:

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

      【讨论】:

      • Firewatir 基本退役了。它使用 JSSH 来控制浏览器,并且自 firefox 3.6 以来一直没有支持。对于那些正在使用 FireWatir 的人,目前推荐的解决方案是使用 Watir-webdriver,它使用 webdriver 来驱动浏览器,而您用于 capybara 的解决方案(也使用 webdriver)应该可以很好地与 Watir-Webdriver 一起工作用于创建新的驱动程序实例而不是 Capybara。有关 Webdriver、Watir-webdriver 和 Capybara 的有趣比较,请参阅 watirmelon.com/tag/capybara
      猜你喜欢
      • 2015-08-12
      • 2017-06-13
      • 2013-05-30
      • 2016-07-01
      • 2013-01-27
      • 2018-08-28
      • 2016-05-31
      • 2017-10-06
      • 2013-09-14
      相关资源
      最近更新 更多