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 bu çerçevenin
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:
- Uygulamanızın
build.gradle
dosyasını açın. Bu genellikle üst düzeybuild.gradle
dosyası, ancakapp/build.gradle
. 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')
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 öncewithElement()
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.