Тут можна додати до наявного масиву знань:
Для тестів на JS Capybara має синхронізувати два потоки (один для RSpec, один для Rails) та другий процес (браузер). Це робиться, чекаючи (до встановленого максимального часу очікування) у більшості матчів та методів пошуку вузлів.
У Capybara також є методи, які не чекають, в першу чергу Node#all
. Використовувати їх - це як сказати своїм характеристикам, що ви хочете, щоб вони переривались періодично.
Прийнята відповідь підказує page.first('selector')
. Це небажано, принаймні для специфікацій JS, оскільки Node#first
використовуєNode#all
.
Однак це Node#first
буде чекати, якщо ви налаштуєте Capybara так:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Ця опція була додана в Capybara 2.5.0 і за замовчуванням є false.
Як згадував Андрій, замість цього вам слід скористатися
find('selector', match: :first)
або змінити перемикач. Або буде добре працювати незалежно від конфігурації чи драйвера.
Щоб ще більше ускладнити речі, у старих версіях Capybara (або з увімкненою опцією config) #find
радісно ігноруватиметься неоднозначність і просто поверне перший вибір відповідника. Це теж не чудово, оскільки це робить ваші характеристики менш явними, що, як я думаю, тому більше не поведінка за замовчуванням. Я залишу без уваги специфіку, оскільки про них вже йшлося вище.
Більше ресурсів: