android|测量webView页面性能技术方案

测量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种方案大家自己看。。。
【android|测量webView页面性能技术方案】(当然,我自己更喜欢用第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

    推荐阅读