Comment ajuster la molette de sélection iOS à l'index random généré

En utilisant le test d'interface user XCode, il est possible de régler la roue du sélecteur iOS sur la valeur d'index générée ou d'get le text de la valeur d'index et d'ajuster la roue du sélecteur. J'ai été en mesure d'get la valeur de l'index en utilisant le code ci-dessous. Mais impossible d'get la valeur de la valeur de l'index.

let picker = app.pickerWheels.element(boundBy: 1).otherElements.count print(picker) let randomNumber = arc4random_uniform((UInt32(picker))) print(randomNumber) 

En utilisant le count de la roue du sélecteur, j'en génère une valeur random. Avec le numéro d'index de randomNumber, j'essaie d'get la valeur. Est-il possible que je puisse get la valeur de l'index et ajuster la roue du sélecteur à cette valeur.

C'est ainsi que je gère les sélecteurs dans mon framework de test XCTest UI.

J'ai un object ( PickerState ) qui peut représenter l'état d'une roue de sélecteur, qui est peuplée en utilisant la valeur de la roue du sélecteur, qui est dans le format "Some value, 4 of 5" . La méthode getPickerState convertit la valeur Ssortingng en un object PickerState .

generateRandomNewPickerPosition génère un index random vers lequel le sélecteur se déplace, garantissant que la position actuelle du sélecteur n'est pas renvoyée.

J'utilise ensuite des methods d'extension sur XCUIElement pour passer à la valeur générée randomment dans changePickerSelection .

 /// Object to represent the state of a picker wheel. class PickerState { let selectedValue: Ssortingng let currentPosition: UInt let maximumPosition: UInt init(selectedValue: Ssortingng, currentPosition: UInt, maximumPosition: UInt) { self.selectedValue = selectedValue self.currentPosition = currentPosition self.maximumPosition = maximumPosition } } /// Resortingeve a PickerState object, given the value of a picker wheel. func getPickerState(_ text: Ssortingng) { // Separate value let splitText = text.componentsSeparatedBySsortingng(",") let selectedValue = splitText[0] // Extract numbers var numbers = splitText[1].componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) numbers = numbers.filter { $0 != "" } let currentPosition = UInt(numbers[0])! let maximumPosition = UInt(numbers[1])! return PickerState(selectedValue: selectedValue, currentPosition: currentPosition, maximumPosition: maximumPosition) } /// Generate a new position (1-indexed) for the picker. func generateRandomNewPickerPosition(pickerState: PickerState) -> UInt { let valueCount = pickerState.maximumPosition let random = UInt(arc4random_uniform(UInt32(valueCount - 1))) let newPosition = ((pickerState.currentPosition + random) % valueCount) + 1 return newPosition } /// Move up/down the picker options until the given `selectionPosition` is reached. func changePickerSelection(pickerWheel: XCUIElement, selectionPosition: UInt) { // Select the new value var valueSelected = false while !valueSelected { // Get the picker wheel's current position if let pickerValue = pickerWheel.value { let currentPosition = UInt(getPickerState(Ssortingng(pickerValue)).currentPosition) switch currentPosition.compared(to: selectionPosition) { case .GreaterThan: pickerWheel.selectPreviousOption() case .LessThan: pickerWheel.selectNextOption() case .Equal: valueSelected = true } } } } /// Extend XCUIElement to contain methods for moving to the next/previous value of a picker. extension XCUIElement { /// Scrolls a picker wheel up by one option. func selectNextOption() { let startCoord = self.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)) let endCoord = startCoord.coordinateWithOffset(CGVector(dx: 0.0, dy: 30.0)) endCoord.tap() } /// Scrolls a picker wheel down by one option. func selectPreviousOption() { let startCoord = self.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)) let endCoord = startCoord.coordinateWithOffset(CGVector(dx: 0.0, dy: -30.0)) endCoord.tap() } } let pickerWheel = app.pickerWheels.element(boundBy: 0) let newPosition = generateRandomNewPickerPosition(getPickerState(pickerWheel.value)) changePickerSelection(pickerWheel, selectionPosition: newIndex)