Ruby capybara-Find with xPath正在将

Ruby capybara-Find with xPath正在将,ruby,ruby-on-rails-3,cucumber,capybara,ruby-1.9.2,Ruby,Ruby On Rails 3,Cucumber,Capybara,Ruby 1.9.2,我正在尝试使用默认的Rails日期、时间和日期时间字段,使用Capybara构建一个日期选择器。我使用in方法查找字段的选择框,但当我使用xPath查找正确的框时,它将保留在范围内,并查找元素页面上的第一个匹配项 这是我正在使用的代码。我正在测试的页面有2个datetime字段,但由于此错误,我只能让它更改第一个字段。目前,我有一个id为的div容器,它包装了datetime字段,但我确实计划切换代码以按标签查找 module Marketron module DateTime

我正在尝试使用默认的Rails日期、时间和日期时间字段,使用Capybara构建一个日期选择器。我使用
in
方法查找字段的选择框,但当我使用xPath查找正确的框时,它将
保留在
范围内,并查找元素页面上的第一个匹配项

这是我正在使用的代码。我正在测试的页面有2个datetime字段,但由于此错误,我只能让它更改第一个字段。目前,我有一个id为的div容器,它包装了datetime字段,但我确实计划切换代码以按标签查找

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]}\")]")
示例:

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

但是您可以看到,通过指定要在当前节点内查看的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
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
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