http://fafeng.blogbus.com/logs/163634055.html
TMTS(Taobao Mobile Test System)是淘宝开发的一款Android浏览器应用的轻量级开源自动化测试框架,很明显它借鉴了
Robotium和
Selenium的Android driver。官方博客做了一个
表对比了它同Robotium和Android driver的特性,就从我目前的源码的阅读上来看,Android中访问网页其实现不如Android driver完善,如com.taobao.tmts.framework.viewelememt包中类JavascriptInterface的函数getResult们虽然也返回了javascript的值但并未对返回值进行处理,如转换成json等形式,估计其容错功能也没Android driver强;各种View的封装虽然很多,但没做到Robotium的那样抽象。为了能在浏览器中支持click事件,TMTS在包com.taobao.tmts.framework.viewelememt中的类TmtsWebView中的函数initJavascript中loadinitJavascript);其中final String initJavascript = "var e = document.createEvent('HTMLEvents');" +"e.initEvent('click', false, false);";调用则在包com.taobao.tmts.framework.viewelememt中的类TmtsWebElement中的函数click中loadJavascript("element.dispatchEvent(e)");。
下面以QA的形式来阐述若干问题。
下面以QA的形式来阐述若干问题。
一.为何Android浏览器程序自动化框架都要自己做一个浏览器?
如Selenium的Android driver和TMTS,我想原因有三:
1. Android的签名机制阻碍了黑盒instrument操控浏览器
2. 能够引用源码和反射。前者通过调用 findViewById能更方便地找到需要的View,后者可以通过反射更易于对浏览器进行操控
3. 易于绑定前端的javascript和后端的java代码,如TMTS在包com.taobao.tmts.framework.viewelememt的类TmtsWebView中先定义private final JavascriptInterface jInterface;再在函数initWebViewSettings(WebView webView)中绑定:webView.addJavascriptInterface(jInterface, "webdriver");TMTS在这点上有对Selenium的Android driver进行借鉴。
如Selenium的Android driver和TMTS,我想原因有三:
1. Android的签名机制阻碍了黑盒instrument操控浏览器
2. 能够引用源码和反射。前者通过调用 findViewById能更方便地找到需要的View,后者可以通过反射更易于对浏览器进行操控
3. 易于绑定前端的javascript和后端的java代码,如TMTS在包com.taobao.tmts.framework.viewelememt的类TmtsWebView中先定义private final JavascriptInterface jInterface;再在函数initWebViewSettings(WebView webView)中绑定:webView.addJavascriptInterface(jInterface, "webdriver");TMTS在这点上有对Selenium的Android driver进行借鉴。
二.如何保持自动化运行时屏幕常亮?
Android手机绝大多数都不能设置不休眠屏幕永远不黑,于是有了这个需求。Selenium的Android driver中采用在包org.openqa.selenium.android.server中的类JettyService中的类startServer:PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "IJetty");
wakeLock.acquire();然后在函数onDestroy中释放if (wakeLock != null) {
wakeLock.release();
wakeLock = null;
}
以上Api调用需要在AndroidManifest.xml中设置权限:“<uses-permission android:name="android.permission.WAKE_LOCK"/>”。但目前TMTS没有实现这个需求,不知道为何?我们这边的是写成了一个Service,但在部分机型上不起作用。
Android手机绝大多数都不能设置不休眠屏幕永远不黑,于是有了这个需求。Selenium的Android driver中采用在包org.openqa.selenium.android.server中的类JettyService中的类startServer:PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "IJetty");
wakeLock.acquire();然后在函数onDestroy中释放if (wakeLock != null) {
wakeLock.release();
wakeLock = null;
}
以上Api调用需要在AndroidManifest.xml中设置权限:“<uses-permission android:name="android.permission.WAKE_LOCK"/>”。但目前TMTS没有实现这个需求,不知道为何?我们这边的是写成了一个Service,但在部分机型上不起作用。
转载于:https://blog.51cto.com/memory/1188538