gpt4 book ai didi

watir - 无法通过带下划线的数据属性访问元素

转载 作者:行者123 更新时间:2023-12-01 07:31:51 25 4
gpt4 key购买 nike

大家好!

我有一个元素

<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”。如何通过此属性访问我的元素?

最佳答案

问题

你是对的,问题是数据属性中的下划线。正如在 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

解决方案——猴子补丁

如果使用下划线是网站的标准,我可能会考虑猴子修补 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

关于watir - 无法通过带下划线的数据属性访问元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24778434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com