all
ведет себя по-разному в зависимости от того, используете ли вы текущую версию Capybara или более старую версию 2.x.В текущих версиях all
будет ждать до Capybara.default_max_wait_time
секунд, пока не появятся все совпадающие элементы, и если ничего не будет сделано, он вернет пустой массив (на самом деле массив, как объект Result, но достаточно близко).В 2.x all
(по умолчанию) не ожидалось сопоставления элементов, он просто возвращал пустой массив, если ни один из элементов не соответствовал.В любом случае - вы не находите подходящих элементов, а затем вызываете last
в пустом массиве - и вы получаете nil
.
. Есть несколько способов обойти это.Вы можете сказать all
, что вы ожидаете по крайней мере один соответствующий элемент (который затем заставит ждать соответствующих элементов Capybara 2.x)
amount = all('.col-amount', minimum: 1).last
или в зависимости от того, что именно вы проверяете, вы можете просто объединитьэто в один
expect(page).to have_css('.col-amount', exact_text:'$1,000.00')
, который уходит от вызова методов на элементах Capybara и использования общих сопоставителей RSpec для них (что вы не хотите делать из соображений стабильности теста, если у вас нетдругие опции).Эти два решения не проверяют одно и то же, но могут достаточно проверить то, что вы хотите.В зависимости от того, как именно ваш HTML структурирован, могут быть и более эффективные решения.
Если вы уже используете последнюю версию Capybara, то ваша ошибка будет означать, что то, что вы ожидаете увидеть на странице, отсутствует (возможно, вы находитесь на странице с ошибкой и т. Д.) Или вы неCapybara.default_max_wait_time
установлен достаточно высоко для системы, на которой вы тестируете.