Ничего не происходит при нажатии кнопки в огурце, тест капибары перед добавлением сна

У меня проблема: у меня есть страница с купоном, который должен меняться при нескольких нажатиях кнопок.

Однако в одном случае кажется, что я не могу нажать определенную кнопку, не добавляя сон между поиском элемента и нажатием кнопки.

нерабочий код:

element = page.find("[for='someButton']"])
element.click()

рабочий код:

element = page.find("[for='someButton']"])
sleep 2
element.click()

Мне интересно, могу ли я что-нибудь сделать, чтобы исправить эту проблему, не добавляя сон, так как я боюсь, что это сделает мой тест более хрупким, а также вызовет ненужную задержку

PS. Никаких ошибок не выдает, и я не писал веб-приложение сам. Тем не менее, я поговорил с тем, кто реализовал эту страницу, и он сказал, что в этой кнопке не должно быть ничего особенного и что к ней должен быть добавлен прослушиватель событий, как только страница загружается.


person Metareven    schedule 02.12.2013    source источник
comment
Как это не удается? Вы получаете тайм-аут или нажимаете не на ту вещь?   -  person Louis    schedule 02.12.2013
comment
Абсолютно ничего не происходит (я не получаю никаких указаний на то, что что-то пошло не так в консоли), и дальше тест завершается неудачей, когда я ожидаю, что купон изменился после нажатия кнопки.   -  person Metareven    schedule 02.12.2013
comment
Эта проблема теперь, кажется, обострилась, и после обновления нашего одностраничного приложения поиск и нажатие кнопки сразу после входа в новое лобби в нашем приложении ничего не происходит, и я был вынужден добавить 1 секунду сна повсюду.   -  person Metareven    schedule 03.12.2013


Ответы (1)


Это может произойти, если кнопка отображается в DOM до привязки обработчика события клика. Capybara сможет найти элемент, как только он появится в DOM.

Если это так, тесты на самом деле показывают вам, что есть (незначительная) ошибка. Реальный конечный пользователь, который нажал кнопку во время загрузки страницы, увидит тот же результат. Более чистым вариантом было бы визуализировать кнопку с помощью JavaScript и одновременно привязать обработчик кликов.

Если смена страницы для вас не вариант, надежда еще есть. Если на странице есть что-то еще, отображаемое JavaScript в той же итерации цикла событий, вы можете добавить что-то в тест, который ищет это, прежде чем пытаться нажать кнопку. Например, в приложении, над которым я работаю на работе, мы отображаем анимированный GIF-файл Spinner на странице при ее загрузке, а затем прячем в JavaScript, когда страница полностью загружена. Наши тесты Capybara ждут, пока GIF-спиннер будет скрыт, прежде чем взаимодействовать со страницей.

person Tim Moore    schedule 03.12.2013
comment
Спасибо, я провел еще несколько тестов и вижу, что многие из моих тестов завершаются до того, как страница отображается правильно. Это делает очень вероятным, что наши тесты пытаются нажимать кнопки до того, как страница загрузится должным образом. На самом деле у нас нет вращающегося gif при открытии чего-либо, кроме главной страницы нашего веб-приложения, но у нас есть анимация перехода, которую я мог бы попытаться дождаться завершения вместо этого. - person Metareven; 03.12.2013
comment
Другой вариант этого - нажать кнопку, а затем выполнить оператор if/else, проверяющий результат. Если результата нет, то повторите попытку. У меня была аналогичная проблема, когда кнопка, которую я пытался нажать, не загружалась вовремя. - person Dono; 23.07.2014