Espresso Web

Espresso-Web, Android WebView kullanıcı arayüzü bileşenleriyle çalışan bir giriş noktasıdır. Espresso-Web, bir Web Görünümü'nün davranışını incelemek ve kontrol etmek için popüler WebDriver API'sindeki Atom'ları yeniden kullanır.

Espresso-web ne zaman kullanılmalıdır?

Hibrit uygulamalarınızı, özellikle de 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. WebView nesnelerinin içindeki web öğeleriyle tam olarak etkileşime geçmek için Espresso-Web API'yi diğer Espresso API'leriyle birlikte kullanabilirsiniz.

WebView ve uygulamanızdaki yerel bileşenler arasındaki etkileşimleri değil, yalnızca WebView öğesinin kendisini test etmeniz gerekiyorsa WebDriver gibi bir çerçeve kullanarak genel bir web testi yazmayı düşünebilirsiniz. Bir web test çerçevesi kullanıyorsanız testlerinizin daha hızlı ve güvenilir şekilde çalışmasını sağlayan bir Android cihaz veya Java Sanal Makinesi kullanmanız gerekmez. Bununla birlikte, Espresso-Web, özel WebDriver atomlarınızı yeniden kullanmanıza olanak tanır. Bu, özellikle hem bağımsız web uygulamalarında hem de Android kullanıcı arayüzü içeren uygulamalarda çalıştırmayı planladığınız testler yazarken size büyük esneklik sağlar.

Nasıl çalışır?

Espresso'nun onData() yöntemine benzer şekilde, WebView etkileşimi birkaç Atom içerir. WebView etkileşimleri, işlerini yapmak için Java programlama dili ve JavaScript köprüsünün bir kombinasyonunu kullanır. JavaScript ortamından alınan verileri açığa çıkarma şansı olmadığından, Espresso'nun Java tabanlı tarafında gördüğü her şey izole bir kopyadır. Web.WebInteraction nesnelerinden veri döndürülmesi tam olarak desteklenir ve bir istekten döndürülen tüm verileri doğrulayabilmenizi sağlar.

WebDriver Atom nedir?

WebDriver çerçevesi, web öğelerini programatik olarak bulmak ve değiştirmek için Atom'ları kullanır. Atomlar, WebDriver tarafından tarayıcı manipülasyonuna izin vermek için kullanılır. Atom, kavram olarak kullanıcı arayüzünüzde işlem gerçekleştiren bağımsız bir birim olan ViewAction'e benzer. Atomları, tarayıcıyı kullanıcının bakış açısından yönlendirmek için findElement() ve getElement() gibi tanımlanmış bir yöntemler listesi kullanarak açığa çıkarırsınız. Bununla birlikte, WebDriver çerçevesini doğrudan kullanırsanız Atom'ların doğru şekilde düzenlenmesi ve oldukça ayrıntılı bir mantık gerektirmesi gerekir.

Espresso'da Web ve Web.WebInteraction sınıfları bu standart metni sarmalar ve Web Görünümü nesneleriyle etkileşim kurma hissi verir. Dolayısıyla, WebView bağlamında Atomlar, geleneksel Espresso ViewMatchers ve ViewActions'in yerine kullanılır.

Bu durumda API 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 için Selenium’un Atomlar hakkındaki belgelerini okuyun.

Web Görünümü'nü uygulama

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

Paketler

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

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

    Modern

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

    Kotlin

        androidTestImplementation('androidx.test.espresso:espresso-web:3.4.0')
        
  3. Espresso-Web, yalnızca Espresso 2.2 veya üzeri ve test kitaplığının 0.3 veya üzeri sürümleriyle uyumlu olduğundan şu satırları da güncellediğinizden emin olun:

    Modern

        androidTestImplementation 'androidx.test:runner:1.4.0'
        androidTestImplementation 'androidx.test:rules:1.4.0'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
        

    Kotlin

        androidTestImplementation('androidx.test:runner:1.4.0')
        androidTestImplementation('androidx.test:rules:1.4.0')
        androidTestImplementation('androidx.test.espresso:espresso-core:3.4.0')
        

Yaygın API kullanımı

onWebView() yöntemi, Android'de Espresso kullanarak Web Görünümü ile çalışırken ana giriş noktasıdır. Bu yöntemi, aşağıdakiler gibi Espresso-Web testleri yapmak 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 bulup tıklar. Daha sonra araç, Web Görünümü'nün "navigation_2.html" dizesini içeren bir GET isteği gönderdiğini doğrular.

JavaScript desteği

Testlerinizi yürütürken sistem, tüm Web Görünümü etkileşimlerini JavaScript kullanarak gerçekleştirir. Dolayısıyla, JavaScript değerlendirmesini desteklemek için, test edilen Web Görünümü'nde JavaScript'in etkin olması gerekir.

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

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

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

Yaygın web etkileşimleri

Web.WebInteraction nesneleriyle genel etkileşimler şunlardır:

  • withElement(), Web Görünümü içinde bir DOM öğesine referansta bulunur.

    Örnek:

    Kotlin

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

    Java

    onWebView().withElement(findElement(Locator.ID, "teacher"));
    
  • withContextualElement(), başka bir DOM öğesine göre Web Görünümü içinde kapsamlı bir DOM öğesine referans verir. Referans Web.WebInteraction nesnesini (DOM öğesi) oluşturmak için ilk olarak withElement() yöntemini çağırmanı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 değerine çö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(), Web Görünümü içinde bir öğeyi tıklama gibi bir işlem yürütür.

    Örnek:

    Kotlin

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

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
    
  • reset() Web Görünümü'nü ilk durumuna geri döndürür. Tıklama gibi önceki bir işlem, ElementReference ve WindowReference nesnelerini erişilemez hale getiren bir gezinme değişikliğine neden olduğunda bu gereklidir.

    Not: Form gönderimleri gibi çok sayfalı iş akışlarına yönelik iddialarda bulunurken reset() kullanmak faydalı 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 örnek, Web Görünümü'ne metin girdikten ve Gönder düğmesi seçildikten sonra, aynı Web Görünümü'ndeki farklı bir öğede aynı metnin görünüp görünmediğini test eder:

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.

Sana Özel

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