2013-04-07 6 views
6

में काम नहीं करता है क्या कोई एंड्रॉइड UITesting फ्रेमवर्क UIAutomator का प्रयास करता है? जब मैं कक्षा UiScrollabl "का उपयोग एक स्क्रॉल वस्तु में कुछ वस्तुओं को खोजने के लिए, यह वस्तु नहीं मिल सकता है अगर स्क्रॉल वस्तु की लंबाई, (दो बार स्वाइप करना होगा यह पता लगाने के लिए) बहुत लंबा है की तरह "डेवलपर विकल्प" "सेटिंग" अनुप्रयोग में। किसी को भी एक ही मुद्दा है?UiScrollable Android uiautomator

उत्तर

3

आप प्रदान कर सकते हैं एडीटी के संस्करण आप?

  • कौन सा संस्करण उपयोग कर रहे हैं कुछ और जानकारी जैसे

    • को खुश एंड्रॉइड के परीक्षण चल रहे हैं/चालू हैं ?

    कारण मैं इन प्रश्नों से पूछता हूं क्योंकि यूआईयूयूटोमेटर के साथ कुछ संस्करण-विशिष्ट समस्याएं हैं। उदाहरण के लिए मैंने एंड्रॉइड के 4.2.2 के साथ डिवाइस पर चलने वाली स्क्रॉलिंग समस्या की खोज की जो आपके द्वारा उल्लिखित जैसा लगता है। मैंने एक वर्कअराउंड कोड किया जहां मेरा कोड स्क्रॉलिंग करता है यदि मानक एंड्रॉइड विधि उस तत्व को नहीं ढूंढती है जो मुझे उपलब्ध होने की उम्मीद है।

    मैं यहां अपने कोड का सार reproduced है, तो आप पर 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."); 
          } 
         } 
    

    नोट पूर्ण उदाहरण मिल जाएगा: मैं के बाद से मैं नहीं करता है, तो इस कोड को अपनी समस्या का समाधान होगा पता नहीं है अपने ऐप का एक उदाहरण है। यदि आप अपने परीक्षण और प्रासंगिक यूआई के एक्सएमएल लेआउट को पोस्ट करने में सक्षम हैं तो इससे समस्या का निदान करना आसान हो जाएगा।

  • +0

    आप नीचे दिए गए फिक्स में दिलचस्पी ले सकते हैं, अपरिवर्तनीय वर्ग को ओवरराइड कर सकते हैं, क्योंकि यह एक से अधिक स्थानों पर इस मुद्दे को ठीक करेगा। – newfivefour

    +0

    यह उत्तर मेरे लिए काम किया ... नीचे दिए गए फिक्स –

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

    सुनिश्चित नहीं है कि यह आपकी मदद कर सकता है लेकिन यह मेरे ऐप में है। पहली पंक्ति इसे तब तक स्क्रॉल करना है जब तक कि यह btn_1 नहीं पाता, फिर यदि यह ऑब्जेक्ट पाता है, तो यह उस पर एक क्लिक करेगा।

    8

    मैंने UiScrollable कक्षा को ओवरराइड करके इसे ठीक कर दिया है। UiScrollable.java (जो कुछ बिंदु पर पुरानी हो सकती है, सावधान रहना) और बस if(!scrollForward() && x!=0) लाइन बदल:

    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; 
        }  
    
    } 
    

    मैं से स्रोत कॉपी किया है।

    मेरे अवलोकनों से, Google के UI परीक्षण पृष्ठ पर उदाहरण कोड के मामले में सेटिंग ऐप के लिए ऐप्स स्क्रीन स्क्रॉल करता है, scrollForwards() विधि पहले प्रयास पर विफल हो जाती है। भगवान जानता है क्यों।

    उपरोक्त बस कहता है कि यह पहली स्क्रॉल पर विफल रहता है, परवाह किए बिना। यदि यह दूसरी स्क्रॉल पर स्क्रॉल करने में विफल रहता है, तो यह वास्तव में विफलता देता है।

    1

    मैं आमतौर पर UiDevice के drag() के साथ Scrollable के तरीकों के मुकाबले अधिक भाग्यशाली हूं।

    +0

    महान सलाह नहीं थी! मुझे स्क्रॉल करने योग्य तत्वों को ओवरलैप करने में परेशानी हो रही थी, और ड्रैग इसके लिए एकमात्र समाधान था। – Phil

    4

    स्क्रॉलिंग आवश्यक होने पर एक दृश्य में कोई तत्व ढूंढने के लिए और मैंने नीचे उल्लिखित विधि का उपयोग किया और ऐसा लगता है कि यह ठीक काम करता है।

    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

    अजीब ... इस विधि ने मेरे लिए काम नहीं किया है ... यह getChildByText जैसा ही व्यवहार करता है ... यह लगभग 67 तत्वों –

    +0

    पर स्क्रॉलिंग रोकता है। यह उम्मीद के रूप में काम करता है। – wojciii

    1

    मैं भी getChildByText को केवल एक बार स्क्रॉल करता हूं, और मैं इसे खोजने का प्रयास करता हूं। मुझे लगता है कि रूट कारण सिस्टम से हो सकता है।

    जब आप getChildByText कहते हैं, उसके प्रवाह है:

    getChildByText -> scrollIntoView -> scrollForward -> scrollSwipe 
    

    scrollSwipe में, सिस्टम कड़ी चोट आदेश चला जाएगा, रुको, की तुलना में सभी AccessibilityEvent खोजने के लिए और वर्तमान स्क्रीन में AccessibilityEvent.TYPE_VIEW_SCROLLED फ़िल्टर करें। यह चरण फिर से UiScrollable स्क्रॉल बनाते हैं या अंत में इसे जांचते हैं।

    लेकिन बग यहां है, सिस्टम 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; 
        } 
        ... 
        .. 
        . 
    } 
    

    मुझे लगता है कि सबसे अच्छा तरीका कोड ओवरराइड करना और उपयुक्त MaxSearchSwipes को परिभाषित है, और अगर आइटम इस आकार खत्म हो गया है, परीक्षण विफल करने के है।

    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; 
    } 
    
    }