Неправильные ячейки учитываются при просмотре коллекции в тестах интерфейса
У меня есть тест для представления коллекции, который работает так:
func testDeleteItem() {
app.collectionViews.staticTexts["Item"].tap()
app.buttons["Delete"].tap()
XCTAssertEqual(app.collectionViews.cells.count, 2)
XCTAssertFalse(app.collectionViews.cells.staticTexts["Item"].exists)
}
После нажатия появляется новый экран с кнопкой удаления. При нажатии кнопки экран закрывается и перезагружается представление сбора. В пользовательском интерфейсе все идет как положено, но оба утверждения терпят неудачу. В первом счете это все еще 3, а во втором элементе это все еще существует.
4 ответа
Я нашел решение, но это обходной путь для неправильного поведения API. Представление коллекции - это кэширование ячеек, поэтому, вероятно, у меня есть 3 ячейки, даже если я удалил одну. Удаленная ячейка находится за пределами экрана, поэтому вы можете проверить, hittable
:
XCTAssertFalse(app.cells.staticTexts["Item"].hittable)
Чтобы найти счетчик, я создал расширение:
extension XCUIElementQuery {
var countForHittables: UInt {
return UInt(allElementsBoundByIndex.filter { $0.hittable }.count)
}
}
и мой тест выглядит так:
func testDeleteItem() {
app.collectionViews.staticTexts["Item"].tap()
app.buttons["Delete"].tap()
XCTAssertEqual(app.collectionViews.cells.countForHittables, 2)
XCTAssertFalse(app.collectionViews.cells.staticTexts["Item"].hittable)
}
Я также сталкивался с этой проблемой, но в моем случае запрос.cells не оценивался правильно. Вместо.cells, используя
XCUIApplication().collectionViews.element.childrenMatchingType(.Cell).count
работал для меня и вернул правильный счет.
Обновление:
Я также обнаружил, что прокрутка представления так, что все ячейки были сняты с очереди до того, как счетчик устранил проблему. Кажется, что структура доступности не находит другие ячейки, пока они не были сняты (я думаю, это имеет смысл).
XCUIApplication().collectionViews.element.swipeUp()
Я думаю, что запрос ячеек возвращает все ячейки из всех таблиц, которые в настоящее время находятся в иерархии представлений. Попробуй сделать этоapp.tables.firstMatch.cells.count
, у меня это сработало.
Я была такая же проблема. Даже если коллекция не была заполнена, потому что она ожидала ответа API, cell.count >= 1 всегда было истинным.
Что я сделал, основываясь на ответе Томаша Бека, я создал расширение, чтобы дождаться заполнения коллекции:
extension XCTestCase {
func waitForCollectionToBePopulated(_ element: XCUIElement, timeout: TimeInterval) {
let query = element.cells
let p = NSPredicate(format: "countForHittables >= 1")
let e = expectation(for: p, evaluatedWith: query, handler: nil)
wait(for: [e], timeout: timeout)
}
}
А на сайте звонящего поищем:
waitForCollectionToBePopulated(collection, timeout: {timeOut})
Я столкнулся с этим вопросом, когда искал тот же ответ, но в Objective-C. Для таких, как я, я адаптировал метод @Tomasz для подсчета ячеек Collection View в тестах пользовательского интерфейса:
-(NSInteger)countForHittables:(NSArray<XCUIElement*>*)collectionView{
__block int hittables = 0;
[collectionView enumerateObjectsUsingBlock:^(XCUIElement * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.hittable){
hittables++;
}
}];
return hittables;
}
Чтобы назвать это: [self countForHittables:app.collectionViews.cells.allElementsBoundByIndex];
,