Setting Apple’s UIAutomation Free with Appium Dan Cuellar d@zoosk.com Lead Software Engineer, Test Team
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
The Problem
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
The Solution
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
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)
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)
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
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
Coding w/ Appium
Pre-Requisites  install Xcode  install Xcode Command Line Tools  Set up a ~/.appium file [appium] username = an_osx_admin_username password = an_osx_admin_password OPTIONAL  sudo easy_install pip  sudo pip install bottle (required for webdriver server)  sudo pip install selenium (required to code against the webdriver server)
Running Appium  git clone git://github.com/hugs/appium  To launch the UIAutomation javascript interpretter  python appium.py “/path/to/my.app”  To launch the webdriver server  Python server.py “/path/to/my.app”
Coding Appium like Selenium from selenium import webdriver command_url = “http://localhost:4723/wd/hub” iphone = webdriver.DesiredCapabilities.IPHONE driver = webdriver.Remote(command_url, iphone) fields = driver.find_elements_by_tag_name('textField’) fields[0].send_keys(3) fields[1].send_keys(4) buttons = driver.find_elements_by_tag_name('button’) buttons[0].click()
Demo
Odds & Ends
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
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)
Resources Appium Project  https://github.com/hugs/appium or http://appium.io Discussion  https://groups.google.com/d/forum/appium-discuss

Setting Apple's UI Automation Free with Appium

  • 1.
    Setting Apple’s UIAutomation Free with Appium Dan Cuellar d@zoosk.com Lead Software Engineer, Test Team
  • 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
  • 3.
  • 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
  • 5.
  • 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 OfJavascript 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 youcan 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
  • 11.
  • 12.
    Pre-Requisites  install Xcode install Xcode Command Line Tools  Set up a ~/.appium file [appium] username = an_osx_admin_username password = an_osx_admin_password OPTIONAL  sudo easy_install pip  sudo pip install bottle (required for webdriver server)  sudo pip install selenium (required to code against the webdriver server)
  • 13.
    Running Appium  gitclone git://github.com/hugs/appium  To launch the UIAutomation javascript interpretter  python appium.py “/path/to/my.app”  To launch the webdriver server  Python server.py “/path/to/my.app”
  • 14.
    Coding Appium likeSelenium from selenium import webdriver command_url = “http://localhost:4723/wd/hub” iphone = webdriver.DesiredCapabilities.IPHONE driver = webdriver.Remote(command_url, iphone) fields = driver.find_elements_by_tag_name('textField’) fields[0].send_keys(3) fields[1].send_keys(4) buttons = driver.find_elements_by_tag_name('button’) buttons[0].click()
  • 15.
  • 16.
  • 17.
    Failed Prototypes  ApplescriptiOS 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 inUIAutomation 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)
  • 19.
    Resources Appium Project  https://github.com/hugs/appium or http://appium.io Discussion  https://groups.google.com/d/forum/appium-discuss