UiAutomator getLastTraversedText()

Я пытался протестировать Android Webview с помощью Android UiAutomator. Насколько я понимаю из документации, прокрутка WebvView создаст пользовательский интерфейс события обхода, и они должны быть доступны для чтения через getUiDevice().getLastTraversedText().

Однако, когда я использую getUiDevice().pressDPadDown() для прокрутки веб-представления, getUiDevice().getLastTraversedText() продолжает возвращать значение null.

Что я пропустил?

Если кто-то получил этот звонок на работу, я был бы очень признателен за краткий пример кода.


person Micha    schedule 27.02.2013    source источник


Ответы (1)


Плохая новость: я потратил несколько часов, пытаясь понять, как заставить это работать, однако я еще не получил ничего, кроме нуля, в ответ на вызовы 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

  • Если я включу параметр доступности «Изучение касанием», я не смогу использовать uiautomator в adb shell. Каждый раз, когда я запускаю команду uiautomator, я получаю ответ Killed. Я использовал Explore-By-Touch, чтобы произносить отображаемый текст. Хотя я не смог перейти ко всем ссылкам с включенной функцией Explore-By-Touch (или при использовании приводящего в бешенство виртуального D-Pad, который является частью Android Accessibility Suite), он прочитал LinkText для некоторых ссылок ( например, он пропустил японские символы на странице, которую я использовал для тестирования http://pickalize.info/ )

  • Если я запускаю сценарий, аналогичный вашему (для простого приложения WebView, которое я создал для этой цели), то я вижу, что пользовательский интерфейс в WebView выделяет различные элементы, в моем случае веб-ссылки со следующей веб-страницы, которую я исследовал по другим причинам в время http://pickalize.info/ Фон выбранной в данный момент ссылки становится бледно-голубым, однако текст не отображается. возвращается вызовом getUiDevice().getLastTraversedText()

Мое предположение состоит в том, что мы либо пытаемся использовать метод ненадлежащим образом. Возможно, мы должны запрашивать и анализировать DOM WebView (хорошо знает как), но см. следующий комментарий из документации 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.

Обновление (26 марта 2013 г.): я снова проверил, установив для параметра «Расширить доступность в Интернете» значение «Разрешено» в меню «Настройки специальных возможностей» устройства. Я все еще получаю ноль, возвращаемый getLastTraversedText()

Вот кишки моего тестового кода:

открытый класс WebViewNavigator расширяет 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()");
        }
    }   
}

}

А вот команда adb, которую я использую для просмотра сообщений, когда этот код выполняется на устройстве Android: 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()
person JulianHarty    schedule 10.03.2013
comment
Спасибо за ваш ответ! Я тоже дальше этого не продвинулся. Меня особенно озадачивает то, что TalkBack может читать содержимое WebView. Я также добавлю сюда любые дополнительные выводы. - person Micha; 20.03.2013
comment
Как мысль, возможно, нам нужно установить веб-скрипты, которые использует Talkback, чтобы улучшить его способность читать контент из веб-браузера? - person JulianHarty; 22.03.2013
comment
К слову, никаких улучшений на Android 4.3. - person Micha; 23.08.2013
comment
Начиная с Android 4.4, веб-представления можно анализировать с помощью стандартного подхода UiAutomator. Ура. - person Micha; 12.12.2013
comment
@Micha С Android 5.0 я все еще получаю (нулевой) результат для getLastTraversedText() в моем веб-просмотре. Это работает для вас? - person Tim Boland; 28.11.2014