تُعد منصة 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 في مشروعك، أكمل الخطوات التالية:
- افتح ملف
build.gradle
الخاص بتطبيقك. عادةً لا يكون هذا المستوى الأعلىbuild.gradle
ولكنapp/build.gradle
أضف السطر التالي داخل التبعيات:
Groovy
androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
لا يتوافق 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
.