setting uiautomation free with appium

19
Setting Apple’s UIAutomation Free with Appium Dan Cuellar [email protected] Lead Software Engineer, Test Team

Upload: dan-cuellar

Post on 14-Aug-2015

344 views

Category:

Software


0 download

TRANSCRIPT

Setting Apple’s UIAutomation Free

with AppiumDan Cuellar

[email protected]

Lead Software Engineer, Test Team

Overview

The Problem

The SolutionRun UIAutomation From The Command LineBreak It Out Of JavascriptControl 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

It’s H

ack-ta

stic!

!!

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 commandsHave your program write raw javascript to the fileRead the file using catRun the command using eval()Write the sequentially numbered response file using

whatever you like (I chose python)

Technique 2, setup a proxy web serviceCurl to ask if there’s a command you should runCurl back posting the result

Result

Now you can control UIAutomation from any language that can write files or make web requestsYou 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_usernamepassword = 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 interpretterpython appium.py “/path/to/my.app”

To launch the webdriver serverPython 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 AutomationDid not work on actual devicesSeemed to be highly sensitive to iOS and OS X

versionNot 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 CSome controls (UISegmentedControl) are missing

supported accessibility methodsApplying a label to text will hinder your ability to

read the text in the control (you need to encapsulate it)

Resources

Appium Projecthttps://github.com/hugs/appium or

http://appium.io

Discussionhttps://groups.google.com/d/forum/appium-discuss