Состояние гонки с установленным значением Капибары - PullRequest
0 голосов
/ 13 ноября 2018

Я столкнулся с проблемой при использовании .set(#{value}) для заполнения текстового поля в регистрационной форме, например: номер телефона, который я хочу ввести, равен 506307, после чего он набрал 063075. Обходной путь, который я сделал, выполняет блок Javascript, такой как

execute_script("document.querySelector('#{selector}').value = '#{value}'")

Однако, используя те же сценарии, применяемые для Webmobile на основе React.JS, приведенные выше сценарии просто отправляют текст, но не отправляют событие onChange, из-за которого нельзя выбрать / щелкнуть другой элемент -> выполнить тест не удалось.

Я придумал другой подход - использовать send_keys #{value} для запуска события нажатия клавиши, которое заставило бы браузер думать, что для этой формы произошло событие нажатия клавиши, но в итоге возникло состояние гонки типа set(#{value}) как я уже говорил.

Другой обходной путь - использование Каков наилучший способ вызвать событие onchange в реакции js , но я склонен использовать нативные действия Capybara перед созданием этого хитрого Javascript.

Итак, есть ли другой способ взаимодействия / заполнения поля формы, который не вызовет проблему состояния гонки?

Спасибо всем заранее.

1 Ответ

0 голосов
/ 13 ноября 2018

Примечание. Любое «решение», предполагающее, что для запуска JS используется просто execute_script, является ужасной идеей, поскольку оно полностью игнорирует концепцию тестирования того, что может сделать пользователь, и может сделать ваш тест бесполезным.

Основной причиной проблемы здесь является поведение JS, привязанное к входу, которое не позволяет обрабатывать ключевые события достаточно быстро.Правильное исправление будет состоять в исправлении JS, однако, если это невозможно, есть несколько вещей, которые вы можете попробовать

Сначала вы можете попробовать изменить метод очистки, используемый set

element.set('506307', clear: :backspace)

или

element.set('506307', clear: :none) 

Если это ничего не изменит, попробуйте щелкнуть по входу, а затем перед сном установить короткий сон

element.click
sleep 0.25
element.set('506307')

Если ни один из этих способов не решить проблему, мыВам нужно точно знать, какое JS-поведение вы подключили к входу и / или какие события JS-поведение слушает.

...