capybara - 使用 xPath 查找离开范围内

2024-01-09

我正在尝试使用 Capybara 使用默认的 Rails 日期、时间和日期时间字段构建日期选择器。我正在使用within方法来查找字段的选择框,但是当我使用 xPath 查找正确的框时,它会留下within范围并查找该元素在页面上的第一次出现。

这是我正在使用的代码。我正在测试的页面有 2 个日期时间字段,但由于此错误,我只能更改第一个字段。目前我有一个带有 id 的 div 容器,它包含日期时间字段,但我确实计划将代码切换为通过标签查找。

module  Marketron
  module DateTime

    def select_date(field, options = {})
      date_parse = Date.parse(options[:with])

      year = date_parse.year.to_s
      month = date_parse.strftime('%B')
      day = date_parse.day.to_s

      within("div##{field}") do
        find(:xpath, "//select[contains(@id, \"_#{FIELDS[:year]}\")]").select(year)
        find(:xpath, "//select[contains(@id, \"_#{FIELDS[:month]}\")]").select(month)
        find(:xpath, "//select[contains(@id, \"_#{FIELDS[:day]}\")]").select(day)
      end

    end

    def select_time(field, options = {})
      require "time"
      time_parse = Time.parse(options[:with])

      hour = time_parse.hour.to_s.rjust(2, '0')
      minute = time_parse.min.to_s.rjust(2, '0')

      within("div##{field}") do
        find(:xpath, "//select[contains(@id, \"_#{FIELDS[:hour]}\")]").find(:xpath, "option[contains(@value, '#{hour}')]").select_option
        find(:xpath, "//select[contains(@id, \"_#{FIELDS[:minute]}\")]").find(:xpath, "option[contains(@value, '#{minute}')]").select_option

      end

    end

    def select_datetime(field, options = {})
      select_date(field, options)
      select_time(field, options)
    end

    private

      FIELDS = {year: "1i", month: "2i", day: "3i", hour: "4i", minute: "5i"}

  end
end

World(Marketron::DateTime)

您应该在 xpath 中通过添加一个来指定要从当前节点开始.到开头:

find(:xpath, ".//select[contains(@id, \"_#{FIELDS[:year]}\")]")

Example:

我测试了这个 HTML 页面(希望不要过度简化您的页面):

<html>
    <div id='div1'>
        <span class='container'>    
            <span id='field_01'>field 1</span>
        </span>
    </div>
    <div id='div2'>
        <span class='container'>
            <span id='field_02'>field 2</span>
        </span>
    </div>  
</html>

使用 inside 方法,您可以在执行此操作时看到问题:

within("div#div1"){ puts find(:xpath, "//span[contains(@id, \"field\")]").text }
#=> field 1
within("div#div2"){ puts find(:xpath, "//span[contains(@id, \"field\")]").text }
#=> field 1

但是您可以看到,但指定要在当前节点内查找的 xpath (即使用.),你会得到你想要的结果:

within("div#div1"){ puts find(:xpath, ".//span[contains(@id, \"field\")]").text }
#=> field 1
within("div#div2"){ puts find(:xpath, ".//span[contains(@id, \"field\")]").text }
#=> field 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

capybara - 使用 xPath 查找离开范围内 的相关文章

随机推荐