जांचें कि क्या एस्प्रेसो के साथ एक संवाद प्रदर्शित किया गया है


86

मैं नए एंड्रॉइड-टेस्ट-किट (एस्प्रेसो) के साथ कुछ परीक्षण लिखने की कोशिश कर रहा हूं । लेकिन मुझे इस बात की कोई जानकारी नहीं मिल सकती है कि यदि कोई डायलॉग प्रदर्शित होता है और उस पर कुछ कार्य किए जाते हैं (जैसे पॉजिटिव और नेगेटिव बटन को क्लिक करने के लिए), तो कैसे करें। ध्यान दें कि एक डायलॉग भी ए द्वारा प्रदर्शित किया जा सकता है WebView, न कि इसे स्वयं द्वारा।

किसी भी सहायता की सराहना की जाएगी। मुझे मूल के लिए एक लिंक, या कुछ उदाहरण कोड की आवश्यकता है:

  1. जाँच करें कि क्या कोई संवाद दिखाई देता है
  2. संवाद बटन पर क्लिक करें
  3. संवाद के आंतरिक दृश्य के साथ सहभागिता (यदि यह एक कस्टम दृश्य है)
  4. संवाद के बाहर प्रीपर क्लिक करें, और जांचें कि क्या यह प्रदर्शित हो रहा है या नहीं (उदाहरण के लिए यदि setCancelable(false)डायलॉग बिल्डर को कॉल किया गया था और हम इसे चेक करना चाहते हैं)

आपको अग्रिम में धन्यवाद!


नीचे मेरे जवाब पर कोई प्रतिक्रिया ??
डेनिस

जवाबों:


123
  1. यह सत्यापित करने के लिए कि यदि संवाद दिखाई देता है, तो आप बस यह देख सकते हैं कि क्या एक पाठ के साथ देखें जो संवाद के अंदर मौजूद है:

    onView(withText("dialogText")).check(matches(isDisplayed()));
    

    या, आईडी के साथ पाठ पर आधारित है

    onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
    
  2. संवाद बटन पर क्लिक करने के लिए ऐसा करें (बटन 1 - ठीक है, बटन 2 - रद्द करें):

    onView(withId(android.R.id.button1)).perform(click());
    

    अपडेट करें

  3. मुझे लगता है कि एस्प्रेसो में मल्टी विंडो सपोर्ट है
  4. कस्टम संवाद दृश्य के बाहर क्लिक करने के बारे में निश्चित नहीं है, लेकिन यह जांचने के लिए कि यह प्रदर्शित हो रहा है या नहीं, आपको अपना कस्टम मिलानकर्ता बनाना होगा और उसके अंदर जांच करनी होगी।

3
चरण 1 मेरे लिए एक ProgressDialog पर काम नहीं किया। सिर्फ डायलॉग के टाइटल और मैसेज को मान्य करने की कोशिश कर रहा है
टिम बोलांड

1
यह एस्प्रेसो और स्थिर आयात के साथ क्या है? वे विधियाँ किस वर्ग से आ रही हैं? आप स्टैक ओवरफ्लो उत्तर पर स्थिर आयात का उपयोग क्यों कर रहे हैं?

2
@jvrodrigues हर एक एस्प्रेसो ट्यूटोरियल स्थिर आयात का उपयोग करता है। मेरा सुझाव है कि आपको इसकी आदत हो जाएगी (हालांकि मैं हताशा को समझता हूं)। यह मदद करता है: google.github.io/android-testing-support-library/docs
ऑटोनोमस

चरण 4 के लिए संवाद के बाहर क्लिक करने के बजाय आप "pressBack ();" जो संवाद को खारिज करता है। यह हार्डवेयर बैक बटन का उपयोग करने के बराबर है।
एथन

@denys परियोजना को स्थानांतरित कर दिया गया है। ऐसा लगता है कि लिंक मर चुका है।
नियॉन वेज

67

मैं वर्तमान में इस का उपयोग करें और यह ठीक काम करने लगता है।

onView(withText(R.string.my_title))
    .inRoot(isDialog()) // <---
    .check(matches(isDisplayed()));

27

यदि आपके पास ऐसा अलर्ट है जैसे:

यहाँ छवि विवरण दर्ज करें

यदि घटक प्रदर्शित होते हैं, तो आप देख सकते हैं:

int titleId = mActivityTestRule.getActivity().getResources()
        .getIdentifier( "alertTitle", "id", "android" );

onView(withId(titleId))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_title)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.text1))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_message)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.button2))
        .inRoot(isDialog())
        .check(matches(withText(android.R.string.no)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.button3))
        .inRoot(isDialog())
        .check(matches(withText(android.R.string.yes)))
        .check(matches(isDisplayed()));

और एक क्रिया करें:

onView(withId(android.R.id.button3)).perform(click());

2
मेरे मामले में पाठ में आईडी थी android.R.id.messageऔर शीर्षक में एक छिपी हुई आईडी थी android.R.id.alertTitle
जेसन रॉबिन्सन

2
यदि आप AppCompat सपोर्ट लाइब्रेरी से आने वाले AlertDialog (या DialogFragment) का उपयोग करते हैं, तो इसका उपयोग करें:int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
Mr-IDE

3

प्रश्न 4 का उत्तर देने के लिए, जो स्वीकृत उत्तर नहीं है, मैंने निम्नलिखित कोड को संशोधित किया, जो मुझे यहां पाया गया कि क्या एक टोस्ट प्रदर्शित करने के लिए स्टैक ओवरफ्लो ( लिंक ) पर पाया गया था।

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) {
    return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

जो idपास किया गया है वह Viewआपके संवाद में वर्तमान में प्रदर्शित आईडी का है । आप इस तरह विधि भी लिख सकते हैं:

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) {
    return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

और अब यह Viewएक विशेष पाठ स्ट्रिंग युक्त की तलाश कर रहा है ।

इसका इस्तेमाल ऐसे करें:

getRootView(getActivity(), R.id.text_id).perform(click());

3

बटन Ids R.id.button1 और R.id.button2 डिवाइस पर समान नहीं होंगे। Ids OS संस्करणों के साथ बदल सकता है।

इसे प्राप्त करने का सही तरीका UIAutomator का उपयोग करना है। अपने बिल्ड.ग्रेड में UIAutomator निर्भरता को शामिल करें

// Set this dependency to build and run UI Automator tests
  androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

और उपयोग करें

// Initialize UiDevice instance
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

// Search for correct button in the dialog.
UiObject button = uiDevice.findObject(new UiSelector().text("ButtonText"));
if (button.exists() && button.isEnabled()) {
    button.click();
}

1
वास्तव में, android.R.id.button1, android.R.id.button2और android.R.id.button3"सकारात्मक" के लिए, "निष्पक्ष" और "नकारात्मक", वैश्विक प्रतीक दिए गए हैं कर सकते हैं इस्तेमाल किया जा। यदि आप उनके पाठ के माध्यम से चुनिंदा बटन चुनते हैं - जो पूरी तरह से ठीक है - तो आपको UIAutomator की आवश्यकता नहीं है, लेकिन एस्प्रेसो के साथ भी ऐसा कर सकते हैं onView(withText("ButtonTest")).perform(click())
थॉमस केलर

मैंने इस समाधान का उपयोग एक रोबोटियम परीक्षण ढांचे के साथ किया था और मैं आसानी से एंड्रॉइड ओएस डायलॉग बॉक्स बटन का चयन करने में सक्षम था। मुझे समय का एक गुच्छा बचाया। धन्यवाद जयदीप!
रे

@ThomasKeller मैंने अतीत में बटन 1, बटन 2 आईडी का उपयोग किया है, जब मैंने उन्हें विभिन्न उपकरणों पर चलाया तो मेरे परीक्षण टूट गए। दिखाया गया संवाद प्रणाली नियंत्रण है। आपका नियंत्रण / यूआई नहीं। अपने UI के बाहर किसी भी चीज के लिए, UIAutomator की सिफारिश की जाती है।
JaydeepW

बस। आपका बहुत बहुत धन्यवाद।
1l3r

3

बस किसी के मामले में इस सवाल पर ठोकर खाई जैसे मैंने किया। सभी उत्तर केवल डायलॉग बटन वाले संवादों के लिए काम करेंगे। उपयोगकर्ता संवाद के बिना प्रगति संवाद के लिए इसका उपयोग करने की कोशिश न करें। एस्प्रेसो निष्क्रिय अवस्था में प्रवेश करने के लिए ऐप का इंतजार करता रहता है। जब तक प्रगति संवाद दिखाई दे रहा है तब तक ऐप निष्क्रिय नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.