ruby - 设置 Capybara 值的竞态条件
问题描述
我在填写注册表单中的文本字段时遇到了一个问题.set(#{value})
,例如:我想输入的电话号码是506307
然后它以063075
. 我所做的解决方法是执行 Javascript 块,例如
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 动作。
那么,是否有任何其他方式来交互/填写不会导致竞争条件问题的表单字段?
提前谢谢大家。
解决方案
注意:任何纯粹使用 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 行为正在侦听的事件。
推荐阅读
- ssl - 等待订单状态“待定”的证书颁发
- java - 我有“android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class fragment”
- terraform - 使用 Terraform 根据参数化名称创建多个 aws_cloudformation_stack
- postgresql - 我可以从 Postgresql 函数中创建一个临时表吗?
- rust - 通过 trait 对象创建回调
- html - 如何从选择下拉列表中填充数据,以便将特定 id 的数据显示到主页
- javascript - 如何根据下拉输入加载 JSON 数据?
- bash - How to exclude subdirectories of a specific directory from find command?
- reactjs - 测试列表中是否存在项目并返回项目或索引
- html - HTML 书签链接在 Wordpress 上不起作用