我想询问您对在 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
与页面交互并不是模拟真实的用户交互,在很多情况下会使您的测试毫无意义。这样做的主要原因是它允许您做用户永远做不到的事情(更改隐藏/只读/禁用字段的值等)。它也不会生成用户与元素交互时生成的相同事件,因此页面中的 JS 可能不会以相同的方式使用react。 execute_script
确实在编写测试中占有一席之地,但它是有限的,通常用于获取值(而不是更改内容)或解决浏览器/驱动程序中的问题(一旦您完全理解您正在尝试的问题变通并确保这不是用户实际上不能做你想做的事情的情况)。
就速度而言,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
关于jquery - 在 Capybara 测试中使用 jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208074/