7

我想在黄瓜中找到一个 html 元素的最近父级。就像 jQuery 的 .closest() 函数一样。

这是我的(伪)代码:

  aspect = find('.dropdown li:contains('+selector+')')
  dropdown = aspect.closest('.dropdown') #<-- the closest() function does not exist

  if not aspect.hasClass('.selected')
    dropdown.click
    sleep 1
    aspect.click
  end

谁能告诉我如何使用 Capybara 来完成这个?

干杯!

曼努埃尔

4

3 回答 3

2

这不是一个通用的解决方案,但如果您只想单击元素,我建议直接使用 jQuery:

page.execute_script('$(...).closest(...).click()')

除此之外,Capybara 没有 .closest 方法,但在许多情况下,更有创意的选择器(可能使用 XPath)可能会奏效。

于 2011-12-08T21:56:26.957 回答
1

尝试这个。

module CapybaraNodeElementExtension
  def closest(*args)
    parent = first(:xpath, './/..', wait: false)
    until parent.matches_selector?(*args)
      # return nil if not found
      if parent.matches_selector?(:xpath, '/HTML')
        parent = nil
        break
      end
      parent = parent.first(:xpath, './/..', wait: false)
    end

    parent
  end
end

Capybara::Node::Element.send(:include, CapybaraNodeElementExtension)

此代码不适用于版本 2.18。matches_selector?失败。请尝试 3.7。

于 2018-09-10T04:16:16.450 回答
1

现在使用ancestorfinder 应该可以做到这一点。Capybara 2.15.0 在 2017-08-04添加了ancestor方法,所以你现在应该可以做这样的事情了:

  aspect = find('.dropdown li:contains('+selector+')')
  dropdown = aspect.ancestor('.dropdown')

文档ancestor

于 2019-07-17T18:19:52.450 回答