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:
- Uygulamanızın
build.gradle
dosyasını açın. Bu genellikle en üst düzeybuild.gradle
dosyası değil,app/build.gradle
olur. 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')
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. ÖncewithElement()
işlevini çağırarak referansWeb.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ğerlendirerektrue
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.