Espresso-Web は、Android WebView UI コンポーネントを操作するためのエントリ ポイントです。 広く利用されている WebDriver API から Atom を再利用し、WebView の動作の確認や制御が行えます。
Espresso-Web を使用するケース
Espresso-Web を使用して、ハイブリッド アプリ(特に
アプリのネイティブ UI コンポーネントを WebView
に置き換える
UI コンポーネントEspresso-Web API は、他の Google Cloud サービスと
WebView
オブジェクト内のウェブ要素を完全に操作するための Espresso API。
WebView
自体だけをテストし、
アプリの WebView
とネイティブ コンポーネントの間のインタラクションについては、
WebDriver などのフレームワークを使用して一般的なウェブテストを作成する。ウェブテスト フレームワークを使用する場合、
テストを実行するために、Android デバイスまたは Java 仮想マシン
より高速かつ確実に実行できますただし、Espresso-Web を使用すると
カスタムの WebDriver atom を使用できるため、
スタンドアロンのウェブアプリと
ウェブアプリの両方で実行できるテストを
Android UI を含むアプリ。
仕組み
Espresso の onData()
と同様
メソッドの場合、WebView
インタラクションは複数の Atom で構成されます。
WebView
インタラクションでは、Java プログラミング言語と
使用します。新しい P-MAX キャンペーンを
JavaScript 環境からのデータ公開によって競合状態を
Espresso から見た Java ベースのサイドは分離されたコピーで、
Web.WebInteraction
完全にサポートされているため、インスタンスから返されたすべてのデータ、
できます。
WebDriver Atom とは
WebDriver フレームワークは Atoms を使用してウェブ要素を検出、操作
できます。WebDriver でのブラウザ操作は Atom を通じて実現しており、「
概念的には、Atom は
ViewAction
: 自己完結型の
UI でアクションを実行するユニットです。Atoms を公開するには、
findElement()
や getElement()
などの定義済みのメソッドを使用して、
おすすめします。ただし、WebDriver を使用して
直接やり取りするには、Atoms を適切にオーケストレートする必要があり、
非常に冗長です。
Espresso 内のクラス Web
および Web.WebInteraction
このボイラープレートをラップして、WebView を Espresso のように操作できるようにする
説明します。そのため、WebView
のコンテキストでは、Atom は
従来の Espresso ViewMatchers
および ViewActions
に代わるものです。
API の表記は、次のように非常にシンプルです。
Kotlin
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion)
Java
onWebView() .withElement(Atom) .perform(Atom) .check(WebAssertion);
詳細については、Selenium の Atom に関するドキュメントをご覧ください。
WebView の実装
以下の各セクションのガイダンスに沿って操作してください。
アプリのテスト内の WebView
。
パッケージ
Espresso-Web をプロジェクトに含めるには、次の手順を行います。
- アプリの
build.gradle
ファイルを開きます。これは通常 トップレベルのbuild.gradle
ファイルとapp/build.gradle
。 依存関係内に次の行を追加します。
Groovy
androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
Espresso-Web は Espresso 2.2 以降にのみ対応しており、 バージョン 0.3 以降のテスト用ライブラリを 行も確認できます。
Groovy
androidTestImplementation 'androidx.test:runner:1.6.1' androidTestImplementation 'androidx.test:rules:1.6.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
Kotlin
androidTestImplementation('androidx.test:runner:1.6.1') androidTestImplementation('androidx.test:rules:1.6.1') androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')
API の一般的な使用方法
onWebView()
メソッドは、Android で WebView を使用する場合の主なエントリ ポイントです。
Espressoこのメソッドは、次のような Espresso-Web テストを実行するために使用します。
次のとおりです。
Kotlin
onWebView() .withElement(findElement(Locator.ID, "link_2")) // similar to onView(withId(...)) .perform(webClick()) // Similar to perform(click()) // Similar to check(matches(...)) .check(webMatches(getCurrentUrl(), containsString("navigation_2.html")))
Java
onWebView() .withElement(findElement(Locator.ID, "link_2")) // similar to onView(withId(...)) .perform(webClick()) // Similar to perform(click()) // Similar to check(matches(...)) .check(webMatches(getCurrentUrl(), containsString("navigation_2.html")));
この例では、Espresso-Web が ID が "link_2"
の DOM 要素を探し、
それをクリックします。次に、WebView が GET リクエストを送信することを確認します。
"navigation_2.html"
という文字列が含まれます。
JavaScript のサポート
テストを実行すると、システムはすべての WebView インタラクションを JavaScriptそのため、JavaScript の評価をサポートするために、テスト対象の WebView は JavaScript が有効になっている必要があります。
JavaScript を強制的に有効にするには、
forceJavascriptEnabled()
として
テストします。
追加します。
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule val activityScenarioRule = activityScenarioRule<MyWebViewActivity>() @Test fun testWebViewInteraction() { onWebView().forceJavascriptEnabled() } }
一般的なウェブ操作
Web.WebInteraction
オブジェクトを使用する一般的な操作には、次のようなものがあります。
-
withElement()
WebView 内の DOM 要素を参照します。例:
Kotlin
onWebView().withElement(findElement(Locator.ID, "teacher"))
Java
onWebView().withElement(findElement(Locator.ID, "teacher"));
-
<ph type="x-smartling-placeholder"></ph>
withContextualElement()
はスコープが設定された DOM 要素を参照しています 別の DOM 要素に対して相対的に決定されます。 まずwithElement()
で参照を確立するWeb.WebInteraction
オブジェクト(DOM 要素)。例:
Kotlin
.withElement(findElement(Locator.ID, "teacher")) .withContextualElement(findElement(Locator.ID, "person_name"))
Java
.withElement(findElement(Locator.ID, "teacher")) .withContextualElement(findElement(Locator.ID, "person_name"));
-
<ph type="x-smartling-placeholder"></ph>
check()
は条件を評価し、解決することを確認します 宛先:true
。例:
Kotlin
onWebView() .withElement(findElement(Locator.ID, "teacher")) .withContextualElement(findElement(Locator.ID, "person_name")) .check(webMatches(getText(), containsString("Socrates")))
Java
onWebView() .withElement(findElement(Locator.ID, "teacher")) .withContextualElement(findElement(Locator.ID, "person_name")) .check(webMatches(getText(), containsString("Socrates")));
-
<ph type="x-smartling-placeholder"></ph>
perform()
は、WebView 内で次のようなアクションを実行します。 要素をクリックするだけです例:
Kotlin
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick())
Java
onWebView() .withElement(findElement(Locator.ID, "teacher")) .perform(webClick());
-
reset()
WebView を初期状態に戻します。これは事前トレーニング済みの クリックなどのアクションによってナビゲーションが変化し、 ElementReference オブジェクトと WindowReference オブジェクトにアクセスできません。注:
reset()
を使用すると、 複数ページのワークフローに対するアサーションの作成 通常、テストの範囲を限定し、1 つのページに焦点を絞るべきです。例:
Kotlin
onWebView() .withElement(...) .perform(...) .reset()
Java
onWebView() .withElement(...) .perform(...) .reset();
例
次の例では、WebView にテキストを入力した後、 [Submit] ボタンを選択すると、同じテキストが 使用します。
Kotlin
const val MACCHIATO = "Macchiato" @RunWith(AndroidJUnit4::class) class MyEspressoWebTestSuite { @Test fun typeTextInInput_clickButton_SubmitsForm() { // Create an intent that displays a web form. val webFormIntent = Intent() // ... // Lazily launch the Activity with a custom start Intent per test. ActivityScenario.launchActivity(webFormIntent) // Selects the WebView in your layout. If you have multiple WebView // objects, you can also use a matcher to select a given WebView, // onWebView(withId(R.id.web_view)). onWebView() // Find the input element by ID. .withElement(findElement(Locator.ID, "text_input")) // Clear previous input and enter new text into the input element. .perform(clearElement()) .perform(DriverAtoms.webKeys(MACCHIATO)) // Find the "Submit" button and simulate a click using JavaScript. .withElement(findElement(Locator.ID, "submitBtn")) .perform(webClick()) // Find the response element by ID, and verify that it contains the // entered text. .withElement(findElement(Locator.ID, "response")) .check(webMatches(getText(), containsString(MACCHIATO))) } }
Java
public static final String MACCHIATO = "Macchiato"; @Test public void typeTextInInput_clickButton_SubmitsForm() { // Create an intent that displays a web form. Intent webFormIntent = new Intent(); // ... // Lazily launch the Activity with a custom start Intent per test. ActivityScenario.launchActivity(webFormIntent); // Selects the WebView in your layout. If you have multiple WebView objects, // you can also use a matcher to select a given WebView, // onWebView(withId(R.id.web_view)). onWebView() // Find the input element by ID. .withElement(findElement(Locator.ID, "text_input")) // Clear previous input and enter new text into the input element. .perform(clearElement()) .perform(DriverAtoms.webKeys(MACCHIATO)) // Find the "Submit" button and simulate a click using JavaScript. .withElement(findElement(Locator.ID, "submitBtn")) .perform(webClick()) // Find the response element by ID, and verify that it contains the // entered text. .withElement(findElement(Locator.ID, "response")) .check(webMatches(getText(), containsString(MACCHIATO))); }
参考情報
Android テストで Espresso-Web を使用する方法について詳しくは、 ご覧ください
サンプル
- WebBasicSample
Espresso-Web を使用して
WebView
オブジェクトを操作します。