8

Android UiAutomator を使用して Android Webview をテストしようとしていました。私がドキュメントを理解しているように、WebvView をスクロールすると UI トラバーサル イベントが生成され、それらは次の方法で読み取ることができます。getUiDevice().getLastTraversedText().

ただし、getUiDevice().pressDPadDown()Web ビューをスクロールするために使用すると、 getUiDevice().getLastTraversedText()null が返され続けます。

私は何を逃したのですか?

誰かがこの呼び出しを機能させた場合、短いコードサンプルをいただければ幸いです。

4

1 に答える 1

4

悪いニュース: これを機能させる方法を理解するために数時間を費やしましたが、への呼び出しに応答して null 以外のものをまだ取得していませんgetUiDevice().getLastTraversedText()

参考までに、私が試して発見したことは次のとおりです。

  • で実行uiautomator eventsすると、adb shellすべてのアクセシビリティ イベントがダンプされます。確かにさまざまなイベントが報告されますが、WebView のコンテンツを手動でスクロールすると、ほとんど無音になります。WebView のコンテンツがスクロールされた場合、たとえば、画面に表示されているものを超えて上下に移動した後、次のタイプのイベントが報告されます。

03-10 19:44:47.436 EventType: TYPE_VIEW_SCROLLED; EventTime: 911700; PackageName: com.example.simplewebview; MovementGranularity: 0; Action: 0 [ ClassName: android.webkit.WebView; Text: []; ContentDescription: null; ItemCount: -1; CurrentItemIndex: -1; IsEnabled: true; IsPassword: false; IsChecked: false; IsFullScreen: false; Scrollable: true; BeforeText: null; FromIndex: -1; ToIndex: -1; ScrollX: 0; ScrollY: 270; MaxScrollX: 0; MaxScrollY: 544; AddedCount: -1; RemovedCount: -1; ParcelableData: null ]; recordCount: 0

  • Explore-by-touch アクセシビリティ設定を有効にすると、 で uiautomator を使用できませんadb shell。uiautomator コマンドを実行するたびに、Killed. Explore-By-Touch を使用して、表示されているテキストを読み上げていました。Explore-By-Touch を有効にしてすべてのリンクに移動することはできませんでしたが (または、Android Accessibility Suite の一部である腹立たしい Virtual D-Pad を使用している場合)、一部のリンクの LinkText を読み上げました (たとえば、http://pickalize.info/のテストに使用していたページの日本語の文字をスキップしました)

  • あなたと同様のスクリプトを実行すると (目的のために作成した単純な WebView アプリ用に)、WebView の UI がさまざまな要素を強調表示するのを見ることができます。私の場合は、他の理由で調査していた次の Web ページからの Web リンクです。時間http://pickalize.info/現在選択されているリンクの背景が薄い青色になりますが、呼び出しによってテキストは返されませんgetUiDevice().getLastTraversedText()

私の最善の推測は、メソッドを不適切に使用しようとしているということです。おそらく、WebView の DOM をリクエストして解析することになっていますが (その方法はよくわかっています)、getLastTraversedText() のドキュメントから次のコメントを参照してください。

When the view control used can return a reference to is Document Object Model, it is recommended then to use the view's DOM instead.

ところで:物理デバイスで Android 4.2.2 をテストしています。

調査を頑張ってください。Ui Automator の適切性と機能についてさらに学ぶために、私は時々問題を調べ続けます。

更新 (2013 年 3 月 26 日): デバイスのアクセシビリティ設定メニューで [Web アクセシビリティの強化] を [許可] に設定して、再度テストしました。私はまだnullを返しますgetLastTraversedText()

これが私のテストコードの根性です:

public class WebViewNavigator extends UiAutomatorTestCase {

public void testNavigationDownGeneratesEventText() throws UiObjectNotFoundException {
    getUiDevice().pressHome();
    UiObject allAppsButton = new UiObject(new UiSelector().description("Apps"));
    allAppsButton.clickAndWaitForNewWindow();

    UiObject appsTab = new UiObject(new UiSelector().text("Apps"));
    appsTab.click();

    UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true));
    appViews.setAsHorizontalList();

    String nameOfAppToLaunch = "SimpleWebView";
    UiAutomatorHelpers.launchAppCalled(nameOfAppToLaunch);

    UiObject simpleWebViewValidation = new UiObject(new UiSelector().packageName("com.example.simplewebview"));
    assertTrue("The package name seems incorrect for the app we want to launch", simpleWebViewValidation.exists());
    simpleWebViewValidation.clickAndWaitForNewWindow();

    // Ok we should have started the app now... On to the test

    Log.i("WebViewNavigatorTest", "About to start navigating down the contents of the webview");
    int closeToInfinity = 10;
    for (int i = 0; i < closeToInfinity; i++) {
        boolean goneDown = getUiDevice().pressDPadDown();
        if (!goneDown) {
            break;
        }

        String lastTraversedText = getUiDevice().getLastTraversedText();
        if (lastTraversedText != null) {
            Log.i("WebViewNavigatorTest", lastTraversedText);
        } else {
            Log.w("WebViewNavigatorTest", "(null) returned for getLastTraversedText()");
        }
    }   
}

}

そして、このコードが Android デバイスで実行されたときにメッセージを表示するために使用する adb コマンドを次に示します。 adb logcat WebViewNavigatorTest:I *:S

出力が続きます。

I/WebViewNavigatorTest(29358): About to start navigating down the contents of the webview
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
W/WebViewNavigatorTest(29358): (null) returned for getLastTraversedText()
于 2013-03-10T19:57:39.630 に答える