Ввод данных для входа на сайт, который не использует формы с помощью Mechanize/Ruby

Мне нужно войти на сайт, чтобы запустить некоторые скрипты. Mechanize с Nokogiri выглядит идеально для этой задачи, но мне трудно вводить информацию для входа, поскольку поля ввода не расположены в формах (agent.page.forms.first дает ноль):

    <div class="loginform" id="login_form">
      <div>
        <input type="text" id="loginname" tabindex="1"/>
      </div>
      <div>
        <input type="password" id="password" tabindex="2"/>
        <input type="text" id="password_text" style="display:none;"/>
      </div>
      <div class="signin"><a href="javascript:void(0);" class="sp" id="login_submit_btn"></a>
      </div>
    </div>

Можно ли как-то перейти к элементам ввода (они единственные на странице), а затем ввести свое имя пользователя и пароль для входа? Если Mechanize не может сделать что-то подобное, есть ли альтернативы? Большое спасибо.


person jengman cd    schedule 17.10.2011    source источник


Ответы (2)


Я думаю, вам лучше проверить весь источник (включая javascript), как веб-сайт вас связывает. На мой взгляд, это должен быть HTTP-запрос POST... и использовать его для ведения журнала напрямую, без разбора главной страницы с помощью запроса GET, но с использованием Mechanize post method вместо этого:

agent = Mechanize.new
url = 'http://website.com/hidden_login_page.php'
page = agent.post(url, {"login" => "foo", "password" => "bar"})

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

person cz3ch    schedule 19.10.2011
comment
Да, похоже, что действительно происходит какой-то javascript, но в настоящее время у меня нет необходимых навыков, чтобы расшифровать, как он на самом деле публикуется. Спасибо за предложение. Я буду продолжать пыхтеть. - person jengman cd; 23.10.2011
comment
для какого веб-сайта и URL-адреса он предназначен? - person cz3ch; 24.10.2011
comment
Ха-ха, я бы не хотел говорить открыто, но могу я отправить вам сообщение? Это несколько деликатно (хотя и не в незаконном или неэтичном смысле). Но в любом случае, как предположил другой комментатор, я использовал Selenium, и после некоторых попыток он добился цели! Спасибо вам и Шону за вашу помощь. - person jengman cd; 02.11.2011
comment
Конечно, вы можете отправить мне сообщение, и я посмотрю на это... Я думаю, что Selenium, на мой взгляд, сложнее кодировать. И я не уверен, что он намного более универсален. Не стесняйтесь присылать мне URL. - person cz3ch; 03.11.2011

У меня недавно была такая проблема. Попробуйте следующее в механизировать:

page.field_with(:name => "loginname").value = "foo"
page.field_with(:name => "password").value = "bar"

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

Ваше здоровье!

person Sean    schedule 17.10.2011
comment
Спасибо @sean за подсказку! К сожалению, я не уверен, что страница может выполнять метод field_with. Я получаю сообщение об ошибке nokotest.rb:11:in <main>': undefined method field_with' for #<Mechanize::Page: 0xe5c638> (NoMethodError), когда попробовал ваше действительно полезное предложение. Опять же, я думаю, что формы необходимы для использования field_with... Любые другие предложения? - person jengman cd; 17.10.2011
comment
Единственное, о чем я могу думать, это использовать Selenium и заставить его записывать ваше действие при входе в систему, а затем экспортировать его, чтобы вы могли работать с ним таким образом. - person Sean; 17.10.2011
comment
Селен сделал свое дело! Спасибо за предложение, Шон. Это немного медленнее, чем то, что может сделать Mechanize, но на данный момент он выполнит свою работу. - person jengman cd; 23.10.2011