我有一个自定义的水豚选择器
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')
也可以。
答案 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')
以倍数查找