как добавить новое поле для механизации формы (рубин/механизировать)

существует общедоступный метод класса добавить поле для механизации формы

Я попробовал..

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

и оба дают мне ошибку undefined method "new" for # (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 формы похож

[#
  #}
 {radiobuttons}
 {checkboxes}
 {file_uploads}
 {buttons
  #}>
]

10
задан Radek 2 February 2010 в 07:06
поделиться

2 ответа

Я думаю, что вы ищете

login_form.add_field!(field_name, value = nil)

Вот документы:

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

Разница между этим и методом WWW::Mechanize::Form::Field.new не так уж и велика, за исключением того, что способов добавления полей в форму не так уж и много. Вот как реализован метод add_field!....you see that it's exactly what you'd expect. Он инстанцирует объект 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'

Надеюсь, это поможет!

11
ответ дан 3 December 2019 в 21:59
поделиться

Другой способ добавления нового поля - это во время публикации формы

page = agent.post( url, {'auth_username'=>'myusername',   #existing field
                         'auth_password'=>'mypassword',   #existing field
                         'auth_login'=>'Login'})   #new field
5
ответ дан 3 December 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: