2013-02-27 21 views
8

Tôi đã cố gắng thử nghiệm một Android Webview bằng cách sử dụng Android UiAutomator. Như tôi đã hiểu được documentation, di chuyển qua một WebvView sẽ tạo ra sự kiện UI traversal, và những người cần được đọc qua getUiDevice().getLastTraversedText().UiAutomator getLastTraversedText()

Tuy nhiên, khi tôi sử dụng getUiDevice().pressDPadDown() để di chuyển qua một cái nhìn web, getUiDevice().getLastTraversedText() tiếp tục trở về null.

Tôi đã bỏ lỡ điều gì?

Nếu có ai đó nhận được cuộc gọi này để làm việc, tôi sẽ đánh giá cao rất nhiều mẫu mã ngắn.

Trả lời

4

Tin xấu: Tôi đã dành nhiều giờ cố gắng tìm hiểu cách thực hiện công việc này, tuy nhiên tôi chưa nhận được bất kỳ điều gì khác ngoài giá trị null để trả lời các cuộc gọi đến getUiDevice().getLastTraversedText().

FYI đây là những điều tôi đã cố gắng và phát hiện ra:

  • chạy uiautomator events trong một adb shell nên đổ tất cả các sự kiện tiếp cận. Nó chắc chắn báo cáo các sự kiện khác nhau, tuy nhiên nó hầu như im lặng khi tôi tự cuộn qua các nội dung của một WebView. Nếu nội dung trong WebView được cuộn, ví dụ: sau khi điều hướng lên hoặc xuống vượt quá những gì đang hiển thị trên màn hình tôi nhận được các loại sau đây của sự kiện báo cáo:

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

  • Nếu tôi cho phép Khám phá-by-touch thiết lập sau đó tôi không thể sử dụng uiautomator trong khả năng tiếp cận adb shell. Mỗi lần tôi chạy lệnh uiautomator, tôi nhận được phản hồi của Killed. Tôi đã sử dụng Explore-By-Touch để nói văn bản được hiển thị. Mặc dù tôi không thể điều hướng đến tất cả các liên kết đã bật Khám phá bằng cách chạm (hoặc khi sử dụng D-Pad ảo điên cuồng là một phần của Suite trợ năng Android), nó đã đọc LinkText cho một số liên kết (ví dụ: nó bỏ qua các ký tự tiếng Nhật trên trang tôi đã sử dụng để thử nghiệm http://pickalize.info/)

  • Nếu tôi chạy một tập lệnh tương tự như của bạn (cho ứng dụng WebView đơn giản mà tôi tạo cho mục đích) thì tôi có thể thấy giao diện người dùng trong WebView làm nổi bật các yếu tố khác nhau, trong trường hợp của tôi liên kết web từ trang web sau tôi đã điều tra vì các lý do khác tại thời điểm http://pickalize.info/ Nền của liên kết hiện được chọn chuyển sang màu xanh nhạt, tuy nhiên không có văn bản nào được trả lại bằng cách gọi tới số getUiDevice().getLastTraversedText()

Dự đoán tốt nhất của tôi là chúng tôi đang cố gắng sử dụng phương pháp này một cách không thích hợp. Có lẽ chúng ta đang phải yêu cầu và phân tích cú pháp DOM của WebView (tốt lành biết cách), nhưng nhìn thấy những nhận xét sau đây từ tài liệu của 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.

BTW: Tôi đang thử nghiệm với Android 4.2 .2 trên các thiết bị vật lý.

Chúc bạn may mắn với các điều tra của mình. Tôi sẽ tiếp tục xem xét vấn đề theo thời gian để giúp tôi tìm hiểu thêm về sự phù hợp và khả năng của Máy tự động Ui.

Cập nhật (26 tháng 3 năm 2013): Tôi đã kiểm tra lại với 'Tăng cường khả năng truy cập web' được đặt thành 'Được phép' trong menu Cài đặt trợ năng của thiết bị.Tôi vẫn nhận được null được trả về bởi getLastTraversedText()

Đây là ruột mã thử nghiệm của tôi:

public class WebViewNavigator kéo dài 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()"); 
     } 
    } 
} 

}

Và đây là lệnh adb tôi sử dụng để xem các thông báo khi mã này được thực hiện trên thiết bị Android: adb logcat WebViewNavigatorTest:I *:S

Theo sau bởi đầu ra:

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() 
+0

Cảm ơn bạn đã trả lời! Tôi cũng không nhận được nhiều hơn thế. Tôi thấy nó đặc biệt khó hiểu khi TalkBack có thể đọc nội dung của WebView .. Tôi cũng sẽ thêm bất kỳ phát hiện bổ sung nào tại đây. – Micha

+0

Như một suy nghĩ, có lẽ chúng ta cần phải cài đặt các tập lệnh web mà talkback sử dụng để tăng cường khả năng đọc nội dung từ trình duyệt web? – JulianHarty

+0

Đối với các bản ghi, không cải tiến trên Android 4.3. – Micha