Espresso Web

Espresso-Web, Android WebView kullanıcı arayüzü bileşenleriyle çalışmak için bir giriş noktasıdır. Espresso-Web, bir WebView'ın davranışını incelemek ve kontrol etmek için popüler WebDriver API'deki Atomları yeniden kullanır.

Espresso-Web ne zaman kullanılır?

Karma uygulamalarınızı, özellikle uygulamanızın yerel kullanıcı arayüzü bileşenlerinin WebView kullanıcı arayüzü bileşenleriyle entegrasyonunu test etmek için Espresso-Web'i kullanın. Espresso-Web API'yi diğer Espresso API'leriyle birlikte kullanarak WebView nesnelerindeki web öğeleriyle tam olarak etkileşim kurabilirsiniz.

Yalnızca WebView öğesini test etmeniz gerekiyorsa ve uygulamanızdaki WebView ile yerel bileşenler arasındaki etkileşimleri test etmeniz gerekmiyorsa WebDriver gibi bir çerçeve kullanarak genel bir web testi yazmayı düşünebilirsiniz. Web test çerçevesi kullanıyorsanız Android cihaz veya Java sanal makinesi kullanmanız gerekmez. Bu sayede testleriniz daha hızlı ve güvenilir bir şekilde çalışır. Bununla birlikte, Espresso-Web, özel WebDriver atomlarınızı yeniden kullanmanıza olanak tanır. Bu da özellikle hem bağımsız web uygulamalarına hem de Android kullanıcı arayüzü içeren uygulamalara karşı çalıştırmayı planladığınız testler yazarken size büyük bir esneklik sağlar.

İşleyiş şekli

Espresso'nun onData() yöntemine benzer şekilde, bir WebView etkileşimi birkaç Atom'dan oluşur. WebView etkileşimleri, işlerini yapmak için Java programlama dili ile JavaScript köprüsünün bir kombinasyonunu kullanır. JavaScript ortamındaki veriler kullanılarak yarış koşullarının ortaya çıkma ihtimali olmadığından (Java tabanlı tarafta Espresso'nun gördüğü her şey izole bir kopyadır) Web.WebInteraction nesnelerinden veri döndürme işlemi tamamen desteklenir. Bu sayede, bir istekten döndürülen tüm verileri doğrulayabilirsiniz.

WebDriver Atom nedir?

WebDriver çerçevesi, web öğelerini programatik olarak bulmak ve değiştirmek için Atom'ları kullanır. Atomlar, tarayıcı manipülasyonuna izin vermek için WebDriver tarafından kullanılır. Atom, kavramsal olarak ViewAction'a benzer. Atom, kullanıcı arayüzünüzde bir işlem gerçekleştiren bağımsız bir birimdir. Kullanıcının bakış açısıyla tarayıcıyı yönlendirmek için findElement() ve getElement() gibi tanımlanmış yöntemlerin listesini kullanarak Atom'ları kullanıma sunarsınız. Ancak WebDriver çerçevesini doğrudan kullanırsanız Atoms'un düzgün bir şekilde düzenlenmesi gerekir. Bu da oldukça ayrıntılı bir mantık gerektirir.

Espresso'da Web ve Web.WebInteraction sınıfları bu standart metni sarmalar ve WebView nesneleriyle etkileşime girerken Espresso benzeri bir deneyim sunar. Bu nedenle, WebView bağlamında Atomlar, geleneksel Espresso ViewMatchers ve ViewActions yerine kullanılır.

API daha sonra oldukça basit görünür:

Kotlin

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

Java

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

Daha fazla bilgi edinmek için Selenium'un Atomlar hakkındaki dokümanlarını inceleyin.

WebView'ı uygulama

Uygulamanızın testlerinde WebView ile çalışmak için aşağıdaki bölümlerde gösterilen yönergeleri uygulayın.

Paketler

Espresso-Web'i projenize dahil etmek için aşağıdaki adımları tamamlayın:

  1. Uygulamanızın build.gradle dosyasını açın. Bu genellikle en üst düzey build.gradle dosyası değil, app/build.gradle olur.
  2. Bağımlılıkların içine aşağıdaki satırı ekleyin:

    Groovy

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

    Kotlin

        androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
        
  3. Espresso-Web yalnızca Espresso 2.2 veya sonraki sürümlerle ve test kitaplığının 0.3 veya sonraki sürümleriyle uyumludur. Bu nedenle, aşağıdaki satırları da güncellediğinizden emin olun:

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

Yaygın API kullanımı

onWebView() yöntemi, Espresso kullanarak Android'de WebView ile çalışırken kullanılan ana giriş noktasıdır. Bu yöntemi, aşağıdakiler gibi Espresso-Web testlerini gerçekleştirmek için kullanırsınız:

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

Bu örnekte Espresso-Web, kimliği "link_2" olan bir DOM öğesini bulur ve bu öğeyi tıklar. Ardından araç, WebView'un "navigation_2.html" dizesini içeren bir GET isteği gönderdiğini doğrular.

JavaScript desteği

Sistem, testlerinizi yürütürken tüm WebView etkileşimlerini JavaScript kullanarak gerçekleştirir. Bu nedenle, JavaScript değerlendirmesini desteklemek için test edilen WebView'da JavaScript'in etkinleştirilmesi gerekir.

Aşağıdaki kod snippet'inde gösterildiği gibi, forceJavascriptEnabled() öğesini test edilen etkinliğinizde bir işlem olarak çağırarak JavaScript'in etkinleştirilmesini zorlayabilirsiniz.

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

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

Sık kullanılan web etkileşimleri

Web.WebInteraction nesneleriyle yaygın etkileşimler şunlardır:

  • withElement() WebView içindeki bir DOM öğesine referans verir.

    Örnek:

    Kotlin

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

    Java

    onWebView().withElement(findElement(Locator.ID, "teacher"));
  • withContextualElement(), WebView'daki kapsamlı bir DOM öğesine başka bir DOM öğesine göre referans verir. Önce withElement() işlevini çağırarak referans Web.WebInteraction nesnesini (DOM öğesi) oluşturmanız gerekir.

    Örnek:

    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(), bir koşulu değerlendirerek true olarak çözümlendiğinden emin olur.

    Örnek:

    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() bir öğeyi tıklama gibi bir işlemi WebView içinde yürütür.

    Örnek:

    Kotlin

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

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
  • reset() WebView'ı başlangıç durumuna döndürür. Bu, tıklama gibi önceki bir işlem, ElementReference ve WindowReference nesnelerini erişilemez hale getiren bir gezinme değişikliği yaptığında gereklidir.

    Not: reset() işaretini kullanmak, form gönderimleri gibi çok sayfalı iş akışlarına karşı onaylamalar yaparken yararlı olsa da testlerinizin kapsamı genellikle sınırlı olmalı ve tek bir sayfaya odaklanmalıdır.

    Örnek:

    Kotlin

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

    Java

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

Örnek

Aşağıdaki örnekte, bir WebView'a metin girildikten ve Gönder düğmesi seçildikten sonra aynı metnin aynı WebView'daki farklı bir öğede görünüp görünmediği test edilmektedir:

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

Ek kaynaklar

Android testlerinde Espresso-Web'i kullanma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Örnekler

  • WebBasicSample: WebView nesneleriyle etkileşim kurmak için Espresso-Web'i kullanın.