UI Testing
Syntax#
- XCUIApplication() // Proxy for an application. The information identifying the application is specified in the Xcode target settings as the “Target Application”.
- XCUIElement() // A user interface element in an application.
Adding Test Files to Xcode Project
When creating the project
You should check “Include UI Tests” in the project creation dialog.
After creating the project
If you missed checking UI target
while creating project, you could always add test target later.
Setps:
- While project open go to
File
->New
->Target
- Find
iOS UI Testing Bundle
Accessibility Identifier
When Accessibility enabled in Utilities
- Select
storyboard
. - Expand
the Utilities
- Select
Identity Inspector
- Select your element on storyboard
- Add new Accessibility Identifier (in example
addButton
)
When Accessibility disabled in Utilities
- Select
storyboard
. - Expand
the Utilities
- Select
Identity Inspector
- Select your element on storyboard
- Add attribute in
User Defined Runtime Attributes
- For
Key Path
type -accessibilityIdentifier
- For
Type
- `String - For
Value
- new accessibility identifier for your element (in exampleview
)
Setting up in UITest file
import XCTest
class StackOverFlowUITests: XCTestCase {
private let app = XCUIApplication()
//Views
private var view: XCUIElement!
//Buttons
private var addButton: XCUIElement!
override func setUp() {
super.setUp()
app.launch()
//Views
view = app.otherElements["view"]
//Buttons
addButton = app.buttons["addButton"]
}
func testMyApp() {
addButton.tap()
view.tap()
}
}
In [ ]
add Accessibility Identifier for element.
UIView, UIImageView, UIScrollView
let imageView = app.images["imageView"]
let scrollView = app.scrollViews["scrollView"]
let view = app.otherElements["view"]
UILabel
let label = app.staticTexts["label"]
UIStackView
let stackView = app.otherElements["stackView"]
UITableView
let tableView = app.tables["tableView"]
UITableViewCell
let tableViewCell = tableView.cells["tableViewCell"]
UITableViewCell elements
let tableViewCellButton = tableView.cells.element(boundBy: 0).buttons["button"]
UICollectionView
let collectionView = app.collectionViews["collectionView"]
UIButton, UIBarButtonItem
let button = app.buttons["button"]
let barButtonItem = app.buttons["barButtonItem"]
UITextField
-
normal UITextField
let textField = app.textFields[“textField”]
-
password UITextField
let passwordTextField = app.secureTextFields[“passwordTextField”]
UITextView
let textView = app.textViews["textView"]
UISwitch
let switch = app.switches["switch"]
Alerts
let alert = app.alerts["About yourself"] // Title of presented alert
Disable animations during UI Testing
In a test you can disable animations by adding in setUp
:
app.launchEnvironment = ["animations": "0"]
Where app
is instance of XCUIApplication.
Lunch and Terminate application while executing
Lunch application for testing
override func setUp() {
super.setUp()
let app = XCUIApplication()
app.launch()
}
Terminating application
func testStacOverFlowApp() {
app.terminate()
}
Rotate devices
Device can be rotate by changing orientation
in XCUIDevice.shared().orientation
:
XCUIDevice.shared().orientation = .landscapeLeft
XCUIDevice.shared().orientation = .portrait