如何使用Capybara模拟jQuery-UI模式对话框按钮的单击?

时间:2012-10-21 13:07:28

标签: jquery jquery-ui rspec capybara

在Web应用程序中,我使用jQueryUI模式对话框来确认操作:

function erase() {
  $("#dialog").text("Are you sure want to delete this record?")
  .attr("title", "Delete...")
  .dialog({
    modal: true,
    buttons: {
      Delete: function() {
        $.ajax({
          ...snip...
          success: function() {
            self.location = "."; // returns to the welcome page
          }
        });
      },
      ...snip...
    }
  });
}

代码工作得很好,但我无法用Capybara成功测试它:

...snip...
Capybara.default_driver = :webkit
...snip...

def in_dialog()
  f = find('.ui-dialog')
end

feature 'Delete a record' do
...snip...
  scenario 'for any record' do
    click_on 'Delete...'
    page.should have_content 'Are you sure want to delete this record?'
    in_dialog.click_button 'Delete'
    page.should have_content 'Welcome'
    ...snip...
  end
end

Capybara找到按钮,但一切都好像回调从未被解雇过。

我尝试了不同的解决方法(我在stackoverflow上找到了几个):

  • 睡眠,
  • “等待ajax”,
  • page.native.send_keys(:return)而非click_button'Delete',
  • find('button',:text =>'删除')。点击而不是click_button'删除',
  • Selenium驱动程序而不是webkit驱动程序。

没有用。还有其他想法吗?

3 个答案:

答案 0 :(得分:1)

嗯,睡眠应该至少有效,但这是我用来确保我的AJAX调用已经返回的内容:

in_dialog.click_button 'Delete'
wait_until { page.evaluate_script("jQuery.active") == 0 }
page.should have_content 'Welcome'

答案 1 :(得分:1)

您在评论中发布了code that you use to interact with the server

我在浏览器中手动执行了这些步骤,但单击“Supprimer”按钮返回409错误,没有其他任何操作。这就是为什么单击此按钮时测试中没有任何反应。

答案 2 :(得分:0)

你总是可以在capybara的场景中执行自定义的javascript代码。你尝试过类似的东西吗?

# when
page.execute_script("$('.the-button-selector').click();")
# then
page.should_not have_css(".the-dialog-selector")