使用.set(#{value})
填写注册表单中的文本字段时遇到问题,例如:我要输入的电话号码为506307
,然后以063075
结尾。
我已采取的变通办法是执行
execute_script("document.querySelector('#{selector}').value = '#{value}'")
但是,使用相同的基于React.JS的Webmobile脚本,上面的脚本仅发送文本,但没有发送onChange
事件,这导致无法选择/单击另一个元素->测试失败。
我想出了另一种方法,就是使用send_keys #{value}
来触发按键事件,这会使浏览器认为该表单发生了按键事件,但是最终导致了竞争条件就像我提到的set(#{value})
。
另一个解决方法是使用What is the best way to trigger onchange event in react js,但是我倾向于在制作棘手的Javascript之前先使用Capybara原生操作。
那么,还有什么其他方法可以交互/填写表单字段,而不会导致种族状况问题?
预先感谢大家。
答案 0 :(得分:0)
注意:任何建议仅使用execute_script
来运行某些JS的“解决方案”都是一个糟糕的主意,因为它完全绕过了测试用户可以做什么的概念,并且基本上会使您的测试毫无价值。
此问题的根本原因是输入中附加的JS行为无法足够快地处理键事件。正确的解决方法是修复JS,但是如果无法解决,您可以尝试一些方法
首先,您可以尝试更改set使用的clear方法
element.set('506307', clear: :backspace)
或
element.set('506307', clear: :none)
如果这没有任何改变,请尝试单击输入,然后在设置内容之前短暂睡眠
element.click
sleep 0.25
element.set('506307')
如果这些都不能解决问题,我们需要确切地知道您已将哪些JS行为附加到输入和/或JS行为正在侦听哪些事件。