Xcode経由でのiOSの自動化
目次:
1. はじめに
|
注: Xcode 7経由でのiOS 9デバイスの自動化について説明する旧バージョンの文書は こちらをご覧ください。 |
T-Plan Robot Enterprise バージョン4.3.1以降は、Mac OS X上のXcode 8以降を経由したiOS 10以降のデバイスの自動化をサポートしています。主な機能:
-
jailbreakなしでのiOSの完全な制御が可能です。
-
テスト対象アプリケーションの変更は不要です。
-
デバイスは、Mac OS Xと同じWiFiネットワークに接続するか、Lightning USBケーブルで接続する必要があります。
-
縦向きおよび横向き(左)(デバイスボタンが右側にある状態)の画面の向きでの自動化をサポートします。
-
追加の機能セットは、iOS Over Xcode ExtensionプラグインのMobileコマンドから提供されます。これにより、デバイスのアプリケーション、キーボード、画面の向きを管理できます。
-
USBトンネリングを使用しない限り、並列接続(すなわち、1台のMacマシンから複数のデバイスを並列に自動化すること)がサポートされます。
この接続はiOS Mirror接続よりも低速であるため、ゲームなどリアルタイム制御を必要とするアプリケーションのテストには適していません。代わりにiOS Mirror接続を使用してください。あるいは、必要に応じてConnectコマンドを使用して、その場で接続を切り替えることもできます。
2. Javaの要件
特定バージョンのJavaは、Mac OS X Catalinaで導入された新しいセキュリティ制限に関連する問題により、Lightning USB経由の画面ミラーリングをサポートしていません。お使いのJavaが非互換の場合、RobotのUIが通知します。
11.0.9以降、15、16、17などの最新のJavaバージョンに対応したRobot 6.3.2以降の使用を強くお勧めします。それより古いRobotのリリースは、入手が困難な古いJavaバージョン(Oracleのリリースアーカイブはサブスクリプションが必要です)でのみ動作します。
|
Java製品ライン |
サポートされるバージョン(Robot 6.3.2以降) |
サポートされるバージョン(Robot 6.3.1以前) |
|---|---|---|
|
Java 8 |
アップデート251および262を除く、すべてのJava 8 |
Java 8 アップデート242(1.8.0_242)以下 |
|
Java 9, 10 & 12 |
すべてサポート |
すべてサポート |
|
Java 11 |
11.0.7および11.0.8を除く、すべてのJava 11 |
Java 11.0.6以下 |
|
Java 13 |
すべてサポート |
- |
|
Java 14 |
- |
- |
|
Java 15以降 |
すべてサポート |
- |
サポートおよびテスト対象:
-
Oracle Java(旧リリースへのアクセスにはサブスクリプションが必要)
3. セットアップ
要件:
-
Xcodeがインストール済みで最新の状態であり、有効なApple Developerアカウント(一致するプロビジョニングプロファイル、有効な証明書チェーン)で設定されていること。
-
Command Line Toolsが、有効な正しいXcodeディレクトリを指すように設定されている必要があります:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer -
iOSデバイスがLightning USBケーブルでMacマシンに接続されており、Xcodeに認識されていること(Window -> Devicesに表示されます)。
-
Robotプロセスに必要なアクセス権を付与してください。
-
Robotを起動し、ログインウィンドウで「iOS Over Xcode」接続を選択してオプションを入力し、接続をクリックします。この時点では、Accessibilityが有効になっていないというエラーで接続に失敗します。
-
Apple→Settingsを開き、Security & Privacyを選択します
-
左側の列にあるAccessibilityをクリックし、ウィンドウ右側でアクセスを有効にします。スタンドアロン版を使用している場合、起動方法によってプロセスが「java」または「sh」として表示されることがあります。
-
Robotのログインウィンドウで再度接続をクリックします。Cameraのアクセス許可を求めるポップアップが表示されるので、承認します。あるいは、Security & PrivacyのCamera 項目を選択して、そこで権限を付与することもできます。
-
同様に、Screen RecordingおよびAutomationのアクセスも有効にする必要がある場合があります(これらは古いMac OS Xのリリースには存在しないことがあります)。
-
-
RobotまたはJavaをアップグレードするたびに、この手順を繰り返す必要がある場合があります。
1. ダウンロード手順:
Robot 8 for Macを使用している場合は、この手順をスキップしてください。WDAインスタンスが同梱されています。
他のRobotバージョンでは、最新バージョンのWebDriverAgent(WDA)プロジェクトをダウンロードする必要があります:
-
お使いのiOSのバージョンが17.7以降の場合、必ずRobot 7.2.10以降と最新バージョンのWDA(v13以降)を使用してください。
-
Robot 7.2.9以前は、17.7より前のiOSバージョンのみをサポートし、バージョン11までのWDAにのみ対応しています。
-
以前のバージョンからのアップグレードはありません。古いWDAは単に破棄し、新しいXcodeプロジェクトをセットアップしてください。
注: 公式のWebDriverAgentプロジェクトは使用しないでください。横向きモードと完全なiOS制御を有効にするためのバグ修正と機能拡張を加えています。接続の設定には、Robotがカスタムプロジェクトバージョンを受け入れられるようにするスイッチがありますが、その動作は保証されません。
2. プロジェクトのセットアップ手順:
初回セットアップ:
-
依存関係をインストールします: npm、Carthage、GIT。推奨手順:
-
Homebrewをインストールします。例:
$ /bin/bash -c "$(curl -fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install.sh)" -
Homebrewを使用して、NPM、GIT、Carthageをインストールします:
$ brew install node
$ brew install git
$ brew install carthage
-
3. Xcodeのセットアップ手順:
Robot 8 for Macを使用している場合、この手順は接続がそのままでは開始できない場合にのみ実行してください。ログインウィンドウのManage WebDriverAgentボタンを使用して、同梱のWDAインスタンスをXcodeで開きます。
Xcodeのセットアップは、次の場合に繰り返す必要があります:
-
WebDriverAgentプロジェクトを更新または再ダウンロードした後。
-
Xcodeが更新された後。
-
対象デバイスのiOSが更新された後。
-
新しいデバイスをセットアップする必要がある場合。
手順:
-
Xcodeを起動します。WDAプロジェクトフォルダから
WebDriverAgent.xcodeprojプロジェクトファイルを開きます。 -
Xcodeプロジェクトで:
-
-
上部のバーでWebDriverAgentRunnerスキームと対象デバイスを選択します。デバイスに「(Developer Mode disabled)」という接尾辞が表示される場合は、こちらの手順に従って有効にしてください。
-
WebDriverAgentLibターゲットを選択します。「Automatically manage signing」オプションが有効になっており、有効なチームが設定されていることを確認します..
-
有料のApple Developerアカウントをお持ちの場合は、個人チームよりも会社のチームを使用することを推奨します。
-
有料のAppleアカウントをお持ちでない場合は、個人チームを使用してください。この場合、Xcodeが「Failed to register bundle identifier」と表示して拒否する可能性が高いです。これを解決するには、デフォルトのcom.facebook.WebDriverAgentLibバンドル識別子を、自分で作成した識別子に置き換えます。これには数回の試行が必要になる場合があるため、「my.nonsense.app」のような、非常に一意な識別子を作成してみてください。バンドルIDが受け入れられると、Xcodeはエラーメッセージを表示しなくなります。
-
-
-
WebDriverAgentRunnerターゲットを選択します。同様に、「Automatically manage signing」オプションが有効になっており、有効なチームが設定されていることを確認します。
-
-
左上のドロップダウン(上図の#1)がWebDriverAgentRunner→[your phone]に設定されていることを確認します。XcodeメニューでProduct->Testを選択します。View->Debug Area->Activate Consoleからデバッグコンソールを開きます。すべてが正常に動作すれば、アプリケーションがデバイス上でテストモードで起動し、コンソール出力の末尾に次の行が表示されます:
2017-10-19 15:51:28.502141+0100 WebDriverAgentRunner-Runner\[785:276949\] ServerURLHere->http://192.168.1.3:8100<-ServerURLHere
-
WDAサーバーが動作していることを確認するには、URLをコピーして末尾に「/health」を追加し、Safariで開きます。「I-AM-ALIVE」と表示されるはずです
http://192.168.1.3:8100/health
-
個人チームを使用している場合、デバイスが個人チームの証明書を信頼しないため、WDAは初回起動に失敗します。これを解決するには、iOSデバイスでSettingsを開き、General→VPN & Device Management画面を選択して、そこにある証明書を信頼済みにします
接続時にRobotがXcodeを実行している必要はありません。WebDriverAgentアプリケーションを対象のiOSデバイスに事前にインストールしておく必要すらありません。RobotがXcodeのCLIツールを使用して、必要に応じてそれをビルドし、デバイスにインストールします。上記の手動プロセスは、Xcode CLIツールを使用してビルド・実行できるようにWDAプロジェクトが正しく設定されていることを確認するためだけに必要です。また、コードをコンパイルしておくことで、接続の初期化時間が短縮されます。
4. Robotからの接続
次の情報を指定する必要があります:
-
接続先のデバイス名。v5.0.6以降、_IOS_DEVICES動的変数を呼び出すことで、利用可能なデバイスの一覧を取得できます。
-
正しく設定されたWDAプロジェクトのパス
注: キーボードマッピングは非常に低速な場合があり、特にiPadでは最大10分かかることがあります。繰り返し接続する場合の遅延を避けるには、保存済みキーマップオプションを使用してください。
5. トラブルシューティング
-
iOSデバイスに付属の純正Lightning USBケーブルを使用してください。Appleは、他社製のケーブルをiOSが拒否するようにすることで知られています。
-
ケーブルはMacのUSBポートに直接接続してください。USBスイッチやハブは使用しないでください。
6. 自動化
接続
タッチスクリーンのサポート
キーボードのサポート
キーボードマッピング
システムアラートの処理
接続
テストスクリプトからiOSデバイスに接続するには、Connectコマンド(TPRスクリプト)またはconnect()メソッド(Javaテストスクリプト)を使用します。引数のURLは"xcode://localhost"の形式である必要があり、デバイス名("device")とWebDriverAgentプロジェクトフォルダへのパス("project")を指定する必要があります。"app"パラメータは任意です。これにより、ローカルに保存されたiOSアプリケーション(.ipa)をデバイスにインストールできます。このアプリケーションは、WDAのデプロイに使用したものと同じ設定(証明書)で署名されている必要があります。
例:
TPRテストスクリプト: Connect xcode://localhost device="My iPhone" project="/Users/Joe/WebDriverAgent"
Javaテストスクリプト: connect("My iPhone", new File("/Users/Joe/WebDriverAgent"), (File) null, false);
別の方法として、パラメータを接続URLのクエリにエンコードすることもできます。この形式は、c/--connect CLI接続にも適しています。最近の接続のURLは、Tools->CLI Wizardウィンドウからコピーできます。さらに別の方法として、Desktop->Connection Managerウィンドウで接続に名前を付け、URLの代わりにその名前を使用することもできます。
TPRテストスクリプト: Connect "xcode://localhost?device=My%20iPhone&project=/Users/Joe/WebDriverAgent"
タッチスクリーンのサポート
サポートされる画面の向きは縦向きおよび横向き(左)のみです。それ以外の向きでも接続自体は切断されませんが、タッチイベント(タップなど)の位置がずれる可能性があります。これはApple側の基盤フレームワークのバグによるものです。画面の向きを変更するには、F4キーを押すか、テストスクリプトでそれを押すようにします(Press F4)。これはv4.4.3以降でサポートされています。
マウスジェスチャーは、次のように解釈されます:
-
マウスクリックは、タッチスクリーンのタップにマッピングされます。ダブルクリック(タップ)とロングクリック(ロングタップ、「タッチアンドホールド」)は、v4.4.2以降でサポートされています。
-
マウスドラッグは、スワイプにマッピングされます。
-
マウスホイールイベントはサポートされておらず、無視されます。
-
その他のタッチスクリーンジェスチャーは、Mobileコマンドを通じてサポートされる場合があります。
キーボードのサポート
この接続では、次の2つの方法で文字入力を行います:
-
編集可能な要素との直接対話。バックエンドのWDAコンポーネントによって返されます。これはRobot 7.0.2以降でサポートされています。スクリプトから長い文字列を入力する場合、テキストは入力ではなく貼り付けとして扱われるため非常に高速です。マルチバイト(英語以外の)文字も完全にサポートされています。この方式は、WDAがテキスト要素として認識できないカスタム入力要素では失敗する場合がある点に注意してください。
-
ソフトキーボード上のタップのシミュレーション。ソフトキーボードのマップが起動時に作成され、接続はキーをタッチすることで入力を行います。これはRobot 7.0.1以前における唯一の方法です。バージョン7.0.2以降では、これは追加のキー(Dictationなど)のサポート、およびWDAが編集可能な要素を返せない場合のフォールバック機構としてのみ使用されます。ソフトキーボードによる入力は低速です。キーボード上で利用可能な文字のみがサポートされます。詳細は、以下のソフトキーボードの章を参照してください。
ハードウェアキーのマッピング:
|
iOSハードウェアキー |
Robotスクリプトキー(アクション) |
説明 |
|---|---|---|
|
HOME |
Home、右クリック |
Homeキー。長押しおよびHomeの2回押しはサポートされていません。 |
|
<画面の回転> |
F4 |
画面を縦向きから横向き(左)に、またはその逆に回転します(4.4.3以降) |
|
POWER |
F10 |
Powerボタンを押します。1回押し(画面のロックと減光)と3回押し(VoiceOverの開始/停止)の両方で正常に動作します。7.2.4以降でサポートされています。
アプリのインストールに必要な2回押しには対応していません。これは、アプリが他のアプリをインストールすることを防ぐための、Apple側の意図的なセキュリティ対策と考えられます |
|
SNAPSHOT
|
F11 |
画面のスナップショットを撮影します(Power+Homeを長押し)。7.2.4以降でサポートされています。 |
ソフトキーボード
その他のキーは、ソフトキーボードを通じてシミュレートされます。この接続はエンドユーザーとして動作します。つまり、キーボードのページを切り替えながら個々のキー(文字)をタップします。規則:
-
何かを入力するには、キーボードが表示されている必要があります。キーボードが非表示の状態での入力は無視されます。
-
一度にサポートされるキーボードのロケール(言語)は1つのみです。自動化の実行中に手動でキーボードを切り替えないでください。誤ったキーが入力される原因になります。
-
この接続は、現在のキーボード上にあるキーのみをサポートします。
-
デバイスが縦向きモードの場合、一部のキーが使用できないことがあります。例えば、iPhoneでは、キーボードが「Hide keyboard」キーを横向きモードのみに含んでいるため、縦向きモードではこのキーを押すことができません。
-
キーの長押しで表示される一覧の追加キーはサポートされていません。
-
絵文字キーボードはサポートされていません。回避策として、マウスクリックを使用して自動化してください。
-
この接続は、デフォルトでSafariのキーボードマップを使用します。ただし、一部のアプリケーションはキーボードレイアウトをカスタマイズしているため、入力に失敗することがあります。これを修正するには、iOS Over Xcode ExtensionプラグインのLoadKeyboard およびRemapKeyboard スクリプトをテストスクリプトから使用します。
ソフトキーボード上のほとんどのキーは、PCキーボード(a-z、A-Z、0-9など)と同等です。それ以外の特殊なソフトキーボードのマッピングは、以下の表にまとめています。赤いアスタリスクが付いたキーの可用性は、デバイスの種類や画面の向きによって異なる場合があります。
|
iOSキーボードキー |
Robotスクリプトキー(アクション) |
説明 |
|---|---|---|
|
ENTER, GO |
Enter(改行) |
Enterキー。 |
|
DELETE |
Backspace, Delete |
Backspaceキー。挿入位置より前の文字を削除します。 |
|
|
Up (Arrow Up) |
Shiftキーは、キーボードをシフト文字に切り替えます。ラベルや外観はキーボードのページによって変化します。接続が自動的に切り替えるため、シフト文字を入力するためにこのキーを手動で押す必要はありません。 |
|
|
Right (Arrow Right) |
このキーは、キーボードを次のキーボードページに切り替えます。ラベルや外観はキーボードのページによって変化します。接続が自動的に切り替えるため、別のページの文字を入力するためにこのキーを手動で押す必要はありません。 |
|
|
F5 |
このキーは、次のキーボードロケールに切り替えます。この接続は1つのロケールのみをサポート(マッピング)するため、次のキーボードはタップでのみ操作できます。入力サポートを復元するには、元のキーボードロケールに戻す必要があります。 |
|
|
F6 |
ディクテーションを開始します。 |
キーボードマッピング
この接続は、起動時にソフトキーボードマッピングを実行します。これは、現在のキーボードのすべてのページ(「レイアウト」と呼ばれます)を表示し、そのキーの位置を記録するプロセスです。これは低速な処理であるため、マップをファイルに保存する設定を有効にすることを推奨します。マッピングは一度だけ実行され、以降の接続ではそれが再利用されます。キーボードの変更(特に別のロケール(言語)への切り替え)を行うと、マップは無効になる点に注意してください。iOSの更新によっても、マップを無効にする変更が生じる場合があります。
初回のキーボードマッピングは、SafariブラウザのURLフィールドに表示されるキーボードに対して実行されます。他のアプリは異なるキーセットを使用したり、キーボードをカスタマイズしたりする場合があるため、Safariのマップが正しく機能しないことがあります。これを解決するには、iOS Over Xcode Extensionプラグインの次の機能を使用します:
-
LoadKeyboard スクリプトを使用すると、キーマップファイルを読み込むことができます。
-
RemapKeyboard は、デバイス画面に表示されているキーボードの即時リマッピングを実行します。LoadKeyboardよりもはるかに低速ですが、キーマップファイルを作成する手間が省けます。
キーボードマップファイルを表示・編集するには、Desktop -> iOS Over Xcode Keymap Editorウィンドウを使用します:
-
現在表示されているレイアウトを特定するには、Detect Layoutを選択します。
-
Create Keymapボタンは、マッピングプロセス全体を繰り返して新しいキーボードマップを作成します。
-
デバイス画面に表示されている個々のレイアウトを再作成または修正するには、Map Layoutを選択します。例えば、上のスクリーンショットの「Q」レイアウトは、Safariがいくつかの追加キーを加えているため、Notesアプリケーションには適用できません。文字を正しく入力するには、これを再マッピングする必要があります。
-
不足しているレイアウトを追加するには、Map Layoutを使用します。例えば、上のマップには縦向きのレイアウトが3つしか含まれていません。「[」のレイアウトを追加するには、それを画面に表示させてからマッピングします。
-
スクリプトに無視させたいキーを削除するには、Deleteを使用します。レイアウトを削除することもできますが、再作成する予定がない限り推奨されません。
-
変更を現在の接続セッションに適用するには、Apply To Connectionをクリックします。
-
変更をRobotの設定フォルダ内のデフォルトのキーマップファイルに保存するには、Save To Fileをクリックします。保存済みキーマップのフラグが有効な場合、以降の接続でこのマップが読み込まれます。
-
変更を別のファイルに保存するには、Save Asをクリックします。これにより、LoadKeyboardスクリプトで使用するファイルを作成できます。
デフォルトのマップファイルを削除し、必要に応じてデフォルトのSafariマップを再作成するには:
-
Login Dialogを開き、「iOS Over Xcode」接続を選択して、「Device name」フィールドの横にある「...」ボタンをクリックします
-
このウィンドウには、USB経由で接続されているデバイスの一覧と、各デバイスのキーボードマップが作成済みかどうかが表示されます。無効なキーボードを削除するには、「Delete Keyboard」 ボタンを使用します。
-
保存済みキーマップオプションを有効にした状態で再接続すると、新しいSafariマップが作成されます。
警告: この接続は、キーボードマッピングの処理中に画面の向きを強制的に変更します。この手順は内蔵ジャイロスコープを作動させるため、デバイスを手動で回転させても画面の向きを変更できなくなります。この機能を再度有効にするには、デバイスをUSBに再接続し、保存済みキーボードを使用した再接続によるプログラムでの向き変更を避けてください。もう一つの方法として、画面の回転を完全に無効にすることもできます。
システムアラートの処理
システムアラート(ポップアップ)を処理するには、Mobile Alertコマンドを使用します。