【问题标题】:Nokogiri Error: undefined method `radiobutton_with' - Why?Nokogiri 错误:未定义的方法 `radiobutton_with' - 为什么?
【发布时间】:2011-01-28 23:21:45
【问题描述】:

我尝试使用 mechanize (Ruby) 访问表单。 在我的表单上,我有一组单选按钮。 所以我想检查其中之一。

我写道:

target_form = (page/:form).find{ |elem| elem['id'] == 'formid'}
target_form.radiobutton_with(:name => "radiobuttonname")[2].check

在这一行中,我想检查值为 2 的单选按钮。 但在这一行,我得到一个错误:

: undefined method `radiobutton_with' for #<Nokogiri::XML::Element:0x9b86ea> (NoMethodError)

【问题讨论】:

  • 根据文档,您的表单应该是 Mechanize::Form 类,而不是 Nokogiri::XML::Element。你是怎么得到target_form的?
  • target_form: target_form = (page/:form).find { |elem| elem['id'] == 'formid'}
  • 您应该使用Mechanize::Page#form_with 方法来获取表单。顺便说一句,我根本不确定您的页面是 Mechanize::Page
  • page = agent.get('mypage.xy') 这就是我定义页面的方式
  • 我想你有多个同名的单选按钮,你需要第三个。在这种情况下,只需调用 radiobuttons_with 而不是 radiobutton_with 方法(注意复数)。

标签: ruby nokogiri mechanize


【解决方案1】:

出现问题是因为使用 Mechanize 页面作为 Nokogiri 文档(通过调用 / 方法,或 search,或 xpath 等)返回 Nokogiri 元素,而不是使用其特殊方法的 Mechanize 元素。

如 cmets 中所述,您可以确保通过使用 form_with 方法来查找您的表单来获得 Mechanize::Form

但有时,您可以使用 Nokogiri 找到您想要的元素,但无法使用 Mechanize。例如,考虑一个带有&lt;select&gt; 元素但不在&lt;form&gt; 内的页面。由于没有表单,因此无法使用 Mechanize field_with 方法查找 select 并获取 Mechanize::Form::SelectList 实例。

如果您有一个 Nokogiri 元素并且想要 Mechanize 等效项,则可以通过将 Nokogiri 元素传递给构造函数来创建它。例如:

sel = Mechanize::Form::SelectList.new( page.at_xpath('//select[@name="city"]') )

如果你有一个Nokogiri::XML::Element 并想要一个Mechanize::Form

# Find the xml element
target_form = (page/:form).find{ |elem| elem['id'] == 'formid'}
target_form = Mechanize::Form.new( target_form )

附言上面的第一行更简单地由 target_form = page.at_css('#formid') 实现。

【讨论】:

  • 要真正能够提交表单,您必须将最后一行更改为 target_form = Mechanize::Form.new(target_form, mech_object, page)
  • @raphinesse 哦?你的话我记住了。 mech_object 对象是什么?
  • 您的“代理”,Mechanize 对象。有关详细信息,请参阅Mechanize::Form#new docs。如果你看一下Mechanize::Form#submit's source,你会注意到它试图调用@mech.submit,当没有提供mech 参数时会失败。我猜page 参数也是如此。
  • 最后一件事:在最新版本的 Mechanize 中似乎没有 Mechanize::Page#at_cssMechanize::Page#at 工作正常但是...
猜你喜欢
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
相关资源
最近更新 更多