测量webView页面性能(使用UiAutomator和性能监控工具)
背景:
俺双11会场测试的总指挥想要确认,在猫客的webview中填多少坑位合适,所以进行了如下操作并获取性能:
1,进入webview页面滑动到底部,然后再快速回到顶部,
2,点击顶部的banner进入下级页面,
3,页面深度3层,即重复1,2该操作3次。
采用的技术
需求拆分为2部分,webview控制脚本和性能监控。
脚本 UiAutomator
因为猫客的自动化采用UiAutomator实现,已经提供了很多封装方法,修改起来比较快。
缺点: UiAutomator 不能识别webview的元素,所以判断滑动到底部,滑动到顶部,点击顶部banner这几个操作难点需要突破。
性能数据采集
有3种方案:
1,猫客内嵌入了性能测试模块,打包时配置MONITOR_OPEN=true,然后让监控开启即可。不方便之处是不能实时显示
2,请参见 http://blog.csdn.net/kittyboy0001/article/details/47317855
3, 安装易测客户端或者其他第三方能够监控性能的app或者工具取数据
webview 控制脚本
进入webview
通过am start进入webview
am start -a android.intent.action.VIEW -d urixxxx
滑动操作
因为页面上没有支持 UiScrollable 元素,所以没法使用如下方式:
UiScrollable scrollable = new UiScrollable(new UiSelector().scrollable(true));
if (scrollable.exists()) {
boolean isScrolled = scrollable.scrollForward(maxSteps);
}
采用土办法,但是更有效的:
ScreenWidth = mDevice.getDisplayWidth();
ScreenHeight = mDevice.getDisplayHeight();
public void swipeUp() {
int startX = ScreenWidth/2;
int endX = startX;
int startY = ScreenHeight/2;
int endY = ScreenHeight/4;
mDevice.swipe(startX, startY, endX, endY, STEP_NUM);
}
判断到达顶部和底部
因为取得不到webview的元素,所以采用了一个笨办法,截屏。在滑动操作前后保存截屏数据,当2次的内容相同,则认为滑动到头了。
但是遇到一个问题,webview页面填的内容很多,滑动过程会出现卡顿。当在卡顿时滑动是不起作用的,因此前后2次截屏内容相同,都是卡住的页面,会导致判断错误。
为了解决这个问题,最初采用了延长每次操作后的等待时间来解决,但是这样太浪费时间…
public void scrollDown() {
log("下拉");
while(true){
swipeUp();
sleep(5000);
if(isSame()) break;
}
}
后来优化采用了判断3次是否相同来解决,效果不错
public void scrollDown() {
log("下拉");
while(true){
swipeUp();
sleep(1000);
if(isSame()){ // 进行截屏,判断两次截屏是否相同,
sleep(1500); // 如果相同,做滑动操作,然后重新判断
swipeUp(); // 重复3次
sleep(1500); // 如果3次判断都是相同,则不是卡顿
if(isSame()){ // 经验值,卡顿达不到这么长时间
swipeUp();
sleep(1500);
if(isSame()){
break;
}
}
}
}
}
截屏和判断的程序如下:
public void takeScreenshot(String path){
File pic = new File(path);
boolean ret = mDevice.takeScreenshot(pic);
}
public boolean isSame(){
String path = "/data/local/tmp/Screenshot.png";
takeScreenshot(path);
if(bmp0!=null)
bmp1 = bmp0.copy(Bitmap.Config.ARGB_8888, true);;
bmp0 = BitmapFactory.decodeFile(path);
bmp0 = bmp0.copy(Bitmap.Config.ARGB_8888, true);
if(bmp0!=null && bmp1!= null && bmp0.sameAs(bmp1))
return true;
return false;
}
点击顶部 banner
还是因为取得不到webview的元素,所以采用了一个笨办法。因为banner 是webview上的第一个元素,所以先判断顶部工具条的高度,然后再加上页面布局元素的间隙的大小,就是banner 的位置。点击这个位置!
public void clickBanner() {
UiCollection colls = new UiCollection(new UiSelector().className("android.widget.LinearLayout"));
try {
UiObject topCat = colls.getChildByInstance(new UiSelector().className("android.widget.LinearLayout"),2);
Rect rect = topCat.getBounds(); //获取顶部工具条的位置
mDevice.click(ScreenWidth/2,rect.bottom + 30); //点击下面30像素中间位置
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
mDevice.waitForIdle();
}
第一部分 OK了
取得性能数据
有3种方案:
1,猫客内嵌入了性能测试模块,打包时配置MONITOR_OPEN=true,然后让监控开启即可。不方便之处是不能实时显示成图表~
2,请参见http://blog.csdn.net/kittyboy0001/article/details/47317855
3, 安装易测客户端 http://easytest.taobao.com
这里只对第一种方案做说明,剩下2种方案大家自己看。。。
(当然,我自己更喜欢用第2种方案,因为这个是我自己做的,哈哈哈)
性能监控方案一
在猫客的测试模块中嵌入了一个性能监控的服务,可以监控app运行时的各种参数,在业界有很多独立的app可以做这种动作,嵌入的好处是可以直接使用不用再独立安装。打包时配置MONITOR_OPEN=true 可以让该模块能够生效。
通过如下命令启动服务
am startservice -a com.xxx.action.AUTOTEST --ei frequency 1 --es caseId
xxxCaseId --es caseName xxxCaseName --es reportIp xx.xx.xx.xx --ez socketMethod false --ei reportPort 80
监控结束时调用如下命令,将测试数据回传到服务器查看
am startservice -a com.xxx.action.SHUTDOWN
在我们的测试用例中封装了一个测试类PerformanceTest
来负责这个动作。
有想了解使用的请联系 XXX
done
版权声明:本文为博主原创文章,未经博主允许不得转载。