8

我正在编写一个 UIAutomation 测试用例,我需要等待用户被激活才能继续。似乎没有一种很好的方法来检查按钮以更改为启用状态。

最好的办法是等待 UI 中发生某些事情,然后再检查它的状态?

dispatch_after 和 NSTimer 似乎都不起作用。他们只是阻止然后失败。

4

4 回答 4

16

如果您使用 NSPredicates 和期望,这实际上非常容易。您甚至可以设置超时值。此示例向您展示如何使用 5 秒超时来执行此操作。

let exists = NSPredicate(format:"enabled == true")
expectationForPredicate(exists, evaluatedWithObject: app.tables.textFields["MY_FIELD_NAME"], handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)
于 2015-10-16T00:35:30.070 回答
0

艾蒂安的回答是正确的,但在我的情况下,它需要额外的东西。

我正在使用 React Native 并且有一个<TouchableWithoutFeedback disabled={true}>组件。但是我可以看到,每当 XCUI 尝试检查其状态时,它都认为它已启用。事实上,使用断点和检查element.IsEnabled显然与我在 UI 中看到的相矛盾。

然而,使用AccessibilityState将实现这一点,例如:

<TouchableWithoutFeedback
   accessibilityState={{
      disabled: this.props.disabled,
   }}
>

有 RN 0.62.2 经验

于 2020-07-28T20:35:21.677 回答
0

等待和检查元素的更好方法不是delay()函数,而是函数pushTimeout()。Apple 建议使用第二个功能。这是一个代码示例:

UIATarget.localTarget().pushTimeout(10)
button.tap()
UIATarget.localTarget().popTimeout()

Apple 将反复尝试点击该按钮并等待最多 10 秒。这是文档的链接

于 2015-09-18T11:18:51.323 回答
-4

你应该能够实现一个while循环来检查你想要的条件(例如按钮启用)。这将停止测试用例的进度,直到满足 while 条件并且测试将继续。建立延迟以减慢轮询并确保您有超时,这样您就不会无限期地陷入困境。

伪代码

While (/*button is disabled*/) {
    if (/*timeout condition met*/) {
        /*handle error*/
        break;
    }

    UIATarget.delay(<duration in seconds>);
}
于 2015-07-08T18:30:10.040 回答