2

在 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 => 'Delete').click 而不是 click_button 'Delete',
  • Selenium 驱动程序而不是 webkit 驱动程序。

没有工作。还有什么想法吗?

4

3 回答 3

1

嗯, sleep 至少应该有效,但这是我用来确保我的 AJAX 调用已返回的方法:

in_dialog.click_button 'Delete'
wait_until { page.evaluate_script("jQuery.active") == 0 }
page.should have_content 'Welcome'
于 2012-11-05T20:05:09.063 回答
1

您在评论中发布了用于与服务器交互的代码

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

于 2013-01-17T07:48:01.863 回答
0

您总是可以在 capybara 的场景中执行自定义 javascript 代码。您是否尝试过类似的方法:

# when
page.execute_script("$('.the-button-selector').click();")
# then
page.should_not have_css(".the-dialog-selector")
于 2013-01-14T11:23:59.603 回答