Неправильные ячейки учитываются при просмотре коллекции в тестах интерфейса

У меня есть тест для представления коллекции, который работает так:

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];,

Другие вопросы по тегам