Fresh install in the simulator
To make sure that your UI tests start with a fresh install of the app on the simulator you can uninstall the app after building the UI tests: Open the project settings, go to the UITests target and in the section “Run Script” add the following command line:
xcrun simctl uninstall booted com.vvse.toiletmap
Use “accessibilityIdentifier” or “accessibilityLabel” to identify UI elements
If possible use
accessibilityLabel to identify a UI element. This ensures that tests still work when the label text changes or a different UI language is used.
How to specify the “accessibilityIdentifier” of an UI element in the storyboard:
In the storyboard show the identity inspector. In the section “User defined Runtime Attributes” press “+” and enter “accessibilityIdentifier” as a key path, select type “String” and enter the identifier string that you would like to use to reference this UI element in the XCUITest test case.
In the XCUITest test case you can then reference this UI element like this:
let app = XCUIApplication() let mapTypesButton = app.buttons["map_types"] mapTypesButton.tap()
“Timestamped Event Matching Error: Failed to find matching element”
When recording a UI test you might encounter this error when trying to swipe an object. It is most likely caused by the object being swiped not having accessibility enabled. Just enable it in the identity inspector of the storyboard editor:
Comparing localized UI texts
If you add your strings files to the UI test target you can use NSLocalizedString() to compare the value of a UILabel element with an expected localized text value. Assume that your localized string are in Localizable.strings. Open the project settings, select the UI test target and click on “Build Phases”. Expand the “Copy Bundle Resources” section and add “Localizable.strings” to the list.
When using NSLocalizationString() you have to specify the bundle of the UI Test app since the default bundle seems to refer to the test launcher app:
let newCellValue = app.tables.cells[cellName].staticTexts["value_text"].label let expectedCellValueString = NSLocalizedString(expectedCellValueStringId, bundle: Bundle(for: SomeUITestClass.self), comment: "" ) XCTAssertEqual(newCellValue, expectedCellValueString)
Running UI tests from the command line
You can you the xcodebuild command to run both unit and UI tests from command line.
If you are using CocoaPods make sure to use
-workspace instead of
-project otherwise the Swift compiler won’t find the frameworks that are defined in the podfile.
xcodebuild test -workspace MayApp.xcworkspace -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 8 Plus
Video demonstrating XCUITest in action
The following video show the UI tests of a real world app on a simulated iPhone 8 Plus. It tests the UI of the free and pro version of the Toilet Map app both in English and in German.