2013-07-16 5 views
12

मैं एक ui तत्व के मूल दृश्य की पहचान करने की कोशिश कर रहा हूं ताकि मैं यूआई के माध्यम से स्वतंत्र रूप से नेविगेट कर सकूं।uiautomator का उपयोग करके मैं दृश्य के माता-पिता को कैसे प्राप्त कर सकता हूं?

उदाहरण के लिए, सेटिंग ऐप्स में, मैं पाठ "ब्लूटूथ" के साथ दृश्य पा सकते हैं:

UiObject btView = new UiObject(new UiSelector().text("Bluetooth")); 

अब, हिस्सा है जहाँ मैं अटक जाते हैं यह एक है: मैं दो स्तरों तक नेविगेट करना चाहते हैं और चालू/बंद बटन के लिए एक नई खोज शुरू करें जो ब्लूटूथ को सक्षम और अक्षम करता है।

नोट: यदि मैं नीचे दिए गए कोड का उपयोग करता हूं तो मैं बटन प्राप्त कर सकता हूं।

UiObject btButtonView = new UiObject(new UiSelector().className("android.widget.Switch").instance(1)); 

यह स्विच बटन के लिए खोज करता है और दूसरा मुठभेड़ देता है। मैं चाहता हूं कि खोज अधिक सटीक हो और रैखिक लेआउट में बटन ढूंढें जिसमें "ब्लूटूथ" टेक्स्ट शामिल है। > आप सीधे ब्लूटूथ के लिए खोज सकते हैं -

LinearLayout 
    LinearLayout 
     ImageView 
    RelativeLayout 
     TextView (with text = "Bluetooth") 
    Switch() 

उत्तर

14

आपको टेक्स्ट का उपयोग करके पहले दो स्तरों को UiObject खोजने की आवश्यकता है। यह UiCollection या UiScrollable में getChildByText() विधियों का उपयोग करके किया जा सकता है। फिर आप आसानी से स्विच पा सकते हैं। 'सेटिंग्स' के लिए यह कोड मेरे डिवाइस पर काम करता है:

UiScrollable settingsList = new UiScrollable(new UiSelector().scrollable(true)); 
UiObject btItem = settingsList.getChildByText(new UiSelector().className(LinearLayout.class.getName()),"Bluetooth", true); 

UiObject btSwitch = btItem.getChild(new UiSelector().className(android.widget.Switch.class.getName())); 
btSwitch.click(); 
+1

यह विधि या तो काम नहीं करती है। UiObject दो स्तर ऊपर एक LinearLayout है, लेकिन इसमें टेक्स्ट विशेषता नहीं है। इसलिए मैं इसे "ब्लूटूथ" टेक्स्ट से नहीं पहचान सकता। ऐप के वास्तविक लेआउट के साथ प्रश्न अपडेट किया गया। –

+1

यह काम करता है। आप LinearLayout के पाठ से पहचान नहीं करते हैं। "यह बच्चे से मिलने वाले किसी भी बच्चे की तलाश करता है, जिसमें मानक उप तर्क है जिसमें बच्चे के यूआई तत्व को अपने उप पदानुक्रम के भीतर कहीं भी टेक्स्ट टेक्स्ट के बराबर टेक्स्ट विशेषता है।" दूसरे शब्दों में, आप एक लीनियरलाउट की तलाश करते हैं जिसमें टेक्स्ट ब्लूटूथ वाला बच्चा होता है। – Anders

+0

हां, यह काम करता है। ऐसा लगता है कि मैंने पहली बार कुछ गलत किया था। –

0

तुम सिर्फ चालू/बंद स्लाइडर के लिए खोज करना चाहते हैं:

अद्यतन: इस सेटिंग एप्लिकेशन के लेआउट (ब्लूटूथ बात यह है कि मैं जरूरत है) है बंद करें/चालू करें और ब्लूटूथ को अक्षम/सक्षम करने के लिए उस पर क्लिक करें -

आप कमांड प्रॉम्प्ट में ब्लूटूथ पेज (कमांड - uiautomatorviewer का उपयोग करके) का स्क्रीनशॉट देख सकते हैं और देख सकते हैं कि ऑफ़ बटन में OFF/ON स्लाइडर में टेक्स्ट होगा। फिर बस उपयोग करें -

new UiObject(new UiSelector().text("OFF")).click(); 
+1

मैं बटन अपने वर्ग का उपयोग कर पहचान कर सकते हैं नाम। मैं बस उस ui ऑब्जेक्ट का दूसरा उदाहरण चुनता हूं। मैं एक तत्व के मूल दृश्य में एक ui तत्व खोजना चाहता था जिसे 100% की पहचान की जा सकती है, इससे कोई फर्क नहीं पड़ता कि मेरा लेआउट एक बिंदु पर क्या है। तो, सवाल अभी भी है: मैं ui elemen के माता-पिता की पहचान कैसे कर सकता हूं? –

3

नीचे कोड मेरे लिए काम करता है।

//Getting the scrollable view 

UiScrollable settingsList = new UiScrollable(new UiSelector().scrollable(true)); 

for (int i=0; i<=settingsList.getChildCount(new UiSelector().className(LinearLayout.class.getName())); i++) { 
//Looping through each linear layout view 
UiObject linearLayout = settingsList.getChild(new UiSelector().className(LinearLayout.class.getName()).instance(i)); 

//Checking if linear layout have the text. If yes, get the switch, click and break out of the loop. 
if (linearLayout.getChild(new UiSelector().text("Bluetooth")).exists()) { 
    UiObject btSwitch = linearLayout.getChild(new UiSelector().className(android.widget.Switch.class.getName())); 
    btSwitch.click(); 
    break; 
    } 
} 
+0

रैखिक लेआउट आत्मा के माध्यम से लूपिंग के लिए धन्यवाद! यह मेरे लिए ठीक काम किया! –

0

हाल ही में पाया गया है कि हम उदाहरण के लिए वस्तु का एक चाचा का चयन करने के getFromParent (UiObject के लिए) और fromParent (UiSelector के लिए) इस्तेमाल कर सकते हैं। हम इस तरह के लेआउट है:

`LinearLayout 
    relative layout 
     text View 
    relative layout 
     check box` 

हम इस कोड के साथ TextView से चेकबॉक्स मिल सकता है:

TextViewTitle().getFromParent(new UiSelector() 
      .fromParent(new UiSelector() 
        .resourceId("android:id/checkbox"))); 

जहां TextViewTitle पाठ दृश्य के साथ एक Uiobject है

+0

नहीं, जो – 13bit

+0

पर काम नहीं कर रहा है लेकिन हम UiObject2 को BySelector के साथ उपयोग कर सकते हैं – 13bit

संबंधित मुद्दे

 संबंधित मुद्दे