首页 > 解决方案 > 设置 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 动作。

那么,是否有任何其他方式来交互/填写不会导致竞争条件问题的表单字段?

提前谢谢大家。

标签: rubyseleniumcapybara

解决方案


注意:任何纯粹使用 execute_scriptJS 运行的“解决方案”都是一个糟糕的想法,因为它完全绕过了测试用户可以做什么的概念,并且基本上可以使您的测试毫无价值。

这里问题的根本原因是附加到输入的 JS 行为无法足够快地处理关键事件。正确的解决方法是修复 JS,但是如果这不可能,您可以尝试一些事情

首先,您可以尝试更改 set 使用的 clear 方法

element.set('506307', clear: :backspace)

或者

element.set('506307', clear: :none) 

如果这没有改变任何内容,请尝试单击输入,然后在设置内容之前短暂睡眠

element.click
sleep 0.25
element.set('506307')

如果这些都不能解决这个问题,我们需要确切地知道您附加到输入的 JS 行为和/或 JS 行为正在侦听的事件。


推荐阅读