Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

パート 2: Marionette を使って Firefox OS と基本的なやりとりをする

このページにスクリプトエラーがあります。サイト編集者によって解決されるまでの間は、以下の部分的な内容のみが表示可能です。

{{ FirefoxOSSidebar }}

チュートリアルのパート2では、Firefox OSのリモート制御を可能にするいくつかの簡単なMarionetteのコマンドを始めましょう。完全なテスト記述はカバーしていませんが、テストを書くときに使用する基本的なコードの特徴を教えてくれます。パート3では、このコードを実際のテストに進化させるように進行します。

Firefox OSをスタートアップ

これらのテストを書くとき、Firefox OSをすでに実行し、コマンドを受信する準備をしている必要があります:

  1. デスクトップB2Gを起動します
  2. Settings App > Screen lock > uncheck Lock screenを使用して、ロックスクリーンを無効にします。
  3. Settings App > Display > Screen timeout の設定を never に変更することによって、画面のタイムアウト/スリープモードを無効にします
  4. 我々のテストコマンドを待つために、横側にウィンドウを移動させます

Marionetteを発射

今、Pythonコンソールを起動します: 単にターミナルウィンドウに移動して、pythonコマンドを発行します。

ここからは、Firefox OSの内部のMarionetteのサーバにコマンドを送信することができます。以下のコマンドの多くを発行した後、あなたは、Firefox OSの応答が表示されるはずです。Pythonのコンソールでは、必要なコードを含むMarionetteライブラリをインポートするために、次のコマンドを入力します:

from marionette import Marionette

今、Marionetteがクライアントからのコマンドを受信する準備をするような、Marionetteセッションを開始するよう、次の2行を実行してください。:

marionette = Marionette()
marionette.start_session()

上述したように、ロック画面を無効にしなかった場合は、このコマンドを使用して、プログラムで画面のロックを解除できます:

marionette.execute_script('window.wrappedJSObject.lockScreen.unlock();')

FirefoxのOS内部の別のフレームへのアクセス

FirefoxのOSでのWebアプリは、色々なiFrameで動作します。別々のフレームにてWebアプリを実行すると、それらにセキュリティのための別個のコンテナと、(Windowのような)視覚管理も提供します。これはアプリが実行されるサンドボックスであるように考えることができます。Marionetteは、一度にフレームの1つで動作することができます。Marionetteを、対話をしようとしているフレームに切り替える必要があります。

トップフレームはまた、System アプリです。すべてのアプリケーションとそれらのフレームは、System アプリの子です。新しいMarionette セッションはSystem のフレームで起動しますが、テストを開始するために、ホーム画面を見つけてそこに切り替える必要があります

iFrameを見つけるために、何とかしてそれを識別する必要があります。Marionette がwebdriverのAPIに基づいているため、要素を見つけるために同じ戦略を使用していますので、webdriverがウェブ要素を識別するのに使用する戦略のいずれかを、簡単に使用することができます。element location strategiesで詳細をご覧ください。

このケースでは、ホームスクリーンのiFrameを選択するために、CSSセレクタdiv.homescreen iframe を使用します。つまりfind_element()関数は、その2番目の引数としてこれを取り、検索を実行するのにどの選択機構を使うかを決める第1引数を取ります。変数にこの結果を格納し、これを引数としてswitch_to_frame()関数を実行します。ここで、以下の2つのコマンドを試してみてください:

# Switch context to the homescreen iframe and tap on the Contacts app icon
home_frame = marionette.find_element('css selector', 'div.homescreen iframe')
marionette.switch_to_frame(home_frame)

注意: さらに読んでおくのや、フレーム切り替えを説明する図は, Working with iFramesをご覧ください。

アプリケーションの開始

OKです。今、アイコンを確認できるホームスクリーンアプリにいて、tap()関数とfind_element()関数をの組み合わせて使用し、そのアイコンをタップすることができます。

contacts_icon = marionette.find_element('xpath', "//div[@class='icon']//span[contains(text(),'Contacts')]")
contacts_icon.tap()

すべてがうまく行っている場合、ここで連絡先アプリを開いて見えるようにする必要がありますが、前にホームスクリーンで行ったように、対話するためには、まだ連絡先アプリのフレームに切り替える必要があります。:

# First, we need to switch context back to the System frame
marionette.switch_to_frame()
 
# Now, switch context to the contacts app frame
contacts_frame = marionette.find_element('css selector', "iframe[data-url*='contacts']")
marionette.switch_to_frame(contacts_frame)

フレーム切り替えはTrueを返すべきです。これができた場合、素晴らしい。これは連絡先アプリのコンテキスト内に入っていて、これを使用し始める準備ができていることを意味します。

アプリを操作する

次のステップでは、典型的なテストのタスクを実行します — 、新しい連絡先を作成し、それに名前を入力し、それを保存します。最初に、追加の連絡先ボタンをタップします:

# Tap [+] to add a new Contact
marionette.find_element('id', 'add-contact-button').tap()

今度は、次の2つのコマンドを使用して連絡先の名前を追加してみましょう(send_keys()は要素に値を挿入するために使用されます):

marionette.find_element('id', 'givenName').send_keys('Foo')
# Add the contact's surname
marionette.find_element('id', 'familyName').send_keys('Bar')

今、連絡先を保存するためにDoneボタンをタップしましょう:

marionette.find_element('id', 'save-button').tap()

今、連絡先アプリの内部に入力した新しい連絡先が表示されます。そうなっていれば、素晴らしいです!

注意: そうなっていない場合、連絡先アプリをリセットか停止して、Firefox OSでホームスクリーンの裏にナビゲートし、タスクを再実行してみてください。

Marionetteセッションを閉じます

最後に、次のコマンドを発行して、Marionetteセッションを終了する必要があります:

marionette.delete_session()

これはかなりうまくいきましたが、テストを実行しようとするたびにPythonのコンソールに入力を始めることはできません。第3部では、テストを実行するたびに再利用できるように、Pythonのファイル内にこのスクリプトをコンパイルします。我々はテストに合格したか失敗したかを区別できるように、アサーションも追加します。

注意: Marionetteコマンドを記述する場合、必要となるロケータを把握するには、アプリの基本的なHTML構造にアクセスすることが極めて重要であるということが、確実にわかるでしょう。Part 7: Writing your own testsでは、これについて役立つ有用なリソースを提供しています。

 

ドキュメントのタグと貢献者

 このページの貢献者: hamasaki, Uemmra3, shide55
 最終更新者: hamasaki,