あわせて読みたい:
①Appiumを使ってみた【iOS編】
②Appium+JUnitで自動テストを書いてみた【iOS編】
④AppiumでWebアプリのテストを実機で実行する【iOS編】
はじめに
Appiumを実際の現場で導入するにあたり、Appiumがスマホ特有の操作をどこまでサポートしているのか気になるところです。
今回は、Appiumでどのような操作が出来て何が出来ないのか、実際にいろいろ試してみました。
なお前回に引き続き、テストコードは Java 、端末は iPhone5s(iOS7.1.1) を使用します。
基本編
タップ
要素を指定してタップ
シンプルにタップするだけであればclick
コマンドが使用できます。
driver.findElementByClassName("UIAButton").click();
座標を指定してタップ
画面内で座標を指定してタップしたい場合はtap
コマンドを使用します。
tap(int fingers, int x, int y, int duration)
-
fingers
: タップする指の本数 -
x
: タップするX座標 -
y
: タップするY座標 -
duration
: タッチダウンしてから指を離すまでの秒数(ミリ秒)
WebElement button = driver.findElementByClassName("UIAButton");
driver.tap(1, 100, 150, 1000);
ダブルタップ
GoogleフォーラムのJonathan Lipps氏(Appiumの開発者)の回答を見る限りでは、現時点でdoubleClick
、doubleTap
のようなコマンドは実装されていないようです。
ただ、AppiumのコアであるUIAutomationにはdoubleTap
コマンドが用意されているので、そのコマンドを直接実行することでダブルタップを行うことは可能です。
driver.executeScript("target.frontMostApp().mainWindow().buttons()['Button'].doubleTap();");
ロングタップ
tap
コマンドのduration
によってタッチダウンしてから指を離すまでの秒数を制御することが出来るので、ロングタップも可能です。
tap(int fingers, org.openqa.selenium.WebElement element, int duration)
-
fingers
: タップする指の本数 -
element
: 操作対象の要素 -
duration
: タッチダウンしてから指を離すまでの秒数(ミリ秒)
WebElement button = driver.findElementByClassName("UIAButton");
driver.tap(2, button, 3000);
スワイプ
swipe
コマンドでは、座標を指定してスワイプ操作をシミュレートすることが出来ます。
swipe(int startx, int starty, int endx, int endy, int duration)
-
startx
: 開始X座標 -
starty
: 開始Y座標 -
endx
: 終了X座標 -
endy
: 終了Y座標 -
duration
: スワイプにかける時間 ※500〜6000(ミリ秒)の範囲で指定
WebElement cell = driver.findElement(By.xpath("//UIATableView[1]/UIATableCell[3]"));
Point pos = cell.getLocation();
driver.swipe(pos.getX() + 200 , pos.getY() + 10, pos.getX() + 50, pos.getY() + 10, 1000);
フリック
swipe
コマンドのduration
(移動距離)を小さくすることで、フリック操作をシミュレート可能です。
driver.swipe(100, 100, 130, 100, 500);
ピンチイン
zoom
コマンドでは指定した座標を起点としてピンチイン操作をシミュレートします。
zoom(int x, int y)
-
x
: ズーム開始X座標 -
y
: ズーム開始Y座標
driver.zoom(100, 160);
ピンチアウト
pinch
コマンドでは指定した座標を起点としてピンチアウト操作をシミュレートします。
pinch(int x, int y)
-
x
: ピンチ開始X座標 -
y
: ピンチ開始Y座標
driver.pinch(100, 160);
シェイク
shake
コマンドを使用することでシェイク操作をシミュレート可能です。
driver.shake();
端末操作編
アプリをインストール
Appium起動時の引数またはテストコード内で、app
オプションに*.ipaファイルのフルパスを指定することで、テスト実行時にアプリのインストールを行うことが出来ます。
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("platformName", "iOS");
capabilities.setCapability("app", "/Users/taro/Appium/TestApp.ipa");
driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
アプリをアンインストール
上記の方法によってテスト実行時にインストールされたアプリは、テスト終了後には自動的にアンインストールされます。
もしアンインストールしたくない場合は、Appium起動時に--no-reset
オプションを指定します。
appium --no-reset --app "/Users/taro/Appium/TestApp.ipa" -U <実機のUDID> &
アプリを起動
テストシナリオ内でアプリを起動することができます。
このコマンド単体ではあまり使用用途がないように思いますが、後述のcloseApp
コマンドと組み合わせることで、アプリの再起動操作をシミュレートすることが出来ます。
driver.launchApp();
ちなみに「アプリ間連携のテストに使えるかも?」と期待したのですが、どうやら引数にbundleIdを指定できるわけではないので、テスト実行中のアプリ以外は起動することはできなそうです。
アプリを終了
実行中のアプリを終了します。
なお、launchApp
と同様、bundleIdを指定してアプリを終了することはできません。
driver.closeApp();
アプリをバックグラウンドへ移行
指定した秒数の間、アプリをバックグラウンドへ移行(ホーム画面を表示)します。
driver.runAppInBackground(int seconds)
-
seconds
: バックグラウンドを維持する時間(秒)
driver.runAppInBackground(3);
画面をロック
端末の画面をロックし、指定した秒数の後にロックを解除します。
なお、端末にパスワードが設定されている場合はロックの解除は出来ません。
driver.lockScreen(int seconds)
-
seconds
: ロック状態を維持する時間(秒)
driver.lockScreen(3)
端末を回転
指定した向き(Landscape/Portrait)に端末を回転します。
driver.rotate(org.openqa.selenium.ScreenOrientation orientation)
-
orientation
: 端末の向き
driver.rotate(ScreenOrientation.LANDSCAPE);
driver.rotate(ScreenOrientation.PORTRAIT);
参考
http://appium.github.io/java-client/
https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/_index.html