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

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中的类方法

时间: 2024-11-05 14:52:04

腾讯Android自动化测试实战3.3.3 修改Robotium以支持X5WebView的相关文章

腾讯Android自动化测试实战3.2.1 Robotium支持Native原理

3.2.1 Robotium支持Native原理 1. 获取控件原理 我们知道Android会为res目录下的所有资源分配ID,例如在布局xml文件中使用了 android:id="@+id/example_id",那么在Android工程编译时就会在R.java中相应地为该布局控件分配一个int型的ID,在Android工程中就可以通过Activity.Context或View等对象调用findViewById(int id)方法引用相应布局中的控件.因此,在测试工程中,如果是在源码

腾讯Android自动化测试实战3.1.2 Robotium提供的类

3.1.2 Robotium提供的类 Robotium对外主要提供以下几个类: By:Web元素的选择器. Condition:接口类,用于等待. RobotiumUtils:工具类. Solo:对外提供各种API. Solo.Config:Solo配置类. SystemUtils:系统级工具类. TimeOut:Solo配置类. WebElement:Web元素的抽象类. 其中Solo类是主要对外提供各种API的类,Solo类采用中介者模式,持有com.robotium.solo包下的其他类的

腾讯Android自动化测试实战

腾讯Android自动化测试实战 丁如敏 盛娟 等著 图书在版编目(CIP)数据 腾讯Android自动化测试实战 / 丁如敏等著. -北京:机械工业出版社,2016.10 ISBN 978-7-111-54875-1 Ⅰ. 腾-   Ⅱ. 丁-   Ⅲ. 移动终端-应用程序–程序设计   Ⅳ. TN929.53 中国版本图书馆CIP数据核字(2016)第223713号 腾讯Android自动化测试实战 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037) 责任编辑:

腾讯Android自动化测试实战导读

前 言 Preface 为什么要写这本书 早在2010年年底,我们团队就有出一本关于移动互联网测试书籍的计划(那时候移动互联网测试书籍基本没有),当时计划的内容涉及面比较广,涵盖测试设计.测试用例管理.测试流程.自动化测试.专项测试等领域.不过,由于各种原因被搁浅,确实有点儿可惜,否则移动互联网测试国内的第一本书当时就面世了.这次终于又有机会整理这些年的测试经验并形成一本书了,借此可以跟业界的同行一起交流切磋. TMQ(Tencent Mobile Quality)腾讯移动品质中心,是腾讯内部最

腾讯Android自动化测试实战1.1 Android自动化测试框架概述

1.1 Android自动化测试框架概述 2007年Android开源时,Monkey.Instrumentation和MonkeyRunner这3个测试框架,是跟Android源码一起发布的,这也是最早可用的自动化测试框架,那几年大家基本都是用这些框架来开展自动化相关测试工作的.2010年,第一个第三方的测试工具Robotium(基于Instrumentation)发布了,不少测试人员就转用这个框架,Robotium社区逐步发展起来.图1-1所示为Robotium热度随时间变化的趋势. 201

腾讯Android自动化测试实战第2章

第2章 自动化测试框架及应用领域综述 近几年,随着移动互联网的快速发展,智能终端的App应用越来越广,Android测试技术也备受重视,新的终端自动化测试框架层出不穷,本章笔者就自动化测试的入门知识及其应用做一个浅显的梳理与总结,与读者一同探讨移动终端自动化测试思路和方案.同时,本书主要也是围绕本章节提到的基础框架及其应用场景进行实战分析与演练,以亲身体验总结出实际项目经验,给准备实施或正在实施自动化测试的读者提供一些帮助和建议. 自动化测试在软件测试的各大沙龙.行业峰会以及培训课程中都是一个热

腾讯Android自动化测试实战2.1.2 自动化测试框架基本原理

2.1.2 自动化测试框架基本原理 经过前面的一个简单的自动化测试案例,我们对Android的自动化测试有了一个感性的认识,很多有相关工作经验的测试同学也都会理解,这和PC的自动化测试思路是相通的,只不过所借助的框架不同,目前业界已经有很多成熟的开源Android端自动化测试框架,经常用到的框架代表有Robotium和UI Automator,各个框架可能在具体应用上有些不同,如有些偏稳定性,有些适用于Web应用,有些能支持跨应用,等等,但其主要思想是通过控件的位置.名称.属性等获取控件对象,并

腾讯Android自动化测试实战第3章

第3章 Robotium框架工作原理及实践 2010年,当Android还处于发展早期时,拥有丰富自动化测试经验的Renas Reda创建了Robotium项目,在Robotium发展到4.0版本时开始支持App中的Web自动化,经过几年的发展,Robotium现在已经是一款成熟.全面.稳定的自动化测试框架.更重要的是,Robotium是一款开源的测试框架,在世界各地都有活跃的贡献者对其进行更新与维护,因此,无须担心将来Robotium会随着Android的发展而变得不可用.不易用,相反,Rob

腾讯Android自动化测试实战3.3.2 ListView列表遍历

3.3.2 ListView列表遍历 编写Android端的自动化测试用例,最常见的控件有ListView,而要想测试ListView,就必然要涉及ListView的遍历. 关于ListView的遍历,可能首先想到的是类似如代码清单3-20的实现方式. 代码清单3-20 设想中的列表遍历 for(int i=0;i<listView. getCount();i++){     listView.getChildAt(int index);     --; } 但是,在Android中,对于lis