在 EarlGrey 中,等待元素出现的非轮询方式是啥?

Posted

技术标签:

【中文标题】在 EarlGrey 中,等待元素出现的非轮询方式是啥?【英文标题】:In EarlGrey, what's the non-polling way to wait for an element to appear?在 EarlGrey 中,等待元素出现的非轮询方式是什么? 【发布时间】:2016-07-07 21:56:44 【问题描述】:

目前我正在等待一个元素显示如下:

let populated = GREYCondition(name: "Wait for UICollectionView to populate", block:  _ in
    var errorOrNil: NSError?

    EarlGrey().selectElementWithMatcher(collectionViewMatcher)
              .assertWithMatcher(grey_notNil(), error: &errorOrNil)

    let success = (errorOrNil == nil)
    return success
).waitWithTimeout(20.0)

GREYAssertTrue(populated, reason: "Failed to populate UICollectionView in 20 seconds")

持续轮询 20 秒以填充集合视图。有没有更好的非轮询方式来实现这一点?

【问题讨论】:

【参考方案1】:

EarlGrey 建议使用其synchronization 来等待元素,而不是尽可能使用休眠或条件检查(如等待)。

EarlGrey 在GREYConfiguration 中有一个变量kGREYConfigKeyInteractionTimeoutDuration 值,设置为30 秒和状态 -

 *  Configuration that holds timeout duration (in seconds) for action and assertions. Actions or
 *  assertions that are not scheduled within this time will fail due to timeout.

由于您正在等待 20 秒进行检查,因此您可以简单地将其更改为 -

EarlGrey().selectElementWithMatcher(collectionViewMatcher)
          .assertWithMatcher(grey_notNil(), error: &errorOrNil)

它会在没有超时的情况下被填充。

【讨论】:

所以我需要跟踪我们执行获取请求的后台队列,并且 earlgrey 能够与之同步。我看到调度队列空闲资源使用 idlingresource 协议。文档中没有提到这一点的任何原因?似乎我们可以将资源包装在 IdlingResource 中,以在我们的测试中实现更高的稳健性。【参考方案2】:

我喜欢将 Earl Gray 与基本 XCTest 联系起来,我想出了这个简单的解决等待元素问题的方法:

app.webViews.buttons["logout()"].waitForExistence(timeout: 5)
app.webViews.buttons["logout()"].tap()

【讨论】:

以上是关于在 EarlGrey 中,等待元素出现的非轮询方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:两次运行相同测试后出现 Earlgrey/Detox 错误

设置元素等待

设置元素等待

selenium-三种等待方式总结

STM32HAL轮询模式串口接收函数超时等待问题?

子进程的异步等待方式