使用 Capybara 检测 javascript 个事件处理程序

Detecting javascript event handlers with Capybara

在我的 Rails 应用程序中有很多前端 js,我想检查是否有特定事件附加到 DOM 元素。

添加事件的JS示例在这里:

$('.nextCard')[0].addEventListener('click',nextCard);

我想写这样的东西:

     expect(page).evaluate_script('​$._data( $(".nextCard")[0], "events" )').to eq('nextCard');

我知道这有点神秘,我可以单独测试 JS ...但如果可能的话,我想用 Ruby / Capybara 进行所有测试。

How to return a value when using execute_script in capybara?

Can I find events bound on an element with jQuery?

由于您声明事件是使用普通 DOM 方法 (addEventListener) 添加的,因此无法(交叉 browser/unprivileged 代码)枚举侦听器。但是,如果处理程序是通过 jQuery#on 附加的,那么您可以检查是否存在点击处理程序,例如

expect(page.evaluate_script('​"click" in $._data( $(".nextCard")[0], "events" )')).to be true

话虽如此,您尝试做的并不是一个好主意,并且最终会进行非常脆弱的测试。您在功能测试中应该做的是验证那些点击处理程序促进工作的行为。