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

时间:2014-07-16 10:26:11

标签: watir watir-webdriver

大家好日子!

我有一个元素

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

1 个答案:

答案 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