【问题标题】:How can I test field validation?如何测试字段验证?
【发布时间】:2015-05-28 17:32:10
【问题描述】:

我有验证代码,当它不满足要求时,它会设置 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 calabash-android


    【解决方案1】:

    您的 calabash 命令有多种情况可能导致您的测试失败。

    1) 不要使用 touch(query(...

    # 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模拟用户按输入键出现而不是回车键。

    【讨论】:

    • 谢谢!这成功了,特别是 enter_text 而不是 set_text。你能指出一个解释为什么使用一个而不是另一个的资源吗?
    • 使用“setText 方法”只是在查询的匹配项上调用 setText 方法。这不会调用任何回调。使用keyboard_enter_text是输入文字的方式。
    • 这是有道理的,但我仍然无法理解为什么它在屏幕上的第一个字段上起作用。谢谢。
    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2012-06-29
    • 2020-02-13
    • 2020-05-10
    • 2017-12-10
    • 1970-01-01
    • 2011-06-16
    • 2021-01-02
    相关资源
    最近更新 更多