デフォルトのRailsの日付、時刻、日付時刻フィールドを使用して、Capybaraで日付セレクタを作成しようとしています。私はフィールドの選択ボックスを見つけるためにwithin
メソッドを使用していますが、xPathを使用して正しいボックスを見つけると、within
のスコープが残り、エレメントのページで最初のオカレンスが見つかります。capybara - xPathで検索すると範囲内に残る
ここに私が使用しているコードがあります。私がテストしているページには2つのdatetimeフィールドがありますが、このエラーのために最初のフィールドを変更することしかできません。現時点では、datetimeフィールドを囲む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)