1

動作しなかったコード:

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>

これはバグですか、それとも意図した動作ですか?

4

1 に答える 1

1

ソースを見ると、Mechanize はそのように動作することになっている可能性があります。フォームをフェッチするときに、フォーム メソッドを強制的に大文字にします。一致させたい場合は、メソッドを大文字で指定する必要があります。機械化した人に ping を打って、そのように動作するはずかどうか尋ねることができます。

ここ 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 がフォーム (またはリンク、ベース、フレーム、または iframe) を照合するコードです。渡されたパラメーターは大文字に強制されないため、大文字と小文字が区別されます。

      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)

そしてそれをうまく働かせてください。しかし、大文字の文字列を渡し、Mechanize 担当者にメールを送信して先に進むことになるでしょう。

于 2010-01-30T01:55:24.263 に答える