如何测试页面是否存在日期选择器?Capybara测试问题求助
解决Capybara测试Rails日期选择器的问题
这个问题很常见,因为Rails的date_select helper会生成三个独立的<select>元素(分别对应年、月、日),而不是单个select,所以普通的have_select匹配器和不存在的have_date_select都会失效。下面给你几个可行的解决办法:
方法1:直接检查拆分的三个选择器
既然Rails生成的select元素name属性是deal[start_date(1i)](年)、deal[start_date(2i)](月)、deal[start_date(3i)](日),你可以直接分别验证它们的存在:
expect(page).to have_select('deal[start_date(1i)]') expect(page).to have_select('deal[start_date(2i)]') expect(page).to have_select('deal[start_date(3i)]')
这个方法最直接,不需要额外配置,适合快速验证。
方法2:封装自定义匹配器
如果你想让代码更简洁,和你原本期望的have_date_select用法一致,可以在测试辅助文件(比如spec/support/capybara_matchers.rb)里封装一个自定义匹配器:
RSpec::Matchers.define :have_date_select do |expected_name| match do |page| page.has_select?("#{expected_name}(1i)") && page.has_select?("#{expected_name}(2i)") && page.has_select?("#{expected_name}(3i)") end failure_message do |page| "expected to find date select components for #{expected_name}, but at least one was missing" end end
之后你就可以像最初想的那样使用了:
expect(page).to have_date_select('deal[start_date]')
方法3:结合标签验证(如果需要匹配显示文本)
如果你想通过界面上的"Start date"标签来验证,先确认标签存在,再检查对应的三个select:
expect(page).to have_label('Start date') # 再验证三个日期选择器 expect(page).to have_select('deal[start_date(1i)]') expect(page).to have_select('deal[start_date(2i)]') expect(page).to have_select('deal[start_date(3i)]')
为什么have_select('Start date')会失败?因为Rails生成的<label>的for属性通常指向一个不存在的id(比如deal_start_date),而实际的三个select都有各自的id(deal_start_date_1i等),Capybara无法通过标签文本关联到对应的select元素,所以匹配失败。
内容的提问来源于stack exchange,提问作者Jonathan Tuzman
相关产品推荐
相关产品推荐

