Поиск Капибары принимает тип селектора, необязательный локатор, а затем параметры.Проблема, с которой вы сталкиваетесь, заключается в том, что вы передаете 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
, которое сообщаетСелектор для ожидаемых: атрибута и: значения параметров, которые должны быть переданы, что позволило бы работать 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')
найти по коэффициентам