2017-07-04 4 views
0

Je suis en train de simuler le glisser-déposer en utilisant la bibliothèque jquery.simulate dans les lignes de execute_script rspec particularité.Appareil dans les spécifications sont:Capybara: page.execute_script() ne fonctionne pas

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');") 

Si je lance les lignes à l'intérieur du exécute le script sur la console chrome, fonctionne bien (la simulation par glisser-déposer fonctionne), mais ne fonctionne pas avec execute_script

+0

Avez-vous obtenez des erreurs, ou est-il tout simplement pas faire ce que vous attendez? Y a-t-il une raison pour laquelle vous utilisez 'evaluate_script' pour les deuxième et troisième déclarations? –

+0

@ThomasWalpole Non Je n'ai reçu aucune erreur mais le script n'est pas en cours d'exécution. J'ai utilisé execute_script avant d'utiliser le script d'évaluation, mais les deux ne fonctionnaient pas. – Jaswinder

Répondre

0

Puisque vous n'obtenez aucune erreur, le code JS que vous passez à execute_script est en cours d'exécution. Puisque vous ne voyez pas le comportement que vous attendez, l'explication la plus probable est que vous exécutez le JS avant que l'élément ne se trouve sur la page, ce qui ne ferait rien en silence. La seule chose qui me dérange dans le code est la raison pour laquelle vous appelez draggable sur l'élément #slide_1 car je suppose que cela a déjà été appelé dans votre application. Quoi qu'il en soit - ajouter une attente devant vos appels execute_script pour vous assurer que l'élément est en fait sur la page

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

A noter également, il ne devrait pas être une raison quelconque, vous devez utiliser trois execute_script appels à cela, vous pouvez simplement combinez-les tous en un seul. Dans les versions récentes de Capybara, vous pouvez également tarir les commandes en ne spécifiant pas le sélecteur à nouveau et en passant à la place l'élément à execute_script

slider = page.find(:css, '#slide_1') 
execute_script("$(arguments[0]). ... ", slider) 
+0

Merci Thomas. J'ai résolu le problème en ajoutant un sommeil après la deuxième ligne. En fait, le script était en cours d'exécution mais ne semblait pas fonctionner sur l'interface utilisateur. – Jaswinder