اسپرسو وب

Espresso-Web یک نقطه ورودی برای کار با اجزای رابط کاربری Android WebView است. Espresso-Web از Atoms از API محبوب WebDriver برای بررسی و کنترل رفتار WebView استفاده مجدد می کند.

زمان استفاده از Espresso-Web

از Espresso-Web برای آزمایش برنامه های ترکیبی خود، به ویژه ادغام مؤلفه های رابط کاربری بومی برنامه خود با مؤلفه های WebView UI آن، استفاده کنید. می‌توانید از Espresso-Web API همراه با دیگر APIهای Espresso برای تعامل کامل با عناصر وب در داخل اشیاء WebView استفاده کنید.

اگر نیاز دارید که فقط خود WebView و نه تعامل بین WebView و مؤلفه‌های بومی در برنامه خود را آزمایش کنید، یک آزمایش وب عمومی با استفاده از چارچوبی مانند WebDriver بنویسید. اگر از یک چارچوب تست وب استفاده می کنید، نیازی به استفاده از دستگاه اندروید یا ماشین مجازی جاوا ندارید، که باعث می شود تست های شما سریعتر و قابل اطمینان تر اجرا شوند. همانطور که گفته شد، Espresso-Web به شما امکان استفاده مجدد از اتم‌های WebDriver سفارشی خود را می‌دهد، که به شما انعطاف‌پذیری زیادی می‌دهد، به‌ویژه هنگام نوشتن آزمایش‌هایی که قصد دارید هم علیه برنامه‌های وب مستقل و هم برنامه‌هایی که دارای رابط کاربری اندروید هستند اجرا کنید.

چگونه کار می کند

مشابه روش onData() اسپرسو، یک تعامل WebView شامل چندین اتم است. تعاملات WebView از ترکیبی از زبان برنامه نویسی جاوا و یک پل جاوا اسکریپت برای انجام کار خود استفاده می کنند. از آنجایی که هیچ شانسی برای معرفی شرایط مسابقه با افشای داده‌ها از محیط جاوا اسکریپت وجود ندارد - هر چیزی که Espresso در سمت مبتنی بر جاوا می‌بیند یک کپی جدا شده است - داده‌های برگردانده از اشیاء Web.WebInteraction به طور کامل پشتیبانی می‌شود و به شما امکان می‌دهد تمام داده‌های بازگردانده شده را تأیید کنید. از یک درخواست

WebDriver Atom چیست؟

چارچوب WebDriver از Atoms برای پیدا کردن و دستکاری عناصر وب به صورت برنامه‌نویسی استفاده می‌کند. اتم ها توسط WebDriver برای اجازه دستکاری مرورگر استفاده می شوند. یک Atom از نظر مفهومی شبیه به ViewAction است، یک واحد مستقل که یک عمل را در رابط کاربری شما انجام می دهد. شما با استفاده از لیستی از متدهای تعریف شده، مانند findElement() و getElement() برای هدایت مرورگر از دید کاربر، Atoms را در معرض دید قرار می دهید. با این حال، اگر مستقیماً از چارچوب WebDriver استفاده می‌کنید، Atoms باید به درستی سازماندهی شوند، که به منطقی کاملاً پرمخاطب نیاز دارد.

در اسپرسو، کلاس‌های Web و Web.WebInteraction این دیگ بخار را می‌پیچانند و حسی شبیه اسپرسو به تعامل با اشیاء WebView می‌دهند. بنابراین در زمینه یک WebView ، Atoms به عنوان جایگزینی برای ViewMatchers و ViewActions سنتی اسپرسو استفاده می شود.

سپس API بسیار ساده به نظر می رسد:

کاتلین

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

جاوا

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

برای کسب اطلاعات بیشتر، مستندات سلنیوم در مورد اتم ها را بخوانید.

WebView را پیاده سازی کنید

برای کار با WebView در تست های برنامه خود، راهنمایی های نشان داده شده در بخش های زیر را دنبال کنید.

بسته ها

برای گنجاندن Espresso-Web در پروژه خود، مراحل زیر را انجام دهید:

  1. فایل build.gradle برنامه خود را باز کنید. این معمولاً فایل build.gradle سطح بالا نیست بلکه app/build.gradle است.
  2. خط زیر را داخل وابستگی ها اضافه کنید:

    شیار

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

    کاتلین

        androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
        
  3. Espresso-Web فقط با Espresso 2.2 یا بالاتر و نسخه 0.3 یا بالاتر از کتابخانه آزمایشی سازگار است، بنابراین مطمئن شوید که آن خطوط را نیز به روز کنید:

    شیار

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

    کاتلین

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

استفاده رایج از API

متد onWebView() نقطه ورود اصلی هنگام کار با WebView در اندروید با استفاده از اسپرسو است. شما از این روش برای انجام تست های Espresso-Web استفاده می کنید، مانند موارد زیر:

کاتلین

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")))

جاوا

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" ارسال می کند.

پشتیبانی از جاوا اسکریپت

هنگام اجرای تست های شما، سیستم تمام تعاملات WebView را با استفاده از جاوا اسکریپت انجام می دهد. بنابراین، برای پشتیبانی از ارزیابی جاوا اسکریپت، WebView تحت آزمایش باید جاوا اسکریپت را فعال کند.

همانطور که در قطعه کد زیر نشان داده شده است، می توانید با فراخوانی forceJavascriptEnabled() به عنوان یک عمل در فعالیت تحت آزمایش خود ، جاوا اسکریپت را فعال کنید.

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

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

تعاملات رایج وب

تعاملات رایج با اشیاء Web.WebInteraction شامل موارد زیر است:

  • withElement() به عنصر DOM در WebView ارجاع می دهد.

    مثال:

    کاتلین

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

    جاوا

    onWebView().withElement(findElement(Locator.ID, "teacher"));
    
  • withContextualElement() به یک عنصر DOM با دامنه در WebView نسبت به عنصر DOM دیگر اشاره می کند. برای ایجاد شی مرجع Web.WebInteraction (عنصر DOM) ابتدا باید withElement() را فراخوانی کنید.

    مثال:

    کاتلین

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

    جاوا

    .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"));
    
  • check() یک شرط را ارزیابی می‌کند و مطمئن می‌شود که به true تبدیل می‌شود.

    مثال:

    کاتلین

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

    جاوا

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .withContextualElement(findElement(Locator.ID, "person_name"))
        .check(webMatches(getText(), containsString("Socrates")));
    
  • perform() یک عمل را در یک WebView اجرا می کند، مانند کلیک کردن روی یک عنصر.

    مثال:

    کاتلین

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

    جاوا

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
    
  • reset() WebView را به حالت اولیه باز می گرداند. این زمانی ضروری است که یک اقدام قبلی، مانند یک کلیک، تغییر ناوبری را ایجاد کند که اشیاء ElementReference و WindowReference را غیرقابل دسترسی می کند.

    توجه: اگرچه استفاده از reset() هنگام اظهارنظر در برابر گردش‌های کاری چند صفحه‌ای، مانند ارسال فرم‌ها، مفید است، آزمون‌های شما معمولاً باید از نظر دامنه محدود باشند و روی یک صفحه متمرکز شوند.

    مثال:

    کاتلین

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

    جاوا

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

مثال

مثال زیر آزمایش می کند که آیا پس از وارد کردن متن در WebView و انتخاب دکمه ارسال ، همان متن در یک عنصر متفاوت در همان WebView ظاهر می شود یا خیر:

کاتلین

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)))
    }
}

جاوا

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 در تست های اندروید به منابع زیر مراجعه کنید.

نمونه ها

  • WebBasicSample : از Espresso-Web برای تعامل با اشیاء WebView استفاده کنید.