且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

腾讯Android自动化测试实战3.3.3 修改Robotium以支持X5WebView

更新时间:2022-06-03 21:09:15

3.3.3 修改Robotium以支持X5WebView

本节中的X5WebView指QQ浏览器团队出品的腾讯X5内核中的WebView。除了QQ、微信、应用宝等众多腾讯内部产品在使用X5内核外,京东、58同城等众多腾讯外部的合作伙伴也在使用X5内核。

腾讯X5网站:http://x5.tencent.com/。

然而Robotium本身并不支持获取X5WebView中的元素,因此无法对使用了X5内核的Web页面进行自动化测试,而通过3.2.2节中介绍的Robotium支持WebView原理可知,只要对Robotium稍加改造,即可使用同样的原理获取WebElement对象,完成对X5WebView自动化的支持。

这里再概述一下Robotium支持WebView的过程,以便理解为何Robotium不支持X5以及如何修改。

步骤1:获取目标WebView。

如代码清单3-13所示,代码final WebView webView = viewFetcher.getFreshestView (viewFetcher.getCurrentViews(WebView.class));调用ViewFetcher类获取当前界面中的WebView,而该WebView是android.webkit.WebView。

步骤2:做执行JS前的准备工作。

如代码清单3-13所示,final String javaScript = prepareForStartOfJavascriptExecution();调用prepareForStartOfJavascriptExecution(),该方法还调用了如代码清单3-22所示的代码,将WebSettings是否允许执行JS设置为True(系统默认是False)。然后还设置了WebView的WebChromeClient(WebChromeClient用于辅助WebView处理Javascript的对话框、提示框等)。从这里可以看出Robotium使用的是继承自android.webkit.WebChromeClient的RobotiumWebClient。

代码清单3-22 RobotiumWebClient.enableJavascriptAndSetRobotiumWebClientd

/**

 * Enables JavaScript in the given {@code WebViews} objects.

 *

 * @param webViews the {@code WebView} objects to enable JavaScript in

 */

 

public void enableJavascriptAndSetRobotiumWebClient(List<WebView> webViews, WebChromeClient originalWebChromeClient){

    this.originalWebChromeClient = originalWebChromeClient;

 

    for(final WebView webView : webViews){

 

        if(webView != null){

            inst.runOnMainSync(new Runnable() {

                public void run() {

                   //WebSettings开启JS

                    webView.getSettings().setJavaScriptEnabled(true);

                    webView.setWebChromeClient(robotiumWebClient);

 

                 }

            });

        }

    }

}

步骤3:在指定WebView中执行相应JS。

如代码清单3-13所示,最后调用webView.loadUrl("javascript:" + javaScript + function);方法在指定的WebView中执行相应片段的JS代码。

从以上核心步骤中可以看出,Robotium不支持X5的原因在于,首先,其获取目录WebView时,是获取android.webkit.WebView中的WebView;其次,辅助处理JS的WebChromeClient也是继承自android.webkit.WebChromeClient。而X5内核中的WebView并不是继承自android.webkit.WebView,X5内核中的WebChromeClient也不是继承自android.webkit.WebChromeClient,因此Robotium没法获取X5内核中的目标WebView,也就没法在目标WebView中执行JS并提取WebElement元素。了解个中缘由后,就可以稍加改造以支持X5WebView。

如图3-15所示为以外部引用(即该jar包的类并不实际打包进测试工程,仅在IDE调试时用。当调用相应的类时,寻找的是被测工程中的相应的类)的方式导入X5提供的SDK。

 

图3-15 导入X5提供的SDK

在获取目标WebView时,相应地修改成X5 SDK中的WebView。如图3-16所示,获取目标WebView时修改为com.tencent.smtt.sdk.WebView。

 

图3-16 修改目标WebView

同样地,修改WebChromeClient为继承自com.tencent.smtt.sdk.WebChromeClient中的TxWebChromeClient,然后在WebView中设置WebChromeClient时使用TxWebChromeClient,如图3-17所示。

 

图3-17 修改目标WebChromeClient

对于其他有相应的WebView或WebChromeClient调用的地方,均修改成X5 SDK中对应的WebView及WebChromeClient,修改完成后,将相应的类带上前缀以便区分,如图3-18所示。

 

图3-18 修改后的类

当需要获取使用了X5内核的Web元素时,调用TxWebUtils类中的相应方法即可。如图3-19所示,与Robotium原有的WebUtils使用方法一致,至此,完成了对X5内核的支持。

 

图3-19 TxWebUtils中的类方法