我正在编写一个 UIAutomation 测试用例,我需要等待用户被激活才能继续。似乎没有一种很好的方法来检查按钮以更改为启用状态。
最好的办法是等待 UI 中发生某些事情,然后再检查它的状态?
dispatch_after 和 NSTimer 似乎都不起作用。他们只是阻止然后失败。
我正在编写一个 UIAutomation 测试用例,我需要等待用户被激活才能继续。似乎没有一种很好的方法来检查按钮以更改为启用状态。
最好的办法是等待 UI 中发生某些事情,然后再检查它的状态?
dispatch_after 和 NSTimer 似乎都不起作用。他们只是阻止然后失败。
如果您使用 NSPredicates 和期望,这实际上非常容易。您甚至可以设置超时值。此示例向您展示如何使用 5 秒超时来执行此操作。
let exists = NSPredicate(format:"enabled == true")
expectationForPredicate(exists, evaluatedWithObject: app.tables.textFields["MY_FIELD_NAME"], handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)
艾蒂安的回答是正确的,但在我的情况下,它需要额外的东西。
我正在使用 React Native 并且有一个<TouchableWithoutFeedback disabled={true}>
组件。但是我可以看到,每当 XCUI 尝试检查其状态时,它都认为它已启用。事实上,使用断点和检查element.IsEnabled
显然与我在 UI 中看到的相矛盾。
然而,使用AccessibilityState将实现这一点,例如:
<TouchableWithoutFeedback
accessibilityState={{
disabled: this.props.disabled,
}}
>
有 RN 0.62.2 经验
等待和检查元素的更好方法不是delay()
函数,而是函数pushTimeout()
。Apple 建议使用第二个功能。这是一个代码示例:
UIATarget.localTarget().pushTimeout(10)
button.tap()
UIATarget.localTarget().popTimeout()
Apple 将反复尝试点击该按钮并等待最多 10 秒。这是文档的链接。
你应该能够实现一个while循环来检查你想要的条件(例如按钮启用)。这将停止测试用例的进度,直到满足 while 条件并且测试将继续。建立延迟以减慢轮询并确保您有超时,这样您就不会无限期地陷入困境。
伪代码:
While (/*button is disabled*/) {
if (/*timeout condition met*/) {
/*handle error*/
break;
}
UIATarget.delay(<duration in seconds>);
}