Espresso Testing Framework - WebView

WebView è una vista speciale fornita da Android per visualizzare le pagine web all'interno dell'applicazione. WebView non fornisce tutte le funzionalità di un'applicazione browser a tutti gli effetti come Chrome e Firefox. Tuttavia, fornisce il controllo completo sul contenuto da mostrare ed espone tutte le funzionalità di Android da richiamare all'interno delle pagine web. Abilita WebView e fornisce un ambiente speciale in cui l'interfaccia utente può essere facilmente progettata utilizzando la tecnologia HTML e funzionalità native come fotocamera e composizione di un contatto. Questo set di funzionalità consente a una visualizzazione Web di fornire un nuovo tipo di applicazione chiamata applicazione ibrida , in cui l'interfaccia utente viene eseguita in HTML e la logica aziendale viene eseguita in JavaScript o tramite un endpoint API esterno.

Normalmente, testare una WebView deve essere una sfida perché utilizza la tecnologia HTML per i suoi elementi dell'interfaccia utente piuttosto che l'interfaccia utente / le visualizzazioni native. Espresso eccelle in quest'area fornendo un nuovo set di web matcher e web assertions, che è intenzionalmente simile a view matcher nativi e view assertions. Allo stesso tempo, fornisce un approccio ben bilanciato includendo anche un ambiente di test basato sulla tecnologia web.

Espresso web è basato sul framework WebDriver Atom, che viene utilizzato per trovare e manipolare elementi web. Atom è simile alle azioni di visualizzazione. Atom eseguirà tutte le interazioni all'interno di una pagina web. WebDriver espone un insieme predefinito di metodi, come findElement () , getElement () per trovare elementi web e restituisce gli atomi corrispondenti (per eseguire azioni nella pagina web).

Una dichiarazione di test web standard è simile al codice seguente,

onWebView()
   .withElement(Atom)
   .perform(Atom)
   .check(WebAssertion)

Qui,

  • onWebView () - Simile a onView (), espone un set di API per testare un WebView.

  • withElement () - Uno dei diversi metodi utilizzati per individuare gli elementi Web all'interno di una pagina Web utilizzando Atom e restituisce l'oggetto WebInteration, che è simile a ViewInteraction.

  • perform () - Esegue l'azione all'interno di una pagina web usando Atom e restituisce WebInteraction.

  • check () - Questo esegue l'asserzione necessaria utilizzando WebAssertion.

Un codice di test web di esempio è il seguente,

onWebView()
   .withElement(findElement(Locator.ID, "apple"))
   .check(webMatches(getText(), containsString("Apple")))

Qui,

  • findElement () individua un elemento e restituisce un Atom

  • webMatches è simile al metodo match

Scrivi un'applicazione di esempio

Scriviamo una semplice applicazione basata su WebView e scriviamo un test case utilizzando il metodo onWebView () . Segui questi passaggi per scrivere un'applicazione di esempio:

  • Avvia Android Studio.

  • Crea un nuovo progetto come discusso in precedenza e chiamalo MyWebViewApp .

  • Migrare l'applicazione al framework AndroidX utilizzando RefactorMigrate to AndroidX option menu.

  • Aggiungere la seguente opzione di configurazione nel file AndroidManifest.xml per concedere l'autorizzazione ad accedere a Internet.

<uses-permission android:name = "android.permission.INTERNET" />
  • Espresso web è fornito come plugin separato. Quindi, aggiungi la dipendenza nell'app / build.gradle e sincronizzala.

dependencies {
   androidTestImplementation 'androidx.test:rules:1.1.1'
   androidTestImplementation 'androidx.test.espresso:espresso-web:3.1.1'
}
  • Rimuovi il design predefinito nell'attività principale e aggiungi WebView. Il contenuto di activity_main.xml è il seguente,

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   xmlns:app = "http://schemas.android.com/apk/res-auto"
   xmlns:tools = "http://schemas.android.com/tools"
   android:layout_width = "match_parent"
   android:layout_height = "match_parent"
   tools:context = ".MainActivity">
   <WebView
      android:id = "@+id/web_view_test"
      android:layout_width = "fill_parent"
      android:layout_height = "fill_parent" />
</RelativeLayout>
  • Creare una nuova classe, ExtendedWebViewClient che estende WebViewClient ed eseguire l' override del metodo shouldOverrideUrlLoading per caricare l'azione di collegamento nella stessa WebView ; in caso contrario, aprirà una nuova finestra del browser all'esterno dell'applicazione. Inseriscilo in MainActivity.java .

private class ExtendedWebViewClient extends WebViewClient {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
      view.loadUrl(url);
      return true;
   }
}
  • Ora aggiungi il codice seguente nel metodo onCreate di MainActivity . Lo scopo del codice è trovare la WebView , configurarla correttamente e infine caricare l'URL di destinazione.

// Find web view
WebView webView = (WebView) findViewById(R.id.web_view_test);

// set web view client
webView.setWebViewClient(new ExtendedWebViewClient());

// Clear cache
webView.clearCache(true);

// load Url
webView.loadUrl("http://<your domain or IP>/index.html");

Qui,

  • Il contenuto di index.html è il seguente:

<html>
   <head>
      <title>Android Web View Sample</title>
   </head>
   <body>
      <h1>Fruits</h1>
      <ol>
         <li><a href = "apple.html" id = "apple">Apple</a></li>
         <li><a href = "banana.html" id = "banana">Banana</a></li>
         </ol>
   </body>
</html>
  • Il contenuto del file apple.html indicato in index.html è il seguente:

<html>
   <head>
      <title>Android Web View Sample</title>
   </head>
   
   <body>
      <h1>Apple</h1>
   </body>
</html>
  • Il contenuto del file banana.html indicato in banana.html è il seguente,

<html>
   <head>
      <title>Android Web View Sample</title>
   </head>
   
   <body>
      <h1>Banana</h1>
   </body>
</html>
  • Posiziona index.html, apple.html e banana.html in un server web

  • Sostituisci l'URL nel metodo loadUrl con l'URL configurato.

  • Ora, esegui l'applicazione e controlla manualmente se tutto va bene. Di seguito è riportato lo screenshot dell'applicazione di esempio WebView :

  • Ora apri il file ExampleInstrumentedTest.java e aggiungi la regola seguente:

@Rule
public ActivityTestRule<MainActivity> mActivityRule =
   new ActivityTestRule<MainActivity>(MainActivity.class, false, true) {
   @Override
   protected void afterActivityLaunched() {
      onWebView(withId(R.id.web_view_test)).forceJavascriptEnabled();
   }
};

Qui, abbiamo trovato la WebView e abilitato JavaScript della WebView perché il framework di test web espresso funziona esclusivamente tramite il motore JavaScript per identificare e manipolare l'elemento web.

  • Ora aggiungi il test case per testare la nostra WebView e il suo comportamento.

@Test
public void webViewTest(){
   onWebView()
      .withElement(findElement(Locator.ID, "apple"))
      .check(webMatches(getText(), containsString("Apple")))
      .perform(webClick())
      .withElement(findElement(Locator.TAG_NAME, "h1"))
      .check(webMatches(getText(), containsString("Apple")));
}

Qui, il test è stato eseguito nel seguente ordine,

  • trovato il collegamento, apple utilizzando il suo attributo id tramite il metodo findElement () e l' enumerazione Locator.ID .

  • controlla il testo del collegamento utilizzando il metodo webMatches ()

  • esegue un'azione di clic sul collegamento. Apre la pagina apple.html .

  • trovato di nuovo l'elemento h1 utilizzando i metodi findElement () e l' enumerazione Locator.TAG_NAME .

  • infine controlla di nuovo il testo del tag h1 usando il metodo webMatches () .

  • Infine, esegui il test case utilizzando il menu contestuale di Android Studio.