Я тестирую угловые живые обновления с водосвинкой, огурцом и полтергейстом.
У меня есть следующее определение шага, которое терпит неудачу:
Then(/^I should see the following inventory:$/) do |table|
rows = find(".inventory table").all('tr')
page_table = rows.map { |r| r.all('th,td').map { |c| c.text.strip } }
table.dup.diff!(page_table)
end
Ошибка:
Элемент, с которым вы пытаетесь взаимодействовать, либо не является частью DOM, либо в данный момент не отображается на странице (возможно, display: none установлен). Возможно, элемент был заменен другим элементом, и вы хотели взаимодействовать с новым элементом. Если это так, вам нужно выполнить новый поиск, чтобы получить ссылку на новый элемент. (Капибара::Полтергейст::ObsoleteNode)
Однако, если я оборачиваю утверждение (на самом деле просто #find) блоком ожидания (повторные попытки), тест проходит.
с блоком ожидания:
Then(/^I should see the following inventory:$/) do |table|
sleeping(0.1).seconds.between_tries.failing_after(20).tries do
rows = find(".inventory table").all('tr')
page_table = rows.map { |r| r.all('th,td').map { |c| c.text.strip } }
table.dup.diff!(page_table)
end
end
Я НЕНАВИЖУ это решение, потому что огурец/капибара должны уже иметь механизм повторных попыток. Таким образом, если этот тайм-аут повторной попытки составляет 5 секунд, вы потенциально действительно повторяете попытку в течение 5 секунд * 20 повторных попыток + дополнительные 2 секунды. Теперь я могу добавить wait: 0
к действию поиска, но все эти решения кажутся хаками.
Я использую полтергейст 1.9.8, но попытался обновиться до 2.1, и до сих пор нет кубиков. Есть ли решение для этого?