次にサンプルで入ってるテストコードの中でいちばん何やってるかさっぱりわからない FindByTextTest を見てみます。これの難点は「そもそも何のテストをしてるのか挙動からは読み取れない」点なので各テストの解説から。
testFindByText_noResults
public void testFindByText_noResults()
メソッド名からだいたい察しがつきますが、planet というプルダウンメニューの中に「Earth」があること「Pluto」が無いこと、を確認しています。前者はまあわかるのですが、後者、
try { // Search for something that should not appear. Pluto is not a planet. driver.findElement(AndroidNativeBy.text("Pluto")); fail("Should have thrown a NoSuchElementException."); } catch (NoSuchElementException exception) { // Expected exception. }
無いこと、を確認するために findElement で例外を起こしてそれをcatchして次に進む感じになってます。少し冗長に感じますが、こういうお作法なのでしょうか。
testFindByText_resultFromSpinnerPopup
public void testFindByText_resultFromSpinnerPopup()
次これ。Spinnerからテキストを選んで、それが正しく選択されている事を確認します。ここで初見のclassが出てきます。
driver.findElement(AndroidNativeBy.text("Wolf 359")).click();
AndroidNativeBy 例によってまだドキュメントが無いので実装を確認すると、名前そのまんまにAndroidに特化した構造検索のメソッドをまとめるclassのようです。
assertEquals( "'Wolf 359' should appear in child TextView of the spinner control.", 1, starsSpinner.findElements(AndroidNativeBy.text("Wolf 359")).size());
ここで、AndroidNativeByによって返されるリストの大きさが1(=見つかった)であることを確認しています。
testFindByText_elementInitiallyInvisible
最初に表示されるplanetのプルダウンの初期値が”Neptune”で無いこと、さらに、プルダウンから”Neptune”を選んで正しくその値が表示されている事を確認しています。ここで謎なのが、
assertEquals("Element with text 'Neptune' should be invisible at first.", ImmutableList.of(), driver.findElements(AndroidNativeBy.text("Neptune")));
これ。ナゼ空のリストを使う必要があるのでしょう??既にどこかで検証用のリストを作っているのならともかく、その形跡はありません。
testFindByPartialText_multipleResultsFromSpinnerPopup
プルダウンメニューの中の要素が、ある部分テキストを持っていることを確認するテスト。ここでは、
assertEquals( "Should have found two planets with 'ar' in name: Earth and Mars.", 2, elementsWithArInText.size());
"ar" という部分文字列がプルダウンメニューの各要素にあるかどうかを確認しています。"Earth"と"Mars"は持ってるよね?的な。部分テキストの存在を確認するメソッドは先程のAndroidNativeByの中にあります。
注目すべきなのはやはりここ
// Ensure the new UI is focused by performing a UI operation driver.findElement(AndroidNativeBy.text("Choose a planet")) .sendKeys(AndroidKeys.DPAD_DOWN, AndroidKeys.DPAD_UP);
新しいUIになっても動くようにしてあるよ!だと思うのですが実装みると
DPAD_DOWN(Keys.ARROW_DOWN, KeyEvent.KEYCODE_DPAD_DOWN), DPAD_LEFT(Keys.ARROW_LEFT, KeyEvent.KEYCODE_DPAD_LEFT),
こうなってます。なるほど。直後のsendKeysも謎ですが、恐らくプルダウンメニューの”中身” の方にフォーカスを移しているものと思われます。
あとは、先程のassertEqualsの中でリストの要素が2であることを確認、ですね。
いくつか謎な点が残ってしまいましたが、もう少し落ち着いてまた読んでみようと思います。