このページにスクリプトエラーがあります。サイト編集者によって解決されるまでの間は、以下の部分的な内容のみが表示可能です。
{{ FirefoxOSSidebar }}
パート2とパート3では、動作するテストを理解しました。しかし、テストを実行する前にその状態をリセットしたい場合(例えば、開いているアプリケーションを停止する)、これを手動で行う必要があったでしょう。それは少し退屈なので、再び自動化する必要があります!この部分では、再利用できる独立したPythonのメソッドに少しのコードを発生せることによって、もっと自動化する方法を見ていきます。
自動的に状態をリセット
典型的なテストの実行開始時に、おそらくFirefox OSのロック画面を解除し、すべての実行中のアプリケーションを強制終了することを望みます。それでは、これを行う方法を見てみましょう。
ロック画面の解除
先に進む前に、まだ行っていない場合 Settings App > Screen lock > Lock screen で再びロック画面を有効にします。
ちょうどクラス内の場所で、あなたの test_add_contact.py
ファイルに次のPythonのメソッドを追加します。:
def unlock_screen(self): self.marionette.execute_script('window.wrappedJSObject.lockScreen.unlock();')
呼び出された時、このメソッドは現在のFirefox OSのロックを解除します。 今度は self.marionette.start_session()
行の下に、下記の行を追加することで、テスト内でこれを呼びましょう。:
# Unlock the screen self.unlock_screen()
開いているすべてのアプリケーションの停止
今、実行時に開いているすべてのアプリケーションを停止するために、私たちのコードにメソッドを追加します。これは下記のように見えます。:
def kill_all(self): self.marionette.switch_to_frame() self.marionette.execute_async_script(""" // Kills all running apps, except the homescreen. function killAll() { let manager = window.wrappedJSObject.appWindowManager; let apps = manager.getApps(); for (let id in apps) { let origin = apps[id].origin; if (origin.indexOf('verticalhome') == -1) { manager.kill(origin); } } }; killAll(); // return true so execute_async_script knows the script is complete marionetteScriptFinished(true); """)
直前のセクションで追加した unlock_screen
メソッドの直後にこれを追加します。
次に、テストの残りの部分と一緒にこれを実行するには、下記を追加します。つまり self.unlock_screen()
行の直後に追加します。:
# kill all open apps self.kill_all()
今、最後にテスト実行した後に連絡先アプリを開いたままにしておき、また再度テストを実行しようとする前にロック画面に戻してみてください。画面のロックが解除されることに加えて、テストが再実行される前に、開いている連絡先アプリが自動的に停止されます。だから、その状態は、今実行しているテストには影響しません。これは、テスト実行の長期間の信頼性のために重要です。
再び数回テストを実行し、すべて動作するのとFirefox OSが正しくリセットされているかどうかを確認します。
ダイナミックウェイト
パート3ではダイナミックウェイトの重要性を述べました。Marionetteには下記のような一般的な構文を使用した、WebDriver/Selenium2のようなウェイトがあります。:
from marionette_driver import Wait # Wait until element is displayed Wait(self.marionette).until(lambda m: m.find_element('id', 'element_id').is_displayed())
指定された要素が表示されるまで、このコードはウェイトします。この時点で、対話する準備が整ったと分かります。テストでこのコード構成を使用してみましょう。
まず第一に、既存のインポート行の直後に、ウェイトインポート行を含めます:
from marionette_driver import Wait
今、コンタクトフレームが表示されるまで待機する Wait()
メソッドで、連絡先アイコンをタップした後の2つ目の time.sleep(2)
関数(self.marionette.switch_to_frame()
行の直後)を、置き換えることができます。:
Wait(self.marionette).until(lambda m: m.find_element('css selector', "iframe[data-url*='contacts']").is_displayed())
新しい連絡先の作成を開始する + 記号をタップするとき、Add contact フォームが完全に表示されるまでスライドされるのを待ちたいです。Done (保存) ボタンは次にタップが必要となるもので、このため、継続する前に所定の位置にスライドされるのを待つでしょう。3つ目の time.sleep(2)
関数を、次の行で置き換えます。:
Wait(self.marionette).until(lambda m: m.find_element('id', 'save-button').location['y']== 0)
この例では、Done ボタンが画面の上部に到達するのを待ちます。アニメーション化されたときに、要素は複数のポイントに表示されます。しかし、その最終的な静止位置は、待つための最も安全なものです。
また、要素が表示され"ない"のを待つこともできます。Doneをタップした後で、残りのコードを実行する前に、同様な Wait()
メソッドにnotをつけて使用し、Doneボタンが隠されるのを待ちます。4つ目と最終の time.sleep(2)
関数を、下記で置換します。:
Wait(self.marionette).until(lambda m: not m.find_element('id', 'save-button').is_displayed())
テストがOKに動作している場合には、素晴らしいです!テストのモジュール性と信頼性を向上させました。パート5では、テストを実行するためのテストランナーの使い方ご紹介します。