2015-11-09 3 views
1

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

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

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

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

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

Приветствия, Леонид

ответ

0

Так проблема здесь состоит в том, что вы не можете вызвать кран() на ячейку, которая не видна. СИ написал расширение на 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() 
} 
+0

Эй, Сэнди, спасибо за ваш ответ. Я не думаю, что проведите пальцем по экрану, так как вы не можете контролировать смещение прокрутки прокрутки. Таким образом, салфетки могут привести к перемещению некоторых ячеек из экрана перед их повторением. Другой подход, который я пробовал, это «cell.pressForDuration (TapScrollTime, thenDragToElement: prevCell)» - но это также не идеально. Итерация 'для i в 0 .. Leonid

0
let cells = XCUIApplication().tables.cells 
for cell in cells.allElementsBoundByIndex { 
    cell.tap() 
    cell.backButton.tap() 
} 
+1

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно _why_ и/или _how_ он отвечает , вопрос значительно улучшит его долгосрочное значение . Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение. –

+0

Первое предположение о том, что вы не можете нажать на невидимую ячейку, не выглядит верным для меня на основе моих испытаний. Я бы сказал, что это не работает на 100%, но обычно это работает. –

0

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

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

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

затем проверить мои клетки содержание

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