Espresso Web

Espresso-Web, Android WebView kullanıcı arayüzü bileşenleriyle çalışmak için 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'deki Atom'ları yeniden kullanır.

Espresso-Web ne zaman kullanılır?

Karma uygulamalarınızı, özellikle de WebView ile uygulamanın yerel kullanıcı arayüzü bileşenlerini Kullanıcı arayüzü bileşenleri. Espresso-Web API'sini diğer web API'leriyle birlikte WebView nesnelerinin içindeki web öğeleriyle tamamen etkileşime geçmek için espresso API'leri.

Yalnızca WebView öğesini test etmeniz gerekiyorsa WebView ile uygulamanızdaki yerel bileşenler arasındaki etkileşimleri göz önünde bulundurun. WebDriver gibi bir çerçeve kullanarak genel bir web testi yazma. Web testi çerçevesi kullanıyorsanız testlerinizi hazırlayacak bir Android cihaz veya Java Sanal Makinesi kullanmanız daha hızlı ve güvenilir şekilde çalışmasını sağlar. Bununla birlikte, Espresso-Web, internette sağlayan özel WebDriver atomlarınızla uyumlu, hem bağımsız web uygulamalarında hem de testlerde çalıştırmayı planladığınız Android kullanıcı arayüzü içeren uygulamalar.

İşleyiş şekli

Espresso'nun onData() hizmetine benzer yönteminde, WebView etkileşimi birkaç Atom'dan oluşur. WebView etkileşimleri, Java programlama dili ve JavaScript köprüsü var. Çünkü bir projeyi JavaScript ortamından (her şey) veri açığa çıkararak Espresso, Java tabanlı tarafında gördüğünde izole bir kopyadır. Diğer Web.WebInteraction nesneleri tam olarak desteklenmektedir. Böylece, API'den döndürülen tüm verileri talep ediyor.

WebDriver Atomu Nedir?

WebDriver çerçevesi, web öğelerini bulmak ve değiştirmek için Atom'ları kullanır daha fazla bilgi edindiniz. Atomlar, WebDriver tarafından tarayıcı manipülasyonuna izin vermek için kullanılır. Atom, kavram olarak ViewAction, bağımsız bir kullanıcı arayüzünde bir işlem gerçekleştiren birimdir. Atomları ortaya çıkarmak için findElement() ve getElement() gibi tanımlanmış yöntemleri kullanarak bakış açısından bir tarayıcı oluşturur. Ancak WebDriver'ı kullanıyorsanız Atom’ların doğru şekilde düzenlenmesi ve Çevik Manifesto’da oldukça ayrıntılı.

Espresso'da Web ve Web.WebInteraction bu standart metni sarmalayın ve WebView ile etkileşime geçerken Espresso benzeri bir his yaratın nesneler'i tıklayın. WebView bağlamında Atomlar, Geleneksel Espresso ViewMatchers ve ViewActions'nin yerini aldı.

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 edinmek için Selenium'un Atoms ile ilgili dokümanlarını okuyun.

WebView'u uygulayın

Aşağıdaki bölümlerde gösterilen talimatları uygulayarak Uygulamanızın testlerinde WebView.

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ı, ancak app/build.gradle.
  2. Bağımlılıkların içine aşağıdaki satırı ekleyin:

    Eski

        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 üstü sürümlerle uyumludur ve test kitaplığının 0.3 veya sonraki bir sürümünü kullandığından emin olun şu satırlarda da yer alır:

    Eski

        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, Android'de WebView ile çalışırken ana giriş noktasıdır. Espresso. Aşağıdaki gibi Espresso-Web testlerini yapmak için bu yöntemi kullanırsınız: takip etmek için:

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" ve tıklayın. Araç, daha sonra WebView'un bir GET isteği gönderdiğini doğrular. "navigation_2.html" dizesini içerir.

JavaScript desteği

Testlerinizi yürütürken sistem tüm WebView etkileşimlerini JavaScript'e dokunun. Bu nedenle, JavaScript değerlendirmesini desteklemek için test edilen WebView JavaScript'in etkin olması gerekir.

forceJavascriptEnabled() altındaki etkinliğinizde bir işlem olarak aşağıda gösterildiği gibi, kod snippet'ini eklemeniz gerekir.

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

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

Yaygın web etkileşimleri

Web.WebInteraction nesneleriyle sık yapılan etkileşimler şunlardır:

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

    Örnek:

    Kotlin

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

    Java

    onWebView().withElement(findElement(Locator.ID, "teacher"));
    
  • withContextualElement(), kapsamlı bir DOM öğesine referans veriyor Web Görünümü içinde (başka bir DOM öğesine göre) Telefonla Referansı oluşturmak için önce withElement() Web.WebInteraction nesnesi (DOM öğesi).

    Ö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 sorunun çözüldüğünden emin olur Hedef: true.

    Ö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 şunun gibi bir işlem yürütür: bir öğeyi tıklayın.

    Örnek:

    Kotlin

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

    Java

    onWebView()
        .withElement(findElement(Locator.ID, "teacher"))
        .perform(webClick());
    
  • reset(). WebView'u başlangıçtaki durumuna geri döndürür. Proje ekibinin tıklama gibi bir işlem, kullanıcının ürünle alakalı ElementReference ve WindowReference nesnelerine erişilemiyor.

    Not: Aşağıdaki durumlarda reset() kullanmak yararlı olsa da form gönderme gibi çok sayfalı iş akışlarına yönelik testlerinizin genellikle kapsam sınırlı olması ve tek bir sayfaya odaklanması gerekir.

    Örnek:

    Kotlin

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

    Java

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

Örnek

Aşağıdaki örnekte, WebView'a metin girildikten sonra ve Gönder düğmesi seçildiğinde, aynı metin şuradaki farklı bir öğede görünür: aynı Web Görünümü:

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 şu sayfaya bakın: inceleyebilirsiniz.

Örnekler

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