大家好日子!
我有一个元素
<tbody class="cp-ads-list__table-item _sas-offers-table__item cp-ads-list__table- item_state-deposit" data-card_id="16676514">
我想通过data-card_id标签访问它,但是当我尝试以下
时@browser.tbody(:data_card_id => "16676514").hover
我收到错误
unable to locate element, using {:data_card_id=>"16676514", :tag_name=>"tbody"} (Watir::Exception::UnknownObjectException)
如果标签是“data-card-id”,我想我的代码会有效,但它是“data-card_id”。 如何通过此属性访问我的元素?
答案 0 :(得分:4)
<强>问题强>
您是对的,问题是数据属性中的下划线。如ElementLocator中所示,在构建XPath表达式时,所有下划线都将转换为破折号(在语句的else部分中):
def lhs_for(key)
case key
when :text, 'text'
'normalize-space()'
when :href
# TODO: change this behaviour?
'normalize-space(@href)'
when :type
# type attributes can be upper case - downcase them
# https://github.com/watir/watir-webdriver/issues/72
XpathSupport.downcase('@type')
else
"@#{key.to_s.gsub("_", "-")}"
end
end
解决方案 - 一次性
如果这是唯一使用下划线(而不是短划线)的数据属性,我可能会手动构建XPath或CSS表达式。
@browser.tbody(:css => '[data-card_id="16676514"]').hover
解决方案 - Monkey Patch
如果使用下划线是网站上的标准,我可能会考虑猴子修补lhs_for方法。您可以修改方法,以便只更改数据属性的第一个下划线:
module Watir
class ElementLocator
def lhs_for(key)
puts 'hi'
case key
when :text, 'text'
'normalize-space()'
when :href
# TODO: change this behaviour?
'normalize-space(@href)'
when :type
# type attributes can be upper case - downcase them
# https://github.com/watir/watir-webdriver/issues/72
XpathSupport.downcase('@type')
else
if key.to_s.start_with?('data')
"@#{key.to_s.sub("_", "-")}"
else
"@#{key.to_s.gsub("_", "-")}"
end
end
end
end
end
这将允许您的原始代码工作:
@browser.tbody(:data_card_id => "16676514").hover