如何检查我的 select 菜单中的某个选项是否包含文本?

How to check if one of the options in my select menu contains text?

我正在使用 Rails 4.2.7 和 Nokogiri。有没有一种方法可以告诉我,通过 Nokogiri,我的 select 菜单中的一个选项在其文本字段中包含 "Results" 一词(最终用户可以看到)?

我有:

options = doc.css("#menu_id option")

我可以循环浏览所有这些内容,检查文本,但我想可能会有一个 CSS-select 或表达式或类似的东西,我可以用 Nokogiri 来告诉我这个回答更快。

Nokogiri 支持 jQuery 的 :contains 选择器,它选择具有给定内容的节点:

doc.css(“#menu_id option:contains('Results'")

您也可以使用 XPath 来完成,它功能更强大但更冗长:

doc.xpath('//*[@id='menu_id']//option[contains(text(), "Results")]')

参见“Nokogiri: How to select nodes by matching text?”。

这是通用的方法:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
    <form>
      <select id="menu_id">
        <option value="foo">foo</option>
      </select>
    </form>
  </body>
</html>
EOT

doc.search('#menu_id option').any?{ |option| option.text == 'foo' } # => true

查看文本(而不是值)是否为 "foo"

doc.search('#menu_id option').any?{ |option| option.text['foo'] } # => true

查看文本(而不是值)是否包含子字符串 "foo"

doc.search('#menu_id option').any?{ |option| option['value'] == 'foo' } # => true

查看 value 参数是否匹配单词 "foo"

同样,他们会告诉您是否匹配:

doc.search('#menu_id option').any?{ |option| option.text == 'bar' } # => false
doc.search('#menu_id option').any?{ |option| option.text['bar'] } # => false
doc.search('#menu_id option').any?{ |option| option['value'] == 'bar' } # => false

我可能会依赖 Nokogiri 对 @gmcnaughton 提到的 jQuery 扩展的实现,但我就是这样。 YMMV.