腾讯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中的类方法
相关文章
- Android手机的12非典型用途
- Android开发技术周报 Issue#17
- 数据挖掘与数据化运营实战
- 为什么Android使用弱加密算法?
- Ubuntu每日小技巧 – 深入理解应用菜单和按钮
- 大数据时代下的智能审计应用
- 2015年微信公众号媒体价值研究报告(42PPT)
- 2015CIC大数据应用论坛,诸多看点提前报
- 数据挖掘在金融风险预警中的应用
- 说说对React中受控组件和非受控组件的理解?应用场景?
- 云时代的应用性能管理(APM)
- 译是如何把深度学习“塞进”手机的?
- 面试官:说说对React refs 的理解?应用场景?
- Dotnet Core 优雅的命令行实现
- 2021物联网开发的十种编程语言
- 字节二面:什么是 trie 树以及应用
- 制作QQ微信支付宝三合一收款码
- 前端自动化测试:Jest 测试框架应用
- Android编程开发之性能优化技巧
- Android面试被问到内存泄漏了杂整?