我正在编写一个UI测试用例,需要在其中执行一个操作,然后在当前页面上,将唯一的UITableView
滚动到底部,以检查特定文本是否显示在其中的最后一个单元格中UITableView
。
现在,我唯一想到的方法是使用app.tables.cells.element(boundBy: 0).swipeUp()
滚动它,但是如果单元格太多,它不会一直滚动到底部。而且UITableView
中的单元格数量并不总是相同的,我不能多次向上滑动,因为表中可能只有一个单元格。
答案 0 :(得分:3)
布莱恩斯的回答使我对这个话题进行了更多的研究,我找到了一个对我有用的解决方案:
func testTheTest() {
let app = XCUIApplication()
app.launch()
// Opens a menu in my app which contains the table view
app.buttons["openMenu"].tap()
// Get a handle for the tableView
let listpagetableviewTable = app.tables["myTableView"]
// Get a handle for the not yet existing cell by its content text
let cell = listpagetableviewTable.staticTexts["This text is from the cell"]
// Swipe down until it is visible
while !cell.exists {
app.swipeUp()
}
// Interact with it when visible
cell.tap()
}
为此,我要做的一件事是将isAccessibilityElement
设置为true
,并将accessibilityLabel
作为字符串分配给表视图,以便可以查询它在测试代码中。
这可能不是最佳做法,但对于我在测试中看到的结果,它工作得很好。我不知道当单元格没有文本时它将如何工作,一个人也许能够通过图像视图或其他方式引用该单元格(在这里并没有直接引用)。显然,布莱恩斯答案中没有列出计数器,但出于简单原因,我将其省略。
答案 1 :(得分:1)
一种解决方法是从tableView中获取最后一个单元格。然后,运行一个while循环,滚动并检查每次滚动之间的单元格isHittable
。一旦确定isHittable == true
,就可以声明该元素。
https://developer.apple.com/documentation/xctest/xcuielement/1500561-ishittable
它看起来像这样(快速答案):
XCTestCase
文件中,编写查询以标识表。然后,进行后续查询以标识最后一个单元格。let tableView = app.descendants(matching: .table).firstMatch
guard let lastCell = tableView.cells.allElementsBoundByIndex.last else { return }
isHittable
/是否在屏幕上。 注意: isHittable
依赖于单元格的userInteractionEnabled
属性设置为true //Add in a count, so that the loop can escape if it's scrolled too many times
let MAX_SCROLLS = 10
var count = 0
while lastCell.isHittable == false && count < MAX_SCROLLS {
apps.swipeUp()
count += 1
}
label
属性检查单元格的文本,并将其与期望的文本进行比较。//If there is only one label within the cell
let textInLastCell = lastCell.descendants(matching: .staticText).firstMatch
XCTAssertTrue(textInLastCell.label == "Expected Text" && textInLastCell.isHittable)