gpt4 book ai didi

ruby - 如何将新字段添加到 Mechanize 表单( ruby /Mechanize )

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:11 27 4
gpt4 key购买 nike

有一个public class method将字段添加到 Mechanize 表单

我试过了..

#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">}>
]

最佳答案

我想你要找的是

login_form.add_field!(field_name, value = nil)

文档如下:

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

这个方法与方法 WWW::Mechanize::Form::Field.new 之间的区别并不大,除了向表单添加字段的方法不多这一事实。以下是 add_field!方法已实现....您可以看到这正是您所期望的。它实例化一个 Field 对象,然后将其添加到表单的“字段”数组中。您将无法在代码中执行此操作,因为方法“fields<<”是“Form”中的私有(private)方法。

# 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'

希望这对您有所帮助!

关于ruby - 如何将新字段添加到 Mechanize 表单( ruby /Mechanize ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2182374/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com