在 Capybara 测试中使用 jQuery
Using jQuery in Capybara tests
我想问问您对在 Capybara 规范中使用 jQuery
的看法。
它真的是在模拟真实的用户交互,还是伪造?
- 正在使用
find("#my_checkbox[value='1']").set(true)
与 page.execute_script("$('#my_checkbox').prop('checked', true);")
相同?
- 或
find("#my_button").click
与 page.execute_script("$('#my_button').click();")
相同 ?
我知道规格结果是一样的,但我真的很想知道:
- 真正的用户不会使用 JS 浏览器的控制台来单击按钮,所以我们是否应该在不使用规范中的
jQuery
的情况下复制它?
- 规范的性能和速度如何?使用
jQuery
有什么优势吗?
在测试中使用 execute_script
/evaluate_script
与页面交互并不是模拟真实的用户交互,在很多情况下会使您的测试毫无意义。这样做的主要原因是它允许您做用户永远做不到的事情(更改 hidden/readonly/disabled 字段的值等)。它也不会生成用户与元素交互时生成的相同事件,因此页面中的 JS 可能不会以相同的方式做出反应。 execute_script
确实在编写测试中占有一席之地,但它是有限的,通常用于获取值(而不是改变事物)或解决 browsers/drivers 中的问题(一旦你完全理解了你正在尝试的问题)解决并确保这不是用户实际上无法执行您正在尝试执行的操作的情况)。
就速度而言,execute_script
在某些情况下可能会稍微快一些,但这只是因为它没有验证用户是否真的可以做它正在做的事情。另外,稍快但无意义的测试并不能真正为您节省任何东西。
这涵盖了将 execute_script
与 JS 一起使用,我相信这是你的问题真正要问的,尽管你特别提到了 jQuery。还有一个原因是不在测试中的任何 execute_script
调用中使用 jQuery,这是如果你重构你的应用程序以删除 jQuery 并且只使用纯 JS 你的测试会中断。即 - 您可能更喜欢 document.getElementById('abc')
而不是 $('#abc')
。这对您来说可能不是什么大问题,因为在您的测试中确实不应该有那么多 execute_script
实例。
TLDR -
check('my_checkbox', option: 1) # best
find("#my_checkbox[value='1']").set(true) # valid but too verbose
page.execute_script("$('#my_checkbox').prop('checked', true);") # Don't use - not replicating a user
click_on('my_button') # best if element is a link or button
find("#my_button").click # valid
find("#my_button").trigger('click') # Only supported on some drivers - don't use in tests unless you REALLY understand why you're using it - basically the same as using `execute_script`
page.execute_script("$('#my_button').click()") # Don't use - not replicating a user
我想问问您对在 Capybara 规范中使用 jQuery
的看法。
它真的是在模拟真实的用户交互,还是伪造?
- 正在使用
find("#my_checkbox[value='1']").set(true)
与page.execute_script("$('#my_checkbox').prop('checked', true);")
相同? - 或
find("#my_button").click
与page.execute_script("$('#my_button').click();")
相同 ?
我知道规格结果是一样的,但我真的很想知道:
- 真正的用户不会使用 JS 浏览器的控制台来单击按钮,所以我们是否应该在不使用规范中的
jQuery
的情况下复制它? - 规范的性能和速度如何?使用
jQuery
有什么优势吗?
在测试中使用 execute_script
/evaluate_script
与页面交互并不是模拟真实的用户交互,在很多情况下会使您的测试毫无意义。这样做的主要原因是它允许您做用户永远做不到的事情(更改 hidden/readonly/disabled 字段的值等)。它也不会生成用户与元素交互时生成的相同事件,因此页面中的 JS 可能不会以相同的方式做出反应。 execute_script
确实在编写测试中占有一席之地,但它是有限的,通常用于获取值(而不是改变事物)或解决 browsers/drivers 中的问题(一旦你完全理解了你正在尝试的问题)解决并确保这不是用户实际上无法执行您正在尝试执行的操作的情况)。
就速度而言,execute_script
在某些情况下可能会稍微快一些,但这只是因为它没有验证用户是否真的可以做它正在做的事情。另外,稍快但无意义的测试并不能真正为您节省任何东西。
这涵盖了将 execute_script
与 JS 一起使用,我相信这是你的问题真正要问的,尽管你特别提到了 jQuery。还有一个原因是不在测试中的任何 execute_script
调用中使用 jQuery,这是如果你重构你的应用程序以删除 jQuery 并且只使用纯 JS 你的测试会中断。即 - 您可能更喜欢 document.getElementById('abc')
而不是 $('#abc')
。这对您来说可能不是什么大问题,因为在您的测试中确实不应该有那么多 execute_script
实例。
TLDR -
check('my_checkbox', option: 1) # best
find("#my_checkbox[value='1']").set(true) # valid but too verbose
page.execute_script("$('#my_checkbox').prop('checked', true);") # Don't use - not replicating a user
click_on('my_button') # best if element is a link or button
find("#my_button").click # valid
find("#my_button").trigger('click') # Only supported on some drivers - don't use in tests unless you REALLY understand why you're using it - basically the same as using `execute_script`
page.execute_script("$('#my_button').click()") # Don't use - not replicating a user