capybara -Поиск с помощью xPath выходит за пределы области действия

Я пытаюсь создать селектор даты с помощью Capybara, используя поля даты, времени и даты и времени Rails по умолчанию. Я использую метод within, чтобы найти поля выбора для поля, но когда я использую xPath для поиска правильного поля, он покидает область withinи находит первое вхождение на странице элемента.

Вот код, который я использую. Страница, на которой я тестирую, имеет 2 поля даты и времени, но я могу заставить ее изменить только первое из-за этой ошибки. На данный момент у меня есть контейнер 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)
12
задан Nick 20 April 2012 в 16:41
поделиться