Ruby 使用Mechanize查找下一个输入元素?

Ruby 使用Mechanize查找下一个输入元素?,ruby,mechanize,Ruby,Mechanize,使用Mechanize,是否可以在页面的HTML中找到短语,例如“电子邮件”,并找到下一个对于格式良好的HTML页面,输入元素应该有一个标签,显示输入的作用。在这种情况下,您可以迭代所有标签,找到包含文本的“email”,并通过标签的属性获取相关的输入 然而,并不是所有的HTML页面都是格式良好的。没有标签,没有属性或其他格式错误的问题 如果您指的是DOM中某个元素后面的输入。您可以执行一些DOM遍历,以查找包含“email”的元素旁边是否有input元素 如果您指的是呈现页面中某个元素旁边的输

使用Mechanize,是否可以在页面的HTML中找到短语,例如“电子邮件”,并找到下一个
对于格式良好的HTML页面,
输入
元素应该有一个
标签,显示
输入的作用。在这种情况下,您可以迭代所有
标签
,找到包含文本的
“email”
,并通过
标签
属性获取相关的
输入

然而,并不是所有的HTML页面都是格式良好的。没有
标签
,没有
属性或其他格式错误的问题

如果您指的是DOM中某个元素后面的
输入
。您可以执行一些DOM遍历,以查找包含
“email”
的元素旁边是否有
input
元素


如果您指的是呈现页面中某个元素旁边的
输入
,则应该定义什么是“next to”。我认为,不付出巨大的努力,你不可能得到你想要的。位于元素“email”之后的某些元素可能会使用CSS技巧放置在它之前。您需要一些图形API来查找
输入
。但是,我在watir的API文档中没有看到这种情况。

Mechanize在内部使用Nokogiri来处理其DOM解析,这是其在页面中定位不同元素的能力的基础

可以访问解析的DOM,并通过它使用Nokogiri来定位Mechanize通常不允许我们找到的元素。例如:

require 'mechanize'

agent = Mechanize.new
page = agent.get('http://www.example.com')

# Use Nokogiri to find the content of the <h1> tag...
puts page.at('h1').content # => "Example Domain"
要使web表单正常工作,它必须具有元素的名称。提交表单时,这些信息会传递到服务器。如果没有名称,确定哪一个输入发送了一段特定的数据将需要大量的工作,而且,由于程序员懒惰,我们不想努力工作,因此您可以指望有一个名称来处理


有关更多信息,请参见“”,另外,阅读将为您提供大量必要的信息,以了解如何完成其余操作。

首先找到包含短语文本的元素:

el = page.at('*[text()*="some phrase"]')
从中可以获得以下第一个输入:

input = el.at('./following::input')
现在,找到该输入的祖先表单节点:

form_node = input.ancestors('form')[0]
然后使用它来获取Mechanize::Form对象

form = page.form_with(:form_node => form_node)
现在你可以填写这个值了

form[input[:name]] = 'foo'

我真的很抱歉回复晚了,我的病已经好了。谢谢你在回答问题上付出的努力,这真的很有帮助:)现在一切都好了。再次感谢!:)
el = page.at('*[text()*="some phrase"]')
input = el.at('./following::input')
form_node = input.ancestors('form')[0]
form = page.form_with(:form_node => form_node)
form[input[:name]] = 'foo'