2. Overview
The Problem
The Solution
Run UIAutomation From The Command Line
Break It Out Of Javascript
Control it in Real-Time
How to Code With Appium
Demo
Odds & Ends
4. The Problem w/ UIAutomation
runs only in Instruments.app
must be written in Javascript
does not support realtime control
many useful js methods (e.g. HTTP requests) have been
removed
difficult to build libraries and re-use code
cannot integrate w/ existing Selenium automation
requires adding http servers to your app’s source code
6. Solving the Problem
need command line control
needs to run on the simulator and real devices
need to break out of javascript
need realtime control
should not require you to add code to your app
shoud not require the application source code
7. Command Line Control
/usr/bin/instruments
-t templatePath (path to Automation.tracetemplate)
(path to compiled ios application)
-e UIASCRIPT (path to UIAutomation javascript test)
-e UIARESULTSPATH (path where results will be saved)
[-w device udid]
/usr/bin/xcodebuild (run inside project.xcodeproj)
-sdk (sdk version)
-target (build target)
[-scheme (scheme)]
TARGETED_DEVICE_FAMILY=1|2 (1=iPhone, 2=iPad)
8. Breaking Out Of Javascript
No HTTP Web Requests in UIAutomation JS
However…
host.performTaskWithPathArgumentsTimeout() can run all
your favorite shell commands
so with friends like cat, curl, and python who needs
Javascript and its HTTP web request methods
… and Don’t Forget the AppleScript (comes in handy when
you need to dismiss OS permissions dialogs)
9. Making It Real-Time
Technique 1, file based communication
Javascript loop looking for sequentially number files in a
predetermined folder for commands
Have your program write raw javascript to the file
Read the file using cat
Run the command using eval()
Write the sequentially numbered response file using
whatever you like (I chose python)
Technique 2, setup a proxy web service
Curl to ask if there’s a command you should run
Curl back posting the result
10. Result
Now you can control UIAutomation from any language
that can write files or make web requests
You can reuse all that non javascript based (java, c#,
python, ruby, php) automation code you have for your
selenium tests
Run tests that use a web browser and an iOS device at the
same time
The possibilities are endless
17. Failed Prototypes
Applescript iOS Simulator Automation
Did not work on actual devices
Seemed to be highly sensitive to iOS and OS X version
Not a reliable
Javascript Server Within UIAutomation
I could not get a server booted up while running in
Instruments
18. Pitfalls
Bug in UIAutomation causes 1 second delay between
commands
I get around this by sending batches of commands
Noticed NIBs and XIBs are supported while storyboards
are a more of a crapshoot
It’s tricky to make elements accessible in objective C
Some controls (UISegmentedControl) are missing supported
accessibility methods
Applying a label to text will hinder your ability to read the
text in the control (you need to encapsulate it)