Как выполнить базовую аутентификацию с использованием FireWatir в Ubuntu Linux? - PullRequest
2 голосов
/ 01 апреля 2010

Я пытаюсь использовать FireWatir (1.6.5) для доступа к сайту с помощью Basic Аутентификация, и я не смог найти решение, которое работает на Firefox в Linux. Поддерживает ли FireWatir 1.6.5 базовую аутентификацию в линуксе? Я искал в Интернете в течение 2 дней и не могу получить прямой ответ где угодно, как это сделать.

Единственная тема, которая мне показалась полезной, была эта ( http://groups.google.com/group/watir-general/browse_thread/thread/d8ab9a177d282ce4/fc1bf2319fb387d8?lnk=gst&q=basic+authentication#fc1bf2319fb387d8).

Эдорн Варанис говорит, что «у вилки Ангреса было решение, поэтому я использую это сейчас. Спасибо Ангрезу, отлично работает! », Но он не упоминает, что он сделал, чтобы все заработало.

Изначально я пытался обойти диалоговое окно аутентификации, используя:

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

Однако, это генерирует диалог «Подтвердить», который говорит:

"Вы собираетесь войти на сайт" 172.20.1.1 "с именем пользователя "admin". "[Отмена, ОК]

Это диалоговое окно блокируется, и вызов goto не возвращается, пока я не нажму "ОК".

Затем я попытался добавить:

browser.startClicker ( "хорошо") browser.goto ( 'http://admin:password@172.20.1.1')

Но это ТАКЖЕ генерирует тот же диалог "Подтверждение".

Я протестировал функциональность startClicker с помощью unit test / var / Библиотека / камни / 1.8 / драгоценные камни / firewatir-1.6.5 / UnitTests / HTML / JavascriptClick.html и это работало нормально, что заставляет меня думать, что с помощью startClicker метод НЕ является правильным способом позаботиться о диалоге подтверждения.

Кто-нибудь еще нашел способ заставить Basic Auth работать или как нажать ОК в диалоговом окне подтверждения? Я в своем уме ...

Ответы [ 3 ]

0 голосов
/ 05 апреля 2010

С помощью Аэдорна Вараниса я работаю над Firefox в Linux.

Аедорн прислал мне метод входа в систему, который выдает команду 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 с новый класс браузера, который поддерживает метод "credentials =", как Celerity :: Browser делает. Так же, как и при использовании celerity, вы можете сделать:

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

Это автоматически заполнит диалог Basic Auth и войдет в сайте.

Я разместил содержимое моего файла 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
0 голосов
/ 17 апреля 2012

я боролся долго и упорно с этим вопросом до сегодняшнего дня. По-видимому, я пропустил ответ много раз, потому что он не выглядел правдоподобным. Однако решение заключается в конфигурации профиля Firefox «network.http.phishy-userpass-length». Если FireWatir позволяет вам изменять ваш профиль экземпляра firefox, то вы можете присвоить «network.http.phishy-userpass-length» значение 255, которое должно заставить этот диалог исчезнуть. проверьте http://kb.mozillazine.org/Network.http.phishy-userpass-length для более подробной информации.

Примечание: с Capybara + селен-webdriver в Ruby я сделал;

    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)
0 голосов
/ 01 апреля 2010

Это может быть длинным уродливым обходным путем, а также может нарушить простоту философии Ватира, но так как вы в своем уме ...

1) Sahi (http://sahi.co.in/) обрабатывает 401 диалог аутентификации, преобразовывая их в обычные веб-страницы.

2) Необходимо запустить прокси-сервер Sahi, и вы указываете браузеру использовать прокси-сервер Sahi.

3) Затем вы можете перейти на свою страницу и просто использовать watir / firewatir, чтобы ввести пароль для имени пользователя на преобразованной веб-странице аутентификации 401 (как в обычной форме).

Вы бы понесли дополнительную нагрузку на прокси, но Sahi довольно хорошо себя ведет, поэтому вы должны быть в состоянии заставить его работать.

Вы можете оставлять сообщения здесь или на форумах Сахи, если вам нужна дополнительная помощь.

Надеюсь, это поможет. -Narayan

...