概要

これまでのドキュメントに従って、モバイルテストの要件を設定し、Wikipedia アプリを使用した最初のサンプルテストを実行したと仮定します。そうでない場合は、インストールガイドを参照してください。

では、独自のテストを作成しましょう。

Nightwatch は、ネイティブモバイルアプリのテストを自動化するネイティブコマンドを備えています。内部的には、Nightwatch は Appium メソッドをラップして、ユーザーが Nightwatch の使いやすさと親しみやすさを享受できるようにします。すべてのコマンドとアサーションは、appグローバル変数で利用できます。要素を検査してセレクターを特定するには、Appium Inspector を使用できます。

Appium Inspector

Webブラウザのテストを作成する場合、ブラウザを開き、開発ツールを開き、要素を検査してセレクターを取得できます。ネイティブモバイルアプリの場合、同じ作業を行うために Appium インスペクターを使用します。Appium インスペクターをインストールしていない場合は、次のガイドを参照してください。

Appium インスペクターの起動方法

ステップ1

Appium Inspector を起動するには、検査する行に .debug() コマンドを追加します。

nightwatch/examples/mobile-app-tests/wikipedia-android.js
describe('Wikipedia Android app test', function() {
    before(function(app) {
        app.click('id', 'org.wikipedia:id/fragment_onboarding_skip_button');
    });
    
it('Search for BrowserStack', async function(app) { app .click('id', 'org.wikipedia:id/search_container') .sendKeys('id', 'org.wikipedia:id/search_src_text', 'browserstack') .debug() //Added debug command. The inspector will be at a state where previous step is executed .click({selector: 'org.wikipedia:id/page_list_item_title', locateStrategy: 'id', index: 0}) .waitUntil(async function() { // wait for webview context to be available const contexts = await this.appium.getContexts();
return contexts.includes('WEBVIEW_org.wikipedia'); }) .appium.setContext('WEBVIEW_org.wikipedia') .assert.textEquals('.pcs-edit-section-title', 'BrowserStack'); // command run in webview context }); });

ステップ2
デバッグコマンドを使用してテストを実行します。Nightwatch は新しいテストセッションを開始し、ステップを実行し、.debug() コマンドに到達すると実行を一時停止します。これで、Appium インスペクターアプリケーションを起動してテストセッションに接続できます。

ステップ3
Appium インスペクターでは、「セッションの接続」をクリックしてドロップダウンからセッションを選択することで、前のステップで開始されたセッションに接続できます。

ステップ4
セッションが接続されると、左側の要素をクリックして、下図のように右側のパネルでセレクターオプションを取得できます。

Selectors using Appium Inspector

.debug() ターミナルコンソールで最初に実行してからテストに追加することで、セレクターを使用してコマンド/アサーションをテストすることもできます。

セレクター

Web オートメーションのセレクターと同様に、アプリ関連の要素を見つけるにはセレクターが必要です。Appium は次のセレクター戦略をサポートしているため、Nightwatch もデフォルトでこれらのセレクターをすべてサポートします。

  • id
  • xpath

詳細な例はこちらにあります。

コマンド

ネイティブモバイルアプリのテスト用コマンドは、2つのカテゴリに分類できます。

  1. アプリ関連コマンドは、アプリとのやり取りに使用できます。
  2. デバイス関連コマンドは、デバイスとのやり取りに使用できます。
  • app.click('selector strategy','selector value')
  • app.sendKeys('selector strategy','selector value','value to type')
  • app.clearValue('selector strategy','selector value')
  • app.setValue('selector strategy','selector value')
  • app.appium.getContexts()
  • app.appium.getContext()
  • app.appium.setContext()
  • app.appium.startActivity([opts][4], callback)
  • app.appium.getCurrentActivity(callback) [コールバックはアクティビティ名を返します]
  • app.appium.getCurrentPackage(callback) [コールバックはパッケージ名を返します]
  • app.appium.getOrientation(callback) [コールバックは LANDSCAPE | POTRAIT を返します]
  • app.appium.setOrientation(orientation, callback) [コールバックは LANDSCAPE | POTRAIT を返します]
  • app.appium.getGeolocation(callback) [コールバックはジオロケーションを返します]
  • app.appium.setGeolocation({latitude, longitude, altitude}, callback)
  • app.appium.pressKeyCode([keycode][5], callback)
  • app.appium.longPressKeyCode([keycode][5], callback)
  • app.appium.hideKeyboard([callback])
  • app.appium.isKeyboardShown(callback) [コールバックはブール値を返します]

詳細な例はこちらにあります。

アサーション

最後に、テストを作成する目的は、アサーションを追加して、エンドツーエンドの機能フローを検証することです。ネイティブモバイルアプリのアサーションは、Webのアサーションと非常によく似ています。

アサートライブラリ

  • app.assert.textContains(selector,'text')
  • app.assert.textEquals(selector,'text')
  • app.assert.textMatches(selector, 'text')
  • app.assert.attributeContains(selector,'attribute','value')
  • app.assert.attributeEquals(selector,'attribute','value')
  • app.assert.attributeMatches(selector, 'attribute','value')
  • app.assert.selected(selector)
  • app.assert.enabled(selector)
  • app.assert.visible(selector)
  • app.assert.elementsCount(selector)
  • app.assert.elementPresent(selector)

Chai expect

さらに、Chaiスタイルのアサーションも使用できます。

例:

Chai 例外サンプル
app.appium.getCurrentActivity(function(activity) {
    expect(activity.value).to.equal('.page.PageActivity')
})

詳細な例はこちらにあります。

モバイルアプリのテスト記述の基本を理解したので、セレクター、コマンド、アサーションを詳細に理解しましょう。

セレクター
コマンド
アサーション