How to adjust iOS picker wheel to generated random

2019-07-26 04:42发布

Using XCode UI Test is there any way we can adjust iOS picker wheel to generated index Value or get the text of index value and adjust the picker wheel. I was able to get the index value using below code. But unable to get the value of the index value.

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

Using the count of the picker wheel I am generating a random value from that. With the index number of randomNumber I am trying to get the value. Is there any way I can get the value of the index and adjust the picker wheel to that value.

1条回答
戒情不戒烟
2楼-- · 2019-07-26 04:58

This is how I handle pickers in my XCTest UI testing framework.

I have an object (PickerState) which can represent the state of a picker wheel, which is populated using the value of the picker wheel, which is in the format "Some value, 4 of 5". The getPickerState method converts the value String into a PickerState object.

generateRandomNewPickerPosition generates a random index for the picker to move to, ensuring that the picker's current position is not returned.

I then use extension methods on XCUIElement to move to the randomly-generated value in changePickerSelection.

/// Object to represent the state of a picker wheel.
class PickerState {
    let selectedValue: String
    let currentPosition: UInt
    let maximumPosition: UInt

    init(selectedValue: String, currentPosition: UInt, maximumPosition: UInt) {
        self.selectedValue = selectedValue
        self.currentPosition = currentPosition
        self.maximumPosition = maximumPosition
    }
}

/// Retrieve a PickerState object, given the value of a picker wheel.
func getPickerState(_ text: String) {
    // Separate value
    let splitText = text.componentsSeparatedByString(",")
    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(String(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)
查看更多
登录 后发表回答