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