Капибара: page.execute_script() не работает

Я пытаюсь имитировать перетаскивание с помощью библиотеки jquery.simulate в функции rspec. Строки execute_script в спецификации:

 page.execute_script("$('#slide_1').draggable();")
 page.evaluate_script("$('#slide_1').simulate('drag', {dragTarget: '#library_swap', interpolation: {stepWidth: 10, stepDelay: 300 }});")
 page.evaluate_script("$('#slide_1').simulate('drop');")

Если я запускаю строки внутри скрипта выполнения через консоль Chrome, он работает нормально (моделирование перетаскивания работает), но не работает с execute_script


person Jaswinder    schedule 04.07.2017    source источник
comment
Вы получаете какие-либо ошибки, или это просто не то, что вы ожидаете? Есть ли причина, по которой вы используете evaluate_script для второго и третьего операторов?   -  person Thomas Walpole    schedule 05.07.2017
comment
@ThomasWalpole Нет, я не получил никакой ошибки, но скрипт не выполняется. Я использовал execute_script перед использованием сценария оценки, но оба они не работают.   -  person Jaswinder    schedule 05.07.2017


Ответы (1)


Поскольку вы не получаете никаких ошибок, код JS, который вы передаете execute_script, фактически выполняется. Поскольку вы не видите ожидаемого поведения, наиболее вероятным объяснением является то, что вы выполняете JS до того, как элемент фактически окажется на странице, что тогда просто ничего не сделает. Единственное, что меня смущает в коде, это то, почему вы вызываете draggable для элемента #slide_1, поскольку я предполагаю, что это уже было вызвано в вашем приложении. В любом случае - добавьте ожидание перед вашими вызовами execute_script, чтобы убедиться, что элемент действительно находится на странице.

expect(page).to have_css('#slide_1')
execute_script("$('#slide_1')...

Также обратите внимание, что не должно быть никаких причин, по которым вам нужно использовать для этого три разных вызова execute_script, вы можете просто объединить их все в один. В последних версиях Capybara вы также можете СУШИТЬ команды, не указывая селектор снова и вместо этого передавая элемент в execute_script

slider = page.find(:css, '#slide_1')
execute_script("$(arguments[0]). ...    ", slider)
person Thomas Walpole    schedule 05.07.2017
comment
Спасибо, Томас. Я решил проблему, добавив сон после второй строки. На самом деле скрипт выполнялся, но, похоже, не работал над пользовательским интерфейсом. - person Jaswinder; 06.07.2017