无效的代码:
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>
这是一个错误还是预期的行为?
答案 0 :(得分:1)
从源头看,可能是Mechanize应该像那样工作。它在获取表单时强制将form方法设置为大写;当您想要匹配它时,您应该以大写形式提供该方法。你可能会对机械化人员进行ping操作并询问他们是否应该这样做。
在Mechanize.submit中,它在将form方法比较之前将其强制为大写:
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中,机械化将表单(或链接,基础,框架或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人发送一封电子邮件,继续前进。