Las celdas incorrectas countn para la vista de colección en las testings de interfaz de usuario

Tengo una testing para una vista de colección que funciona así:

func testDeleteItem() { app.collectionViews.staticTexts["Item"].tap() app.buttons["Delete"].tap() XCTAssertEqual(app.collectionViews.cells.count, 2) XCTAssertFalse(app.collectionViews.cells.staticTexts["Item"].exists) } 

Después del toque, hay una nueva pantalla con el button Eliminar. Cuando se toca el button, la pantalla se descarta y vuelve a cargar la vista de la colección. Todo va como se esperaba en la interfaz de usuario, pero ambas fallan. En el primer recuento, sigue siendo 3 y en el segundo elemento todavía existe.

Editar: He creado este sencillo ejemplo en GitHub para presentar el error.

Encontré la solución, pero es una solución para un comportamiento incorrecto de la API. La vista de colección está almacenando en caching las celdas, probablemente sea por eso que tengo 3 celdas, incluso si he eliminado una. La celda eliminada está fuera de la pantalla, por lo que puedes probar si se puede hittable :

 XCTAssertFalse(app.cells.staticTexts["Item"].hittable) 

Para encontrar un recuento, he creado la extensión:

 extension XCUIElementQuery { var countForHittables: UInt { return UInt(allElementsBoundByIndex.filter { $0.hittable }.count) } } 

y mi testing se ve así:

 func testDeleteItem() { app.collectionViews.staticTexts["Item"].tap() app.buttons["Delete"].tap() XCTAssertEqual(app.collectionViews.cells.countForHittables, 2) XCTAssertFalse(app.collectionViews.cells.staticTexts["Item"].hittable) } 

También encontré este problema, pero en mi caso, la consulta .cells no estaba evaluando correctamente. En lugar de .cells, usando

 XCUIApplication().collectionViews.element.childrenMatchingType(.Cell).count 

trabajó para mí y me devolvió el recuento correcto.


Actualización :

También encontré que desplazar la vista para que todas las celdas se descalcifiquen antes de que el conteo solucione el problema. Parece que el marco de accesibilidad no encuentra las otras celdas hasta que se han eliminado (creo que tiene sentido).

XCUIApplication().collectionViews.element.swipeUp()

Me encontré con esta pregunta cuando estaba buscando la misma respuesta, pero en Objective-C. Para aquellos como yo, adapté el método de @Tomasz para contar las células de Collection View en las testings de la interfaz de usuario:

 -(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; } 

Para llamarlo: [self countForHittables:app.collectionViews.cells.allElementsBoundByIndex]; .