में काम नहीं करता है क्या कोई एंड्रॉइड UITesting
फ्रेमवर्क UIAutomator
का प्रयास करता है? जब मैं कक्षा UiScrollabl
"का उपयोग एक स्क्रॉल वस्तु में कुछ वस्तुओं को खोजने के लिए, यह वस्तु नहीं मिल सकता है अगर स्क्रॉल वस्तु की लंबाई, (दो बार स्वाइप करना होगा यह पता लगाने के लिए) बहुत लंबा है की तरह "डेवलपर विकल्प" "सेटिंग" अनुप्रयोग में। किसी को भी एक ही मुद्दा है?UiScrollable Android uiautomator
उत्तर
आप प्रदान कर सकते हैं एडीटी के संस्करण आप?
- को खुश एंड्रॉइड के परीक्षण चल रहे हैं/चालू हैं ?
कारण मैं इन प्रश्नों से पूछता हूं क्योंकि यूआईयूयूटोमेटर के साथ कुछ संस्करण-विशिष्ट समस्याएं हैं। उदाहरण के लिए मैंने एंड्रॉइड के 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.");
}
}
नोट पूर्ण उदाहरण मिल जाएगा: मैं के बाद से मैं नहीं करता है, तो इस कोड को अपनी समस्या का समाधान होगा पता नहीं है अपने ऐप का एक उदाहरण है। यदि आप अपने परीक्षण और प्रासंगिक यूआई के एक्सएमएल लेआउट को पोस्ट करने में सक्षम हैं तो इससे समस्या का निदान करना आसान हो जाएगा।
scrollableObject.scrollIntoView(btn_1);
try {if(scrollableObject.scrollIntoView(btn_1))
btn_1.click();
}
catch (UiObjectNotFoundException e){
System.out.print("error1: "+e);
}
सुनिश्चित नहीं है कि यह आपकी मदद कर सकता है लेकिन यह मेरे ऐप में है। पहली पंक्ति इसे तब तक स्क्रॉल करना है जब तक कि यह btn_1 नहीं पाता, फिर यदि यह ऑब्जेक्ट पाता है, तो यह उस पर एक क्लिक करेगा।
मैंने 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()
विधि पहले प्रयास पर विफल हो जाती है। भगवान जानता है क्यों।
उपरोक्त बस कहता है कि यह पहली स्क्रॉल पर विफल रहता है, परवाह किए बिना। यदि यह दूसरी स्क्रॉल पर स्क्रॉल करने में विफल रहता है, तो यह वास्तव में विफलता देता है।
मैं आमतौर पर UiDevice
के drag()
के साथ Scrollable
के तरीकों के मुकाबले अधिक भाग्यशाली हूं।
महान सलाह नहीं थी! मुझे स्क्रॉल करने योग्य तत्वों को ओवरलैप करने में परेशानी हो रही थी, और ड्रैग इसके लिए एकमात्र समाधान था। – Phil
स्क्रॉलिंग आवश्यक होने पर एक दृश्य में कोई तत्व ढूंढने के लिए और मैंने नीचे उल्लिखित विधि का उपयोग किया और ऐसा लगता है कि यह ठीक काम करता है।
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();
}
}
अजीब ... इस विधि ने मेरे लिए काम नहीं किया है ... यह getChildByText जैसा ही व्यवहार करता है ... यह लगभग 67 तत्वों –
पर स्क्रॉलिंग रोकता है। यह उम्मीद के रूप में काम करता है। – wojciii
मैं भी 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;
}
}
- 1. UiAutomator getLastTraversedText()
- 2. एंड्रॉयड परीक्षण: UIAutomator बनाम एस्प्रेसो
- 3. अनचाहे त्रुटि इनपुट पार्सिंग अमान्य uiautomator पदानुक्रम फ़ाइल
- 4. क्यों एंड्रॉयड uiautomator के UIDevice # takeScreenshot हमेशा एमुलेटर
- 5. uiautomator - स्क्रॉल करने के लिए ListView नहीं मिल सकता क्योंकि मैं प्रत्येक सूची आइटम में टेक्स्ट मान्य करता हूं। जब मैं स्क्रीन पर अंतिम आइटम
- 6. Android-
- 7. Android
- 8. Android
- 9. Android
- 10. Android
- 11. Android
- 12. Android
- 13. Android
- 14. Android
- 15. Android
- 16. Android
- 17. Android
- 18. Android
- 19. Android,
- 20. Android
- 21. Android
- 22. Android
- 23. Android
- 24. Android
- 25. Android
- 26. Android
- 27. Android
- 28. Android
- 29. Android
- 30. Android
आप नीचे दिए गए फिक्स में दिलचस्पी ले सकते हैं, अपरिवर्तनीय वर्ग को ओवरराइड कर सकते हैं, क्योंकि यह एक से अधिक स्थानों पर इस मुद्दे को ठीक करेगा। – newfivefour
यह उत्तर मेरे लिए काम किया ... नीचे दिए गए फिक्स –