Автоматизация пользовательского интерфейса Xcode 7 - цикл через представление таблицы/коллекции

Я использую xCode 7.1. Я хотел бы автоматизировать взаимодействие со всеми ячейками из представления таблицы/коллекции. Я ожидаю, что это будет что-то вроде этого:

for i in 0..<tableView.cells.count {  
    let cell = collectionView.cells.elementBoundByIndex(i)  
    cell.tap()  
    backBtn.tap()  
}

Однако этот фрагмент запрашивает только текущие потомки табличного представления, поэтому он будет перебирать первые m (m ‹ n) загруженных ячеек из общего числа n ячеек из источника данных.

Каков наилучший способ перебрать все ячейки, доступные в источнике данных? Очевидно, что запрос потомков .Cell не является правильным подходом.

P.S.: Я пытался выполнять свайп по таблице после каждого нажатия на ячейку. Однако он перемещается далеко (scrollByOffset недоступен). И снова не знаю, как извлечь общее количество ячеек из источника данных.

С уважением, Леонид


person Leonid    schedule 09.11.2015    source источник


Ответы (3)


Итак, проблема здесь в том, что вы не можете вызвать tap() для невидимой ячейки. Итак, я написал расширение для 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()  
}
person Sandy    schedule 09.11.2015
comment
Привет, Сэнди, спасибо за ответ. Я не думаю, что смахивание - хорошая идея для просмотра таблицы, поскольку вы не можете контролировать смещение прокрутки смахивания. Таким образом, свайп может привести к перемещению некоторых ячеек за пределы экрана перед их итерацией. Другой подход, который я пробовал, это cell.pressForDuration(TapScrollTime, thenDragToElement: prevCell), но он тоже не идеален. И итерация for i in 0..<tableView.cells.count' неверна, потому что изначально в табличном представлении загружаются только несколько ячеек, но после прокрутки появляются новые - person Leonid; 11.11.2015

Я сталкиваюсь с той же ситуацией, однако из моих испытаний вы можете сделать tap() для невидимой ячейки. Однако он ненадежен и выходит из строя по непонятной причине. Мне кажется, это потому, что в какой-то ситуации следующая ячейка, к которой я хотел прокрутить при анализе моей таблицы, не была загружена.

Итак, вот трюк, который я использовал: перед синтаксическим анализом своих таблиц я сначала нажимаю на последнюю ячейку, в моем случае я набираю редактируемый UITextField, так как все остальные нажатия вызовут запуск перехода.

Это первое нажатие() вызывает прокрутку до последней ячейки и, следовательно, загрузку данных.

затем я проверяю содержимое своих ячеек

        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%, например, в очень длинном списке.

person Stephane Gasparini    schedule 24.10.2017

person    schedule
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, почему и/или как он отвечает на вопрос, значительно повысит его ценность в долгосрочной перспективе. Пожалуйста, отредактируйте свой ответ, чтобы добавить некоторые пояснения. - person Toby Speight; 26.04.2016
comment
Первое предположение о том, что вы не можете нажать на невидимую ячейку, не похоже на правду, основываясь на моих испытаниях. Я бы сказал, что это не работает на 100%, но обычно это работает. - person Stephane Gasparini; 24.10.2017