إسبريسو ويب

تُعد منصة Espresso-Web نقطة دخول للعمل مع مكونات واجهة المستخدم في Android WebView. يعيد Espresso-Web استخدام Atoms من WebDriver API الشهيرة لفحص سلوك WebView والتحكّم فيه.

حالات استخدام Espresso-Web

استخدم Espresso-Web لاختبار تطبيقاتك المختلطة، وخاصةً عملية دمج مكونات واجهة المستخدم الأصلية للتطبيق مع WebView مكونات واجهة المستخدم. ويمكنك استخدام واجهة برمجة تطبيقات Espresso-Web مع واجهات برمجة تطبيقات واجهات برمجة تطبيقات Espresso للتفاعل الكامل مع عناصر الويب داخل عناصر WebView

إذا كنت تريد اختبار WebView نفسها فقط وليس التفاعلات بين WebView والمكونات المدمجة مع المحتوى في تطبيقك، وكتابة اختبار عام للويب باستخدام إطار عمل مثل WebDriver. إذا كنت تستخدم إطار عمل لاختبار الويب، فلا إلى استخدام جهاز Android أو جهاز Java الافتراضي، ما يؤدي إلى إجراء الاختبارات بسرعة أكبر وموثوقية. ومع ذلك، يتيح لك Espresso-Web إعادة استخدام ذرات WebDriver المخصّصة، ما يمنحك قدرًا كبيرًا من المرونة، خاصةً عند كتابة الاختبارات التي تخطط لإجرائها على كل من تطبيقات الويب المستقلة التطبيقات التي تتضمن واجهة مستخدم Android.

آلية العمل

على غرار onData() الخاص بـ Espresso فإن تفاعل WebView يتكون من العديد من Atoms. تستخدم تفاعلات WebView مزيجًا من لغة البرمجة Java جسر JavaScript للقيام بعمله. لأنه لا توجد فرصة لتقديم من خلال عرض البيانات من بيئة JavaScript—كل شيء ترى إسبرسو على الجانب المستند إلى Java هي نسخة معزولة — تعرض البيانات من Web.WebInteraction مدعومة بالكامل، مما يتيح لك التحقق من جميع البيانات التي تم إرجاعها من لطلب ما.

ما هو WebDriver Atom؟

يستخدم إطار عمل WebDriver Atoms للعثور على عناصر الويب ومعالجتها. برمجيًا. يتم استخدام Atoms من خلال WebDriver للسماح بمعالجة المتصفّح. إنّ يشبه Atom من الناحية النظرية ViewAction، وهو مشروع مستقل تعمل على تنفيذ إجراء في واجهة المستخدم الخاصة بك. تعرض Atoms باستخدام قائمة طرق محددة، مثل findElement() وgetElement()، لدفع المتصفح من وجهة نظر المستخدم. أما إذا كنت تستخدم WebDriver بشكل مباشر، يلزم تنظيم Atoms بشكل صحيح، مما يتطلب منطقًا ومطول إلى حد ما.

ضِمن Espresso، تظهر الفئات Web وWeb.WebInteraction يجب لف هذا النص النموذجي ومنحه شعورًا أشبه بالإسبريسو عند التفاعل مع WebView. الأخرى. إذًا، في سياق WebView، تُستخدَم Atoms كعناصر كبديل عن قهوة الإسبريسو التقليدية ViewMatchers وViewActions.

بعد ذلك، تبدو واجهة برمجة التطبيقات بسيطة جدًا:

Kotlin

onWebView()
    .withElement(Atom)
    .perform(Atom)
    .check(WebAssertion)

Java

onWebView()
    .withElement(Atom)
    .perform(Atom)
    .check(WebAssertion);

لمزيد من المعلومات، اطّلِع على مستندات Seenium حول Atoms.

تنفيذ WebView

اتّبِع الإرشادات الموضّحة في الأقسام التالية لاستخدام هذه الميزة WebView في اختبارات تطبيقك.

الطرود

لتضمين Espresso-Web في مشروعك، أكمل الخطوات التالية:

  1. افتح ملف build.gradle الخاص بتطبيقك. عادةً لا يكون هذا المستوى الأعلى build.gradle ولكن app/build.gradle
  2. أضف السطر التالي داخل التبعيات:

    Groovy

        androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
        

    Kotlin

        androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
        
  3. لا يتوافق Espresso-Web إلا مع Espresso 2.2 أو الإصدارات الأحدث، الإصدار 0.3 أو أعلى من مكتبة الاختبارات، لذا احرص على تحديثها الأسطر أيضًا:

    Groovy

        androidTestImplementation 'androidx.test:runner:1.6.1'
        androidTestImplementation 'androidx.test:rules:1.6.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
        

    Kotlin

        androidTestImplementation('androidx.test:runner:1.6.1')
        androidTestImplementation('androidx.test:rules:1.6.1')
        androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')
        

الاستخدام الشائع لواجهة برمجة التطبيقات

onWebView() هو نقطة الدخول الرئيسية عند العمل باستخدام WebView على Android باستخدام إسبريسو وتستخدم هذه الطريقة لإجراء اختبارات Espresso-Web، مثل التالي:

Kotlin

onWebView()
    .withElement(findElement(Locator.ID, "link_2")) // similar to onView(withId(...))
    .perform(webClick()) // Similar to perform(click())

    // Similar to check(matches(...))
    .check(webMatches(getCurrentUrl(), containsString("navigation_2.html")))

Java

onWebView()
    .withElement(findElement(Locator.ID, "link_2")) // similar to onView(withId(...))
    .perform(webClick()) // Similar to perform(click())

    // Similar to check(matches(...))
    .check(webMatches(getCurrentUrl(), containsString("navigation_2.html")));

في هذا المثال، تحدد أداة Espresso-Web عنصر DOM الذي يكون معرّفه "link_2" ينقر فوقها. تتحقق الأداة بعد ذلك من إرسال WebView لطلب GET الذي يحتوي على سلسلة "navigation_2.html".

دعم JavaScript

عند تنفيذ الاختبارات، يُجري النظام جميع تفاعلات WebView باستخدام JavaScript. لذلك، لدعم تقييم JavaScript، يتم اختبار WebView. تفعيل JavaScript فيه.

يمكنك فرض تفعيل JavaScript عن طريق استدعاء forceJavascriptEnabled() كإجراء في نشاطك ضمن الاختبار، كما هو موضح في التالي مقتطف الرمز.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule val activityScenarioRule =
        activityScenarioRule<MyWebViewActivity>()

    @Test fun testWebViewInteraction() {
        onWebView().forceJavascriptEnabled()
    }
}

تفاعلات الويب الشائعة

تشمل التفاعلات الشائعة مع عناصر Web.WebInteraction ما يلي:

  • withElement() إلى عنصر DOM في WebView.

    مثال:

    Kotlin

    onWebView().withElement(findElement(Locator.ID, "teacher"))
    

    Java

    onWebView().withElement(findElement(Locator.ID, "teacher"));
    
  • تشير السمة withContextualElement() إلى عنصر DOM ذي نطاق واسع. في WebView، بالنسبة إلى عنصر DOM آخر. يجب الاتصال يجب withElement() أولاً لإنشاء المرجع. كائن Web.WebInteraction (عنصر DOM).

    مثال:

    Kotlin

    .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"))
    

    Java

    .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"));
    
  • تقيّم check() شرطًا، وتتأكد من أنه يمكن حله. إلى true.

    مثال:

    Kotlin

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"))
        .check(webMatches(getText(), containsString("Socrates")))
    

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"))
        .check(webMatches(getText(), containsString("Socrates")));
    
  • تنفِّذ perform() إجراءً داخل WebView، مثل. بالنقر فوق عنصر ما.

    مثال:

    Kotlin

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick())
    

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
    
  • reset() إعادة WebView إلى حالته الأولية. يُعد ذلك ضروريًا عندما يتم إجراء إجراء، مثل النقرة، يؤدي إلى تغيير في التنقل يجعل يتعذّر الوصول إلى الكائنين ElementReference و WindowReference.

    ملاحظة: على الرغم من أن استخدام reset() يكون مفيدًا في حالة تقديم تأكيدات ضد سير العمل من صفحات متعددة، مثل عمليات إرسال النماذج يجب أن تكون اختباراتك محدودة النطاق وتركز على صفحة واحدة.

    مثال:

    Kotlin

    onWebView()
        .withElement(...)
        .perform(...)
        .reset()
    

    Java

    onWebView()
        .withElement(...)
        .perform(...)
        .reset();
    

مثال

يختبر المثال التالي ما إذا كان، بعد إدخال نص في WebView زر إرسال، يظهر النص نفسه داخل عنصر مختلف في نفس WebView:

Kotlin

const val MACCHIATO = "Macchiato"

@RunWith(AndroidJUnit4::class)
class MyEspressoWebTestSuite {

    @Test fun typeTextInInput_clickButton_SubmitsForm() {
        // Create an intent that displays a web form.
        val webFormIntent = Intent()
        // ...

        // Lazily launch the Activity with a custom start Intent per test.
        ActivityScenario.launchActivity(webFormIntent)

        // Selects the WebView in your layout. If you have multiple WebView
        // objects, you can also use a matcher to select a given WebView,
        // onWebView(withId(R.id.web_view)).
        onWebView()
            // Find the input element by ID.
            .withElement(findElement(Locator.ID, "text_input"))

            // Clear previous input and enter new text into the input element.
            .perform(clearElement())
            .perform(DriverAtoms.webKeys(MACCHIATO))

            // Find the "Submit" button and simulate a click using JavaScript.
            .withElement(findElement(Locator.ID, "submitBtn"))
            .perform(webClick())

            // Find the response element by ID, and verify that it contains the
            // entered text.
            .withElement(findElement(Locator.ID, "response"))
            .check(webMatches(getText(), containsString(MACCHIATO)))
    }
}

Java

public static final String MACCHIATO = "Macchiato";

@Test
public void typeTextInInput_clickButton_SubmitsForm() {
    // Create an intent that displays a web form.
    Intent webFormIntent = new Intent();
    // ...

    // Lazily launch the Activity with a custom start Intent per test.
    ActivityScenario.launchActivity(webFormIntent);

    // Selects the WebView in your layout. If you have multiple WebView objects,
    // you can also use a matcher to select a given WebView,
    // onWebView(withId(R.id.web_view)).
    onWebView()
        // Find the input element by ID.
        .withElement(findElement(Locator.ID, "text_input"))

        // Clear previous input and enter new text into the input element.
        .perform(clearElement())
        .perform(DriverAtoms.webKeys(MACCHIATO))

        // Find the "Submit" button and simulate a click using JavaScript.
        .withElement(findElement(Locator.ID, "submitBtn"))
        .perform(webClick())

        // Find the response element by ID, and verify that it contains the
        // entered text.
        .withElement(findElement(Locator.ID, "response"))
        .check(webMatches(getText(), containsString(MACCHIATO)));
}

مصادر إضافية

لمزيد من المعلومات حول استخدام Espresso-Web في اختبارات Android، يُرجى الرجوع إلى الموارد التالية.

نماذج

  • WebBasicSample: يمكنك استخدام Espresso-Web للتفاعل مع كائنات WebView.