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 を採用するメリットになりそう。