Xcode 7.3 XCTest of Disclosure Indicator in a custom TableViewCell

Posted

技术标签:

【中文标题】Xcode 7.3 XCTest of Disclosure Indicator in a custom TableViewCell【英文标题】:Xcode7.3 UITest of Disclosure Indicator in a custom TableViewCell 【发布时间】:2016-06-20 14:29:22 【问题描述】:

(Xcode 7.3.1、ios9.3、Swift)

我正在努力在我的作业中设置一个 UI 测试,这似乎是一个相当标准和常见的用例。

我有一个子类 UITableViewCell,其中包含一个不填充整个单元格的 textField 并且设置了 Disclosure Indicator。用户可以通过点击将数据输入到 textField 中,但如果他们点击 textField 外部但仍在单元格中,我的应用程序会转到另一个视图。该项目工作正常,子视图从单元格的 textField 接收正确的数据。

我的 Master-Detail 应用在 Master 和 Detail 视图上都有 UITableView。我的 UI 测试选择 Master View 中的第一个单元格,稍等 DV 后选择详细视图中的第二个单元格,根据我之前的描述进行配置。

我正在使用

模拟对第二个 单元格 的点击
tablesQuery.cells.elementBoundByIndex(1).tap()

但是,模拟器将其解释为在 textField 中的点击,因此不会发生 segue。我已经阅读了SwiftyCruz 的问题和给出的答案,但他的用例有点不同,因为我没有使用Detail Disclosure,所以接受的答案也不能转化为我的情况。在下面的 ferunandu 解释中,我尝试在单元格上设置辅助功能标签和标识符,以及为accessoryView?.accessibilityIdentifier 设置不同的字符串。虽然 UI 测试仍然不起作用,但 ferunandu 的 sn-p 确实将披露指示符从 > 更改为蓝色框。

使用断点,我一直在调试窗口中查询app 对象,试图找到正确的控件,但无济于事。我可以使用索引和标识符找到 textField,但我尝试过的任何方法都没有为 accessoryView 返回 .exists true。

我是否尝试错误地访问单元格?或者,实际上不可能做我正在尝试的事情吗?

我的测试代码是:

    XCUIDevice.sharedDevice().orientation = .Portrait
    let app = XCUIApplication()
    wait()
    let tablesQuery = app.tables
    tablesQuery.cells.elementBoundByIndex(0).tap()
    wait()
    tablesQuery.cells.elementBoundByIndex(1).tap()

我在这里没有正确理解什么?任何建议将不胜感激。

(我知道我可以使用标准 UITableViewCell 并在子视图上完成数据输入,但我不想更改我的应用程序的设计以适应 XCTest,这似乎有点倒退。 )

【问题讨论】:

【参考方案1】:

我有一个子类 UITableViewCell,其中包含一个不会填充整个单元格的 textField...

我正在使用模拟点击第二个单元格

tablesQuery.cells.elementBoundByIndex(1).tap()

但是,模拟器将其解释为在 textField 中的点击,因此不会发生转场。

听起来您在表格视图单元格上的点击被文本字段拦截了。当 UI 测试点击表格视图单元格时,点击将位于 UI 元素框架的中心。

要从单元格中心偏移点击位置,请使用coordinate(withNormalizedOffset:) 并直接点击坐标而不是元素。

let cell = app.tables.cells.elementBoundByIndex(0)
// Retrieves coordinate that is 50% of the way along the cell
// and 20% of the way down the cell - adjust these values to
// find the right values to avoid tapping the text field area
// of the cell
let cellCoordinateForTap = cell.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.2))
cellCoordinateForTap.tap()

【讨论】:

以上是关于Xcode 7.3 XCTest of Disclosure Indicator in a custom TableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

XCTest/XCTest.h 文件未找到 XCode 5.1.1 iOS7

如何使用 Xcode 5 从命令行运行 xctest?

iOS:xcode 5,将项目从 xctest 迁移到 senTestingKit

XCode 7 XCTest(Kiwi) +加载类别方法调用了两次

XCode 代码签名错误 XCTest

Xcode 不会将 XCTest 链接到 iOSSimulator 版本