将登录表单与 Mechanize 结合使用

Zac*_*ach 5 ruby mechanize mechanize-ruby

我知道 Stackoverflow 上有与此非常相似的帖子,但我似乎仍然无法弄清楚我的尝试出了什么问题。

# login to the site 
mech.get(base_URL) do |page|
  l = page.form_with(:action => "/site/login/") do |f|
    username_field = f.field_with(:name => "LoginForm[username]")
    username_field.value = userName
    password_field = f.field_with(:name => "LoginForm[password]")
    password_field.value = password
    f.submit
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我的错误:

rb:18:in `block (2 levels) in <main>': undefined method `field_with' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

这是 HTML

<div class="bucketbody">

    <div class="form padding10">
    <form id="login-form" action="/site/login" method="post">
        <div class="row">
            <p class="note float_right">Fields with <span class="required">*</span> are required.</p>
            <label for="LoginForm_username" class="required">Email address <span class="required">*</span></label>              <input class="width_66per" autofocus="" name="LoginForm[username]" id="LoginForm_username" type="text">                         </div>

        <div class="row">
            <label for="LoginForm_password" class="required">Password <span class="required">*</span></label>               <input class="width_66per" name="LoginForm[password]" id="LoginForm_password" type="password">                          </div>

                    <div class="row rememberMe nolabel">
            <span class="field"><input id="ytLoginForm_rememberMe" value="0" name="LoginForm[rememberMe]" type="hidden"><input name="LoginForm[rememberMe]" id="LoginForm_rememberMe" value="1" type="checkbox">                <label for="LoginForm_rememberMe">Remember me on this computer</label>                              </span>
        </div>

        <p class="note"><a href="http://test.XXXXXXXX.com/user/reset">Forgot your password?</a></p>

        <div class="row buttons" style="padding-left: 0px;">
            <input class="pushButton" name="yt0" value="Login" type="submit">           </div>

    </form>     </div><!-- form -->

</div>
Run Code Online (Sandbox Code Playgroud)

页码

#<Mechanize::Page
 {url #<URI::HTTP:0x225ce70 URL:http://xxxxxx.com/>}
 {meta_refresh}
 {title "xxxxxxxxxxx | xxxxxxxxx"}
 {iframes}
 {frames}
 {links
  #<Mechanize::Page::Link "\r\n                        " "/">
  #<Mechanize::Page::Link "About xxxxxx" "/features">
  #<Mechanize::Page::Link "xxxxx Overview" "/features">
  #<Mechanize::Page::Link "xxxxxxx for Associations" "/associations">
  #<Mechanize::Page::Link "xxxxxx For Education" "/education">
  #<Mechanize::Page::Link "FAQ" "/faq">
  #<Mechanize::Page::Link "About Us" "/aboutus">
  #<Mechanize::Page::Link "About Us" "/aboutus">
  #<Mechanize::Page::Link "News & Events" "/news-events">
  #<Mechanize::Page::Link "Environmental Commitment" "/environment">
  #<Mechanize::Page::Link "Our Team" "/ourteam">
  #<Mechanize::Page::Link "The xxxxxxxxxx" "/xxxxxxxxxx">
  #<Mechanize::Page::Link "Free Trial" "/freetrial">
  #<Mechanize::Page::Link "Contact" "/contacts">
  #<Mechanize::Page::Link "Contact us" "/contacts">
  #<Mechanize::Page::Link
   "xxxxxxxxxx"
   "http://www.xxxxxxxx.com/services/web-services/">
  #<Mechanize::Page::Link
   "inquire@xxxxxxxxx.com"
   "mailto:inquire@xxxxxxxxxxx.com">
  #<Mechanize::Page::Link xxxxxx" "http://www.xxxxxxxxx.com/">
  #<Mechanize::Page::Link
   "Technology Association of Oregon"
   "http://www.techoregon.org/">
  #<Mechanize::Page::Link "" "http://www.terrapass.com/">
  #<Mechanize::Page::Link "" "http://www.arborday.org/">}
 {forms}>
Run Code Online (Sandbox Code Playgroud)

pgu*_*rio 5

你让它变得比需要的更复杂:

page = mech.get base_URL

form = page.form # page.forms[1], etc.
form['LoginForm[username]'] = userName
form['LoginForm[password]'] = password

l = form.submit form.button
Run Code Online (Sandbox Code Playgroud)


Pat*_*ity 0

尝试这个:

mech.get(base_URL) do |page|
  l = page.form_with(:action => "/site/login") do |f|
    username_field = f.field_with(:name => "LoginForm[username]")
    username_field.value = userName
    password_field = f.field_with(:name => "LoginForm[password]")
    password_field.value = password
  end.submit
end
Run Code Online (Sandbox Code Playgroud)

我将 放在/末尾:action => "/site/login/"并直接链接submit在块之后,如机械化示例页面中所示。但我没有运行该代码,所以请告诉我它是否有效。