我正在使用xCode 7.1。我想从表/集合视图中自动化与所有单元格的交互。我希望它是这样的:
for i in 0..<tableView.cells.count {
let cell = collectionView.cells.elementBoundByIndex(i)
cell.tap()
backBtn.tap()
}
然而,此片段仅查询表视图的当前后代,因此它将遍历来自数据源的总n个单元格中的前m(m 循环遍历数据源中所有可用单元格的最佳方法是什么?显然,查询.Cell后代不是正确的方法。 P.S。:每次敲击单元格后,我都尝试在桌面视图上执行滑动操作。然而,它滑到很远(scrollByOffset不可用)。而且,不知道如何从数据源中提取总细胞数。 干杯,
列昂尼德
答案 0 :(得分:0)
这里的问题是你不能在不可见的单元格上调用tap()。 SoI在XCUIElement上写了一个扩展 - XCUIElement + UITableViewCell
func makeCellVisibleInWindow(window: XCUIElement, inTableView tableView: XCUIElement) {
var windowMaxY: CGFloat = CGRectGetMaxY(window.frame)
while 1 {
if self.frame.origin.y < 0 {
tableView.swipeDown()
}
else {
if self.frame.origin.y > windowMaxY {
tableView.swipeUp()
}
else {
break
}
}
}
}
现在,您可以使用此方法使单元格可见,而不是点按它。
var window: XCUIElement = application.windows.elementBoundByIndex(0)
for i in 0..<tableView.cells.count {
let cell = collectionView.cells.elementBoundByIndex(i)
cell.makeCellVisibleInWindow(window, inTableView: tableView)
cell.tap()
backBtn.tap()
}
答案 1 :(得分:0)
let cells = XCUIApplication().tables.cells
for cell in cells.allElementsBoundByIndex {
cell.tap()
cell.backButton.tap()
}
答案 2 :(得分:0)
我面对同样的情况,但是从我的试验中,你可以在一个看不见的细胞上做tap()。 然而,它不可靠,并且因为一个不好的原因而失败。 它在我看来,这是因为在某些情况下我想要在解析我的表时滚动到的下一个单元格没有加载。
所以这是我使用的技巧: 在解析我的表格之前,我首先点击最后一个单元格,在我的情况下,我键入一个可编辑的UITextField,因为所有其他点击将导致触发segue。
第一次点击()会导致滚动到最后一个单元格,从而导致数据加载。
然后我检查我的细胞内容
let cells = app.tables.cells
/*
this is a trick,
enter in editing for last cell of the table view so that all the cells are loaded once
avoid the next trick to fail sometime because it can't find a textField
*/
app.tables.children(matching: .cell).element(boundBy: cells.count - 1).children(matching: .textField).element(boundBy: 0).tap()
app.typeText("\r") // exit editing
for cellIdx in 0..<cells.count {
/*
this is a trick
cell may be partially or not visible, so data not loaded in table view.
Taping in it is will make it visible and so do load the data (as well as doing a scroll to the cell)
Here taping in the editable text (the name) as taping elsewhere will cause a segue to the detail view
this is why we just tap return to canel name edidting
*/
app.tables.children(matching: .cell).element(boundBy: cellIdx).children(matching: .textField).element(boundBy: 0).tap()
app.typeText("\r")
// doing my checks
}
至少到目前为止它对我有用,不确定这是100%有效,例如在很长的名单上。