【问题标题】:Capybara: page.execute_script() not working水豚:page.execute_script() 不工作
【发布时间】:2017-07-04 13:31:19
【问题描述】:

我正在尝试使用 rspec 功能中的 jquery.simulate 库来模拟拖放。spec 中的 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 一起工作

【问题讨论】:

  • 您是否收到任何错误,或者它只是没有达到您的预期?您在第二条和第三条语句中使用evaluate_script 有什么原因吗?
  • @ThomasWalpole 不,我没有收到任何错误,但脚本没有执行。我在使用评估脚本之前使用了 execute_script,但这两个都不起作用。

标签: selenium drag-and-drop capybara rspec-rails simulate


【解决方案1】:

由于您没有收到任何错误,因此您传递给 execute_script 的 JS 代码实际上正在执行。由于您没有看到您期望的行为,因此最可能的解释是您在元素实际出现在页面上之前执行 JS,然后它只会默默地什么都不做。让我对代码感到困惑的一件事是,为什么您在 #slide_1 元素上调用 draggable,因为我假设您的应用程序中已经调用了它。无论如何 - 在您的 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)

【讨论】:

  • 谢谢托马斯。我通过在第二行之后添加睡眠解决了这个问题。实际上脚本正在执行,但似乎没有在 UI 上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多