📜  Espresso测试框架-WebView

📅  最后修改于: 2020-12-06 09:37:37             🧑  作者: Mango


WebView是android提供的一种特殊视图,用于在应用程序内部显示网页。 WebView不能提供完善的浏览器应用程序的所有功能,例如chrome和firefox。但是,它可以完全控制要显示的内容,并公开要在网页内调用的所有android功能。它启用了WebView,并提供了一种特殊的环境,在该环境中,可以使用HTML技术和本机功能(如相机和拨号联系人)轻松设计UI。此功能集使WebView可以提供一种称为Hybrid application的新型应用程序,其中UI以HTML格式完成,业务逻辑以JavaScript或通过外部API端点完成。

通常,测试WebView会是一个挑战,因为它使用HTML技术作为其用户界面元素而不是本机用户界面/视图。 Espresso在这方面表现出色,为Web匹配器和Web断言提供了新的集合,这有意类似于本机视图匹配器和视图断言。同时,它还包括基于Web技术的测试环境,从而提供了一种均衡的方法。

Espresso Web建立在WebDriver Atom框架的基础上,该框架用于查找和操作Web元素。 Atom类似于查看操作。 Atom将在网页内进行所有交互。 WebDriver公开了一组预定义的方法,例如findElement()getElement()来查找Web元素并返回相应的原子(以在Web页面中执行操作)。

标准的网络测试语句类似于以下代码,

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

这里,

  • onWebView() -与onView()类似,它公开了一组API来测试WebView。

  • withElement() -使用Atom在网页中定位网页元素并返回WebInteration对象的几种方法之一,类似于ViewInteraction。

  • perform() -使用Atom在网页内执行操作并返回WebInteraction。

  • check() -这使用WebAssertion进行必要的断言。

样本Web测试代码如下,

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

这里,

  • findElement()找到一个元素并返回一个Atom

  • webMatchesMatch方法类似

编写示例应用程序

让我们编写一个基于WebView的简单应用程序,并使用onWebView()方法编写一个测试用例。请按照以下步骤编写示例应用程序-

  • 启动Android Studio。

  • 如前所述创建一个新项目,并将其命名为MyWebViewApp

  • 使用重构迁移AndroidX选项菜单将应用程序迁移到AndroidX框架。

  • AndroidManifest.xml文件中添加以下配置选项,以授予访问Internet的权限。


  • Espresso Web作为单独的插件提供。因此,将依赖项添加到app / build.gradle并进行同步。

dependencies {
   androidTestImplementation 'androidx.test:rules:1.1.1'
   androidTestImplementation 'androidx.test.espresso:espresso-web:3.1.1'
}
  • 在主要活动中删除默认设计,然后添加WebView。 activity_main.xml的内容如下,



   

  • 创建一个新类ExtendedWebViewClient扩展WebViewClient并重写shouldOverrideUrlLoading方法以在同一WebView中加载链接操作;否则,它将在应用程序外部打开一个新的浏览器窗口。将其放在MainActivity.java中

private class ExtendedWebViewClient extends WebViewClient {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
      view.loadUrl(url);
      return true;
   }
}
  • 现在,在MainActivity的onCreate方法中添加以下代码。该代码的目的是找到WebView ,正确配置它,然后最终加载目标URL。

// 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:///index.html");

这里,

  • index.html的内容如下-

Android Web View Sample
   
   
      

Fruits

  1. Apple
  2. Banana
  • index.html中引用的apple.html文件的内容如下-

Android Web View Sample
   
   
   
      

Apple

  • 所述banana.html文件的内容称为在banana.html如下,

Android Web View Sample
   
   
   
      

Banana

  • 将index.html,apple.html和banana.html放置在Web服务器中

  • 用您配置的网址替换loadUrl方法中的网址。

  • 现在,运行该应用程序并手动检查一切是否正常。以下是WebView示例应用程序的屏幕截图-

WebView示例

  • 现在,打开ExampleInstrumentedTest.java文件并添加以下规则-

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

在这里,我们发现了的WebView并启用的WebView的JavaScript的,因为咖啡的Web测试框架的工作原理完全通过JavaScript引擎识别和操纵网页元素。

  • 现在,添加测试用例以测试我们的WebView及其行为。

@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")));
}

在这里,测试按以下顺序进行,

  • 通过findElement()方法和Locator.ID枚举使用其id属性找到了苹果的链接。

  • 使用webMatches()方法检查链接的文本

  • 在链接上执行点击操作。它将打开apple.html页面。

  • 再次使用findElement()方法和Locator.TAG_NAME枚举找到了h1元素。

  • 最后再次使用webMatches()方法检查h1标签的文本。

  • 最后,使用android studio上下文菜单运行测试用例。