10

フォームを機械化するフィールドを追加するパブリック クラス メソッドがあります。

私は試した ..

#login_form.field.new('auth_login','Login')
#login_form.field.new('auth_login','Login')

どちらも私にエラーを与えますundefined method "new" for #<WWW::Mechanize::Form::Field:0x3683cbc> (NoMethodError)

login_form.field.new('auth_login','Login')は私にエラーを与えるしようとしました

mechanize-0.9.3/lib/www/mechanize/page.rb:13 n `meta': undefined method `search' for nil:NilClass (NoMethodError) 

しかし、その時点で私はフォームを提出します。フィールドが HTML ソースに存在しません。追加したいので、スクリプトによって送信された POST クエリには、auth_username=myusername&auth_password=mypassword&auth_login=Loginこれまでのところ送信のみが含まれてauth_username=radek&auth_password=mypasswordいるため、ログインできない可能性があります。私の考えです。

スクリプトは次のようになります

require 'rubygems'
require 'mechanize'
require 'logger'

agent = WWW::Mechanize.new {|a| a.log = Logger.new("loginYOTA.log") }
agent.follow_meta_refresh = true #Mechanize does not follow meta refreshes by default, we need to set that option.

page = agent.get("http://www.somedomain.com/login?auth_successurl=http://www.somedomain.com/forum/yota?baz_r=1")


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

puts login_form.buttons.inspect
puts page.forms.inspect
#STDIN.gets

login_form.fields.each { |f| puts "#{f.name} : #{f.value}" }    

login_form['auth_username'] = 'radeks'
login_form['auth_password'] = 'TestPass01'

#login_form['auth_login'] = 'Login'     
#login_form.field.new('auth_login','Login')
#login_form.field.new('auth_login','Login')
#login_form.fields.each { |f| puts "#{f.name} : #{f.value}" }
#STDIN.gets 

page = agent.submit login_form


#Display welcome message if logged in

puts page.parser.xpath("/html/body/div/div/div/table/tr/td[2]/div/strong").xpath('text()').to_s.strip
  puts
puts page.parser.xpath("/html/body/div/div/div/table/tr/td[2]/div").xpath('text()').to_s.strip

output = File.open("login.html", "w") {|f| f.write(page.parser.to_html) }

フォームの .inspect は次のようになります

[#<WWW::Mechanize::Form
 {name nil}
 {method "POST"}
 {action
  "http://www.somedomain.com/login?auth_successurl=http://www.somedomain.com/forum/yota?baz_r=1"}
 {fields
  #<WWW::Mechanize::Form::Field:0x36946c0 @name="auth_username", @value="">
  #<WWW::Mechanize::Form::Field:0x369451c @name="auth_password", @value="">}
 {radiobuttons}
 {checkboxes}
 {file_uploads}
 {buttons
  #<WWW::Mechanize::Form::Button:0x36943b4
   @name="auth_login",
   @value="Login">}>
]
4

2 に答える 2

11

あなたが探しているのは

login_form.add_field!(field_name, value = nil)

ドキュメントは次のとおりです。

http://rdoc.info/projects/tenderlove/mechanize

これとメソッド WWW::Mechanize::Form::Field.new の違いは、フォームにフィールドを追加する方法があまりないことを除けば、それほど大きな違いはありません。add_field の方法は次のとおりです。メソッドが実装されています....まさに期待どおりであることがわかります。Field オブジェクトをインスタンス化し、それをフォームの「fields」配列に追加します。メソッド "fields<<" は "Form" 内のプライベート メソッドであるため、コードでこれを行うことはできません。

# File lib/www/mechanize/form.rb, line 65
  def add_field!(field_name, value = nil)
    fields << Field.new(field_name, value)
  end

ちなみに、ドキュメントによると、提案した最初のバリエーションを実行できるはずです。

login_form['field_name']='value'

お役に立てれば!

于 2010-02-03T03:29:56.613 に答える
4

新しいフィールドを追加する別の方法は、フォームの投稿時に行うことです

page = agent.post( url, {'auth_username'=>'myusername',   #existing field
                         'auth_password'=>'mypassword',   #existing field
                         'auth_login'=>'Login'})   #new field
于 2010-02-03T03:59:36.180 に答える