将哈希传递给水豚选择器

时间:2018-10-11 02:36:08

标签: capybara

我有一个自定义的水豚选择器

module Selectors
  Capybara.add_selector(:dataAttribute) do
    xpath { |attribute| ".//*[@data-target='#{attribute}']" }
  end
end


find(:dataAttribute, 'myButton')

它很好用。

现在,我需要对其进行概括并能够传递数据属性,以便可以找到例如<div data-behavior"hideYourself">...</div>

理想情况下,我想在下面使用API​​

find(:dataAttribute, attribute: 'behavior', value: 'hideYourself')
#OR
find(:dataAttribute, { attribute: 'behavior', value: 'hideYourself' })

所以,我对选择器进行了如下更新

module Selectors
  Capybara.add_selector(:dataAttribute) do
    xpath { |params| ".//*[@data-#{params[:attribute]}='#{params[:value]}']" }
  end
end

但是我得到NoMethodError: undefined method '[]' for nil:NilClass。 我做了一些调试,发现在当前选择器(1个字符串参数)中,块中的值已正确设置(例如myButton)。但是,当我传递哈希值时,其值为nil

有没有办法将多个参数传递给选择器?

find(:dataAttribute, 'behavior', 'hideYourself')也可以。

1 个答案:

答案 0 :(得分:1)

水豚查找使用选择器类型,可选的定位器和选项。您遇到的问题是,如果您将Hash作为第二个参数传递,然后没有将第三个参数解释为未传递定位符和一个选项哈希,那么您将遇到此问题。因此,您可以通过传递一个空的选项哈希来使用选择器,从而将属性/值哈希解释为定位符

find(:dataAttribute, attribute: 'behavior', value: 'hideYourself', {})

然后可以将它们全部包装在find_data_attribute帮助方法中,这样您就不必手动传递空选项哈希。

def find_data_attribute(locator, **options)
  find(:dataAttribute, locator, options)
end

另一个选项是用不同的方式编写选择器,而是使用选项-类似于

Capybara.add_selector(:dataAttribute) do
  xpath(:attribute, :value) do |_locator, attribute:, value:, **| 
    ".//*[@data-#{attribute}='#{value}']"
  end
end

告诉选择器期望传递:attribute和:value选项,这将允许find(:dataAttribute, attribute: 'behavior', value: 'hideYourself')工作。

最后一个选择是使用通配符选项匹配符

Capybara.add_selector(:dataAttribute) do
  xpath do |_locator, **|
    #you could use the locator to limit by element type if wanted - see Capybaras built-in :element selector - https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selector.rb#L467
    XPath.descendant
  end

  expression_filter(:attributes, matcher: /.+/) do |xpath, name, val|
    xpath[XPath.attr("data-#{name}")==val]
  end
end

那应该允许你做什么

find(:dataAttribute, behavior: 'hideYourself')

通过一个数据属性或

查找
find(:dataAttribute, behavior: 'hideYourself', other_data_attr_name: 'some value')

以倍数查找