(Xcode 7.3.1,iOS9.3,Swift)
我正在努力在我的任务中设置一个UI测试,看起来似乎是一个相当标准和常见的用例。
我有一个子类UITableViewCell,它包含一个textField,它不会填满整个单元格并且设置了Disclosure Indicator。用户可以通过点击它来将数据输入到textField中,但是如果他们在textField之外点击但仍然在单元格中,我的应用程序会转到另一个视图。项目工作正常,子视图从单元格的textField接收正确的数据。
我的Master-Detail应用程序在Master视图和Detail视图上都有UITableViews。我的UI测试选择主视图中的第一个单元格,等待DV一点,然后在详细视图中选择第二个单元格,该单元格是根据我之前的描述配置的。
我正在使用
模拟第二个单元格上的点按tablesQuery.cells.elementBoundByIndex(1).tap()
但是,模拟器将其解释为textField中的tap,因此不会出现segue。我已经阅读了SwiftyCruz的问题和给出的答案,但他的用例有点不同,因为我没有使用Detail Disclosure
,而且接受的答案也没有。转化为我的情况。在下面的 ferunandu 解释中,我尝试在单元格上设置辅助功能标签和标识符以及accessoryView?.accessibilityIdentifier
的不同字符串。虽然UI测试仍然无效,但 ferunandu 的摘要确实将披露指标从>
更改为蓝色框。
使用断点,我一直在调试窗口中查询app
对象,试图找到正确的控件,但无济于事。我能够使用索引和标识符找到textField,但我尝试过的任何内容都没有为.exists
返回accessoryView
。
我是否尝试错误地访问手机?或者,它实际上不可能做我尝试的事情吗?
我的测试代码是:
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,似乎有些倒退。 )
答案 0 :(得分:0)
我有一个子类UITableViewCell,它包含一个不填充整个单元格的textField ......
我正在使用
模拟第二个单元格上的点击tablesQuery.cells.elementBoundByIndex(1).tap()
但是,模拟器将其解释为textField中的一个tap,因此不会出现segue。
听起来您在表格视图单元格上的点按正被文本字段拦截。当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()