水豚在指定断言的“范围内”

Capybara ingore `within` scope at specify assertion

假设我正在使用 Capybara 和 Minitest 测试一个表单,该表单有一个文本输入,它使用 bootstrap-datepicker,我想取消范围(如 ActiveRecord)仅在('form')范围内在 assert_selector '.datepicker-dropdown', count: 1,因为 .datepicker-dropdown 附加到正文而不是表单

within "form" do
  # other tests...
  find("input.date-picker").click
  assert_selector '.datepicker-dropdown', count: 1 
  # failed because .datepicker-dropdown is appended to body
end

虽然 bootstrap-datepicker 有一个选项 container 来指定在何处附加 datepicker-dropdown 小部件,但不适合这种情况。

有两种方法可以转义within的范围。第一种是使用 XPath 并通过故意破坏范围

来利用 Xpath 陷阱 (https://github.com/teamcapybara/capybara#beware-the-xpath--trap)
assert_xpath '//*', class: 'datepicker-dropdown', count: 1

第二种(可能更清晰)方法是使用 page.document 方法转义当前范围

assert_selector page.document, '.datepicker-dropdown', count: 1