【问题标题】:CSS 'contains' selector & upgrade of CapybaraCSS“包含”选择器和 Capybara 的升级
【发布时间】:2013-06-05 10:02:32
【问题描述】:

以前我的规格有以下几行:

within "h3:contains('FooBar text') + dl" do
  page.should have_content 'FizzBuzz'
end

(在包含指定文本的标题的下一个定义列表中)

我升级了 capybara-webkit,现在“包含”选择器不起作用
(这很好理解,因为它在 CSS3 中已被弃用)。

我想不出一个简单的方法来重写它。有什么想法吗?

【问题讨论】:

    标签: css ruby-on-rails css-selectors capybara qtwebkit


    【解决方案1】:

    如果你想避免必须弄清楚xpath,你可以使用Nokogiri::CSS.xpath_for它返回一个数组所以你需要做[0]

    within :xpath, Nokogiri::CSS.xpath_for("<CSS SELECTOR>")[0] do
    

    【讨论】:

      【解决方案2】:

      我认为您不仅升级了 capybara-webkit,还升级了 capybara。

      Capybara 2.1 现在使用驱动程序的 CSS 选择器实现。

      以前它之所以有效,是因为 Capybara 使用 Nokogiri 将 CSS 选择器转换为 XPath。 Nokogiri 似乎支持:contains 伪选择器(因为此代码以前有效)。

      你可以像这样使用 XPath 重写它:

      within(:xpath, "//dl[preceding-sibling::h3[contains(text(),'FooBar text')]]") do
        page.should have_content 'FizzBuzz'
      end
      

      不过,我认为它的可读性不太高,所以最好选择一个更短、更易读的更好的选择器。

      【讨论】:

      • 这或多或少是我最终的结果。丑陋,但有效。
      • contains(text(),'FooBar text') == contains(.,'FooBar text')
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 2011-01-01
      • 2020-10-17
      相关资源
      最近更新 更多