Evgenii
Evgenii

Reputation: 37339

How to select a picker view item in an iOS UI test in Xcode?

I have a picker view with few items: "Red", "Green", "Yellow", "Black". In my UI test I need to select a specific item "Green" from it. I am using the XCTest UI testing APIs that were intruduced with Xcode 7.

enter image description here

What I managed to do so far is to swipe the whole picker view up in the unit test. It is not ideal because it always changes the picker view to the bottom item (when swiping up).

let app = XCUIApplication()
app.launch()
app.pickers.elementAtIndex(0).swipeUp()    
XCTAssert(app.staticTexts["Selected: Black"].exists)

Another but very similar way of changing the picker view is to call pressForDuration ... thenDragToElement, which is not what I want.

app.pickers.elementAtIndex(0).pressForDuration(0.1, thenDragToElement: someElement)

When I use the UI test record function it does not record the picker view scrolling events. It does record when I tap on picker view items:

app.pickerWheels["Green"].tap()

but that does not actually work when the test is run (probably because it needs to scroll the picker view first before tapping).

Here is the demo app with the test.

https://github.com/exchangegroup/PickerViewTestDemo

Update

It is now possible to select a picker view since Xcode 7.0 beta 6 .

app.pickerWheels["Green"].adjustToPickerWheelValue("Yellow")

Upvotes: 54

Views: 26075

Answers (7)

radioaktiv
radioaktiv

Reputation: 2539

Swift 4 version of @Joao_dche's answer

app.pickerWheels.element(boundBy: 0).adjust(toPickerWheelValue: "March")
app.pickerWheels.element(boundBy: 1).adjust(toPickerWheelValue: "13")
app.pickerWheels.element(boundBy: 2).adjust(toPickerWheelValue: "1990")

Upvotes: 9

Sujananth
Sujananth

Reputation: 705

I used below code to identify the element displayed now in the picker wheel.

To Find an element in picker

let valueSelected = algorithmsPicker.pickerWheels.element(boundBy: 0).value as! String

To select a value in the picker wheel:

 algorithmsPicker.pickerWheels[valueSelected].adjust(toPickerWheelValue: "BubbleSort")

Upvotes: -1

N..
N..

Reputation: 956

This is one of most popular post for select pickervie(UIPickerView)

If you want to select state/date from picker view. You can try following swift 3 code.

 XCUIApplication().tables.pickerWheels["AK"].adjust(toPickerWheelValue: "MA")

PickerWheels pick from AK and set the target state.

XCUIApplication().tables.pickerWheels["Starting Point" "].adjust(toPickerWheelValue: "Target Place")

enter image description here

Upvotes: 1

Pavel Vavilov
Pavel Vavilov

Reputation: 588

Joe's answer working great on iOS 11, but doesn't work for me on iOS 10.3.1 [Xcode 9.2]

I use custom views (labels actually) as picker rows and unfortunately gorgeous Joe's answer doesn't work for me on iOS 10.3.1 while working perfectly on iOS 11. So I had to use

app.pickerWheels["X, Y of Z"].swipeUp()

where

X is my label's text.
Y is row position in picker view. Position number starts with 1, not zero.
Z is number of values in picker view.

So in my case this command looks like

app.pickerWheels["1st, 1 of 28"].swipeUp()

Upvotes: 1

Debo
Debo

Reputation: 308

Objective-C Version of @Joao_dche's Answer

Using UIDatePicker with XCTest for UI Testing:

    XCUIElementQuery *datePickersQuery = app.datePickers;
    [datePickersQuery.pickerWheels.allElementsBoundByIndex[0] adjustToPickerWheelValue:@"May"];
    [datePickersQuery.pickerWheels.allElementsBoundByIndex[1] adjustToPickerWheelValue:@"13"];
    [datePickersQuery.pickerWheels.allElementsBoundByIndex[2] adjustToPickerWheelValue:@"2017"];

    XCUIElement *doneButton = app.buttons[@"Done"];
    [doneButton.firstMatch tap];

Upvotes: 2

Joao_dche
Joao_dche

Reputation: 307

If there are multiple wheels, an easy way to select items it is like this:

precondition: it's a date picker (UIDatePicker), swift language

    app.pickerWheels.elementBoundByIndex(0).adjustToPickerWheelValue("March")
    app.pickerWheels.elementBoundByIndex(1).adjustToPickerWheelValue("13")
    app.pickerWheels.elementBoundByIndex(2).adjustToPickerWheelValue("1990")

where: index "0" is month, "1" is day, "2" is year

Upvotes: 20

Joe Masilotti
Joe Masilotti

Reputation: 17008

As noted in the question's update, Xcode 7 Beta 6 added support for interacting with pickers. The newly added method -adjustToPickerWheelValue: should be used to select items on a UIPickerView.

let app = XCUIApplication()
app.launch()
app.pickerWheels.element.adjustToPickerWheelValue("Yellow")

Here's a GitHub repo with a working example. And some more information in a blog post I wrote.

Upvotes: 60

Related Questions