Не удалось определить форму, используя строку «post», но «POST». HTML содержит «пост» - PullRequest
1 голос
/ 30 января 2010

Код, который не работал:

login_form = page.form_with(:method => 'post')

и код, который работает:

login_form = page.form_with(:method => 'POST')

Я проверил объект формы через puts page.forms.inspect и получил

[#<WWW::Mechanize::Form
 {name nil}
{method "POST"}
....]

Источник HTML:

<form class="login" method="post"> <fieldset>
<legend>Members Login</legend> 

<div>
<label for="auth_username">Username</label> <input id="auth_username" name="auth_username">
</div>

<div>
<label for="auth_password">Password</label> <input id="auth_password" name="auth_password" type="password">
</div>

</fieldset>
<div class="buttons">
<input name="auth_login" type="submit" value="Login"><p class="note"><a href="/forgotpassword">Forgot your password?</a></p>

</div>

</form>

Это ошибка или предполагаемое поведение?

1 Ответ

1 голос
/ 30 января 2010

Глядя на источник, может быть, что Mechanize должен работать так. Это заставляет метод формы в верхнем регистре, когда он выбирает форму; ожидается, что вы будете указывать метод в верхнем регистре, если вы хотите его сопоставить. Вы можете пропинговать механизированных людей и спросить их, должно ли это работать так.

Здесь, в Mechanize.submit, он вынуждает метод формы вводиться в верхнем регистре перед его сравнением:

def submit(form, button=nil, headers={})
  ...
  case form.method.upcase  
  when 'POST'
    ...
  when 'GET'
    ...
  end
  ...
end

и здесь снова в Form.initialize, метод принудительно вводится в верхнем регистре:

  def initialize(node, mech=nil, page=nil)
    ...
    @method           = (node['method'] || 'GET').upcase

Но в page.rb есть код, в котором mechanize сопоставляет форму (или ссылку, базу, фрейм или фрейм) с заданными вами параметрами, передаваемый параметр не обязательно вводится в верхнем регистре, поэтому сопоставление с учетом регистра :

      def #{type}s_with(criteria)
        criteria = {:name => criteria} if String === criteria
        f = #{type}s.find_all do |thing|
          criteria.all? { |k,v| v === thing.send(k) }
        end
        yield f if block_given?
        f
      end

Ну, это чувствительное к регистру совпадение, если вы передаете строку. Но если вы передадите регулярное выражение, это совпадение с регулярным выражением. Так что вы должны быть в состоянии сделать это:

login_form = page.form_with(:method => /post/i)

и пусть он работает нормально. Но я бы, вероятно, просто передал строку в верхнем регистре, отправил письмо механизаторам по электронной почте и пошел дальше.

...