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:
- Uygulamanızın
build.gradle
dosyasını açın. Bu, genellikle üst düzeybuild.gradle
dosyası değil,app/build.gradle
dosyasıdır. Bağımlılıkların içine aşağıdaki satırı ekleyin:
Modern
androidTestImplementation 'androidx.test.espresso:espresso-web:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-web:3.6.1')
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.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 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. ReferansWeb.WebInteraction
nesnesini (DOM öğesi) oluşturmak için ilk olarakwithElement()
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ğerlendirerektrue
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.