Titanium 製アプリで NativeDriver を試す(iPhone 編)
Android アプリに続き、iPhone アプリで NativeDriver を試したメモ。
Titanium 製アプリで NativeDriver を試す(Android 編) - vaccho's blog
Titanium 製アプリで対応する
アプリ側の対応は、Xcode 上でライブラリを読み込んであげるのと
main.m でサーバを起動するようにしてあげれば良い。
http://code.google.com/p/nativedriver/wiki/IOSMakeAnAppTestable
ライブラリを読み込む
Titanium はビルドすると Xcode プロジェクトを生成するので
今回はこれに対してチュートリアル通りに行ってみた。
すると、以下のように AsyncSocket が重複しているというエラーが出る。
ld: duplicate symbol _AsyncSocketException in (以下略)
どうやら Titanium 本体と NativeDriver のために読み込んだ CocoaHTTPServer で
バッティングしている様子。
Xcode/Objective-C 素人なのでどうするのがベストなのかわからないが、
CocoaHTTPServer の方の AsyncSocket.h/AsyncSocket.m をそっと削除したら解決。
main.m でサーバを起動する
Titanium は main.m をビルドごとに自動生成しているため
Xcode 上で main.m を編集してもその内容が破棄されてしまう。
なので、SDK 内にある自動生成元のファイルに対して編集すると良い。
Mac なら以下。
/Library/Application Support/Titanium/mobilesdk/osx/1.7.5/iphone/main.m
Titanium 製アプリを操作する
上記対応をして Xcode からアプリを起動すれば
Android のときと同様に Java のテストコード経由で操作が可能。
ただし要素の取得方法は API が異なり、By.placeholder() など
Android にはない方法も利用できる。
こんな感じ。
// メールアドレスを入力 WebElement mailAddressForm = driver.findElement(By.placeholder("メールアドレス")); mailAddressForm.sendKeys(mailAddress); // パスワードを入力 WebElement passwordForm = driver.findElement(By.placeholder("パスワード")); passwordForm.sendKeys(password); // ログインボタンをクリック driver.findElement(By.className(ClassNames.BUTTON)).click();
ということで
Titanium 製 iPhone アプリでも NativeDriver が利用できた!
アプリ側でサーバを起動して、テストコードからそれを叩くという形なので
iPhone/Android でほぼ同じようにテストコードを書けるのが良い。
Titanium で iPhone/Android 両対応すると画面がほぼ同じになるので
テストコードも共通化して書けそうなところが NativeDriver を採用するメリットになりそう。