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

使用Mechanize,是否可以在页面的HTML中找到一个短语,例如“email”,然后找到下一个<input* ,并填写该输入字段,只填写该字段?

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

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

 require 'mechanize' agent = Mechanize.new page = agent.get('http://www.example.com') # Use Nokogiri to find the content of the 

tag... puts page.at('h1').content # => "Example Domain"

对于您的搜索,您需要使用XPath访问器来查找页面中“email”的位置。 完成后,您可以找到下一个标记。

从一个简单的HTML片段开始,我们假装它来自Mechanize:

 page = Nokogiri::HTML('

email

') puts page.to_html

看起来像:

  

email

正在搜索“电子邮件”:

 page.at("//*[contains(text(),'email')]") #]> 

在此基础上,这将获得标记:

 input_tag = page.at("//*[contains(text(),'email')]/following-sibling::input") #]> 

一旦找到输入标记,就可以使用Nokogiri从标记中获取“名称”,然后告诉Mechanize找到并填写该特定输入字段:

 input_tag['name'] => "email" 

要使Web表单正常运行,它必须具有元素的名称。 那些在提交表单时传递给服务器。 如果没有名称,确定哪个输入发送了特定的数据需要做很多工作,而且程序员很懒,我们不想努力工作,所以你可以指望有一个名字可以使用。

有关更多信息,请参阅“ Ruby Mechanize,Nokogiri和Net :: HTTP ”,以及对Stack Overflow的搜索 ,阅读Nokogiri文档和教程将为您提供大量所需信息,以便了解如何完成其​​余工作。

首先找到带有短语text的元素:

 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' 

对于格式良好的 HTML页面, input元素应该有一个label显示input内容。 在这种情况下,您可以迭代所有label ,找到包含文本"email"label ,并通过labelfor属性获取相关input

但是,并非所有HTML页面都是格式良好的。 没有label ,没有属性或其他不正确的问题。

如果你的意思是在DOM中的某个元素之后input 。 您可以执行一些DOM遍历来查找包含"email"的元素是否在其旁边有一个input元素。

如果您指的是渲染页面中元素旁边的input ,则应定义“旁边”的内容。 我认为如果不付出努力,你就无法得到你想要的东西。 位于元素“email”之后的某些元素可能会放在它之前,并带有一些CSS技巧。 您需要一些图形API来查找input 。 但是,我没有在watir的API文档中看到这watir