2013-04-07 51 views
6

Có ai thử khung hình UITesting android UIAutomator không? Khi tôi sử dụng lớp UiScrollabl "để tìm một số đối tượng trong đối tượng có thể cuộn, đối tượng đó không thể tìm thấy đối tượng nếu độ dài của đối tượng cuộn được quá dài (cần vuốt hai lần để tìm đối tượng), như "tùy chọn nhà phát triển" trong "Settings" ứng dụng. có ai có cùng một vấn đề?UiScrollable không hoạt động trên Android uiautomator

Trả lời

3

bạn có thể cung cấp một số chi tiết xin vui lòng ví dụ

  • phiên bản nào của adt bạn đang sử dụng?
  • phiên bản nào của Android là các thử nghiệm đang được chạy vào/bật ?

Lý do tôi hỏi những câu hỏi này là do có một số vấn đề về phiên bản cụ thể với UIAutomator. Ví dụ, tôi phát hiện ra một vấn đề di chuyển chạy trên các thiết bị với 4.2.2 của Android mà có vẻ tương tự như một trong những bạn đã đề cập. Tôi mã hóa một workaround nơi mã của tôi không di chuyển nếu phương pháp Android tiêu chuẩn dường như không tìm thấy yếu tố tôi mong đợi để có sẵn.

Tôi đã sao chép bản chất của mã của tôi ở đây, bạn sẽ tìm thấy những ví dụ hoàn chỉnh tại http://blog.bettersoftwaretesting.com/?p=84

 // The following loop is to workaround a bug in Android 4.2.2 which 
     // fails to scroll more than once into view. 
     for (int i = 0; i < maxSearchSwipes; i++) { 

      try { 
       appToLaunch = appViews.getChildByText(selector, nameOfAppToLaunch); 
       if (appToLaunch != null) { 
        // Create a UiSelector to find the Settings app and simulate  
        // a user click to launch the app. 
        appToLaunch.clickAndWaitForNewWindow(); 
        break; 
       } 
      } catch (UiObjectNotFoundException e) { 
       System.out.println("Did not find match for " + e.getLocalizedMessage()); 
      } 

      for (int j = 0; j < i; j++) { 
       appViews.scrollForward(); 
       System.out.println("scrolling forward 1 page of apps."); 
      } 
     } 

Lưu ý: Tôi không biết nếu mã này sẽ giải quyết vấn đề của bạn kể từ khi tôi làm không có một ví dụ về ứng dụng của bạn. Nếu bạn có thể đăng bài kiểm tra của mình và bố cục XML của giao diện người dùng có liên quan, nó sẽ giúp chẩn đoán sự cố dễ dàng hơn.

+0

Bạn có thể quan tâm đến việc khắc phục bên dưới, ghi đè lớp không thể kiểm soát được vì nó sẽ khắc phục sự cố ở nhiều nơi. – newfivefour

+0

câu trả lời này phù hợp với tôi ... bản sửa lỗi bên dưới không phải là –

0
scrollableObject.scrollIntoView(btn_1); 
try {if(scrollableObject.scrollIntoView(btn_1)) 
    btn_1.click(); 
} 
catch (UiObjectNotFoundException e){ 
System.out.print("error1: "+e); 
} 

không chắc chắn nếu điều này có thể giúp bạn nhưng đây là những gì tôi làm trong ứng dụng của mình. Dòng đầu tiên là làm cho nó cuộn cho đến khi nó tìm thấy btn_1, sau đó nếu nó tìm thấy đối tượng, nó sẽ thực hiện một cú nhấp chuột vào nó.

8

Tôi đã sửa nó bằng cách ghi đè lên lớp UiScrollable.

public class UiScrollable extends com.android.uiautomator.core.UiScrollable { 

    public UiScrollable(UiSelector container) { 
     super(container); 
    } 

    @Override 
    public boolean scrollIntoView(UiSelector selector) throws UiObjectNotFoundException { 
     if (exists(getSelector().childSelector(selector))) { 
      return (true); 
     } else { 
      System.out.println("It doesn't exist on this page"); 
      // we will need to reset the search from the beginning to start search 
      scrollToBeginning(getMaxSearchSwipes()); 
      if (exists(getSelector().childSelector(selector))) { 
       return (true); 
      } 
      for (int x = 0; x < getMaxSearchSwipes(); x++) { 
       System.out.println("I'm going forward a page: " + x); 
       if(!scrollForward() && x!=0) { // x!=0 is the hack 
        return false; 
       } 

       if(exists(getSelector().childSelector(selector))) { 
        return true; 
       } 
      } 
     } 
     return false; 
    }  

} 

tôi đã sao chép mã nguồn từ: UiScrollable.java (có thể bị lỗi thời tại một số điểm, hãy cẩn thận) và chỉ đơn giản là thay đổi dòng if(!scrollForward() && x!=0).

Từ quan sát của tôi, trong trường hợp mã ví dụ trên trang kiểm tra ui của Google cuộn màn hình ứng dụng cho ứng dụng cài đặt, phương pháp scrollForwards() không thành công trong lần thử đầu tiên. Chúa biết tại sao.

Ở trên chỉ đơn giản là nói nếu nó không thành công trên cuộn đầu tiên, hãy tiếp tục bất kể. Nếu nó không di chuyển trên cuộn thứ hai, thì thực tế nó sẽ trả về một lỗi.

1

Tôi nói chung có nhiều may mắn hơn với UiDevice 's drag() so với phương pháp của Scrollable.

+0

Lời khuyên tuyệt vời! Tôi đã gặp sự cố với các phần tử cuộn có thể chồng chéo và kéo là giải pháp duy nhất cho nó. – Phil

4

Để tìm và bất kỳ phần tử nào trong chế độ xem trong đó cuộn là bắt buộc, tôi đã sử dụng phương pháp được đề cập bên dưới và có vẻ như hoạt động tốt.

public void searchForText(String searchText) 
      throws UiObjectNotFoundException { 
     UiScrollable textScroll = null; 
     UiObject text = null; 
     if (searchText != null) { 
      textScroll = new UiScrollable(new UiSelector().scrollable(true)); 
      textScroll.scrollIntoView(new UiSelector().text(searchText)); 
      text = new UiObject(new UiSelector().text(searchText)); 
      text.click(); 
     } 
    } 
+0

Weird ... phương pháp này didnt làm việc cho tôi hoặc là ... nó cư xử theo cùng một cách như getChildByText ... nó dừng di chuyển ở khoảng 67 yếu tố –

+0

Cảm ơn. Điều này hoạt động như mong đợi. – wojciii

1

Tôi cũng đáp ứng getChildByText chỉ cuộn một lần và cố gắng theo dõi nó. Tôi thấy nguyên nhân gốc rễ có thể là từ hệ thống.

Khi bạn gọi getChildByText, dòng chảy của nó là:

getChildByText -> scrollIntoView -> scrollForward -> scrollSwipe 

Trong scrollSwipe, hệ thống sẽ chạy lệnh swipe, chờ đợi, hơn tất cả AccessibilityEvent và lọc AccessibilityEvent.TYPE_VIEW_SCROLLED trong màn hình hiện tại. Bước này làm cho cuộn UiScrollable trở lại hoặc kiểm tra nó ở cuối.

Nhưng lỗi ở đây, hệ thống không thể trả về ngay AccessibilityEvent.

public boolean scrollSwipe(final int downX, final int downY, final int upX, final int upY, 
     final int steps) { 

    Runnable command = new Runnable() { 
     @Override 
     public void run() { 
      swipe(downX, downY, upX, upY, steps); 
     } 
    }; 

    // Collect all accessibility events generated during the swipe command and get the 
    // last event 
    ArrayList<AccessibilityEvent> events = new ArrayList<AccessibilityEvent>(); 

    runAndWaitForEvents(command, 
      new EventCollectingPredicate(AccessibilityEvent.TYPE_VIEW_SCROLLED, events), 
      Configurator.getInstance().getScrollAcknowledgmentTimeout()); 

    //**Root cause** 
    //Some times the events list size will be 0 , 
    //but in fact it can scroll again. 
    Log.e(LOG_TAG,"events size = " + events.size()); 

    AccessibilityEvent event = getLastMatchingEvent(events, 
      AccessibilityEvent.TYPE_VIEW_SCROLLED); 

    if (event == null) { 
     // end of scroll since no new scroll events received 
     recycleAccessibilityEvents(events); 
     return false; 
    } 
    ... 
    .. 
    . 
} 

Tôi nghĩ rằng cách tốt nhất là Trọng mã và xác định phù hợp MaxSearchSwipes, và nếu mục đã qua kích thước này, hãy kiểm tra thất bại.

public class UiScrollableFix extends UiScrollable { 

public UiScrollableFix(UiSelector container) { 
    super(container); 
} 

@Override 
public boolean scrollIntoView(UiSelector selector) throws UiObjectNotFoundException { 
    Tracer.trace(selector); 
    // if we happen to be on top of the text we want then return here 
    UiSelector childSelector = getSelector().childSelector(selector); 
    if (exists(childSelector)) { 
     return (true); 
    } else { 
     // we will need to reset the search from the beginning to start search 
     scrollToBeginning(getMaxSearchSwipes()); 
     if (exists(childSelector)) { 
      return (true); 
     } 

     for (int x = 0; x < getMaxSearchSwipes(); x++) { 
      Log.e("test", "x=" + x); 
      boolean scrolled = scrollForward(); 
      if (exists(childSelector)) { 
       return true; 
      } 
      //For avoiding the scroll fail. 
      // if (!scrolled && x!=0) { 
      //  return false; 
      // } 

     } 
    } 
    return false; 
} 

} 
Các vấn đề liên quan