我有验证代码,当EditText不满足要求时,它会设置错误。
field.setError(errorMessage);
这会在字段上画一个带感叹号的红色小圆圈,当我触摸字段时,它会在黑框中显示我的错误消息。太棒了
现在,我希望calabash验证字段是否未通过验证。至少目前我并不关心具体的错误消息——我只想知道是否显示了错误消息(或者我很乐意接受感叹号,但由于我在控制台中使用查询找不到它,我怀疑这会更难)。
此查询:
query("android.widget.PopupWindow$PopupViewContainer")
查找错误消息窗口(如果存在)。
但只有当有错误的字段有焦点时,它才会出现。我只在字段失去焦点时设置错误。这应该没问题——我的步骤可以在字段中输入文本,离开字段,然后返回。当我手动执行这些操作时,会显示错误消息窗口。我还不能做的是编写一个步骤来完成这些事情并可靠地显示错误消息窗口。我试过
query("EditText id:'#{field_id}'", {:setText => bad_text})
touch(query("* id:'#{another_field_id}'")[0])
touch(query("* id:'#{field_id}'")[0])
和
query("EditText id:'#{field_id}'", {:setText => bad_text})
system("#{default_device.adb_command} shell input keyevent KEYCODE_TAB")
touch(query("* id:'#{field_id}'")[0])
并且这两个在第一个EditText中都表现正确,但在随后的EditText中未能显示错误消息窗口。为什么?做这件事的正确方法是什么?
您的calabash命令有多种因素可能导致测试失败。
1) 不要使用触摸(查询(…
# bad
touch(query("q"))
# good
touch("q")
2) 不要使用"setText"模拟输入文本
# bad
query("EditText", {:setText => 'bad_text'})
# good
enter_text("EditText", 'bad_text')
3) 不要使用任何输入事件
像system("#{default_device.adb_command} shell input keyevent KEYCODE_TAB")
这样的输入事件对于用户来说是不可能在大多数设备上执行的,因为很少有Android设备有物理键盘。使用press_user_action_button
模拟用户按下输入键而不是回车键。