В процессе написания теста формы для cucumber столкнулся с проблемой заполнения поля типа дата. Как известно стандартный рельсовый вариант состоит из трёх select-ов где выбираются соответственно год, месяц и день. Какого-то встроенного решения для заполнения такого вида полей я к своему удивлению не нашёл. Ниже напишу как проблема была разрешена.
moduleCucumber moduleRails moduleCapybaraSelectDatesAndTimes defselect_date(field, options = {}) date = Date.parse(options[:with]) selector = %Q{.//fieldset[contains(./legend, "#{field}")]} within(:xpath, selector) do find(:xpath, '//select[contains(@id, "_1i")]').find(:xpath, ::XPath::HTML.option(date.year.to_s)).select_option find(:xpath, '//select[contains(@id, "_2i")]').find(:xpath, ::XPath::HTML.option(date.strftime('%B').to_s)).select_option find(:xpath, '//select[contains(@id, "_3i")]').find(:xpath, ::XPath::HTML.option(date.day.to_s)).select_option end end
defselect_time(field, options = {}) time = Time.parse(options[:with]) selector = %Q{.//fieldset[contains(./legend, "#{field}")]} within(:xpath, selector) do find(:xpath, '//select[contains(@id, "_4i")]').find(:xpath, ::XPath::HTML.option(time.hour.to_s.rjust(2,'0'))).select_option find(:xpath, '//select[contains(@id, "_5i")]').find(:xpath, ::XPath::HTML.option(time.min.to_s.rjust(2,'0'))).select_option end end
defselect_datetime(field, options = {}) select_date(field, options) select_time(field, options) end end end end
Собственно проблемой тут стали селекторы для группы полей — в данном случае это fieldset с label-ом внутри, что само по себе и правильно, но в моём случае использовался twitter bootstrap и селекторы пришлось «доработать напильником».
Комментарии