uiautomator中踩过的坑

String szItem = m_softwareItems.get(nIndex);       		
UiObject item = softwareItems.getChildByText(new UiSelector().className("android.widget.LinearLayout"), szItem);
if(item != null && item.exists()) 。。。
这段代码在相应的项不存在的时候,会弹出异常,然后程序直接终止。但我们的逻辑是如果不存在就略过,流程还需要继续走下去。然后我尝试添加try 捕获异常,但还是不行,最后发现,捕获异常的同时,加个空指针判断,就能够避免程序退出了,最后的代码是这样:

UiObject item = null;
try
{
    String szItem = m_softwareItems.get(nIndex);
    item = softwareItems.getChildByText(new UiSelector().className("android.widget.LinearLayout"), szItem);
}
catch(UiObjectNotFoundException e)
{	
}
             
if(item != null && item.exists())

一定要判断是否为null。

测试类函数中一般都继承异常声明,但一定注意,如果发生异常,没有手动去捕获,程序会立即退出的。因此如果不希望程序退出的话,用try来捕获异常比较合适。


jar包中是可以识别手机上的中文字符的,网上有些博客说不能其实是错误的,通过设置工程-属性-资源-文本文件编码 为UTF-8就可以进行中文的识别,但是注意,我们从命令行看的时候,显示的是乱码,这个只是显示问题。

uiautomator中踩过的坑_第1张图片


jar的执行函数是以test为开头命名的函数。如果内部的函数开头不是test(我之前写成了Test),jar是不会模拟点击的。如果有多个test开头的函数,则根据test后面字母的ASCII码的顺序依次执行。所以上述的两个函数,先执行testDemo1,再执行testDemo2.


代码中需要对某个txt文件进行读操作,于是写了如下代码:

FileReader fr = new FileReader(DIR + filename);
BufferedReader bf = new BufferedReader(fr);
String str = null;
while ((str = bf.readLine()) != null) 
但是却提示错误,

uiautomator进程一般只有一个,比如一个jar中有两个测试类,启动其中一个,在它运行的过程中,如果另一个启动了,则前一个自动退出(windows下测试正常,盒子上会提示进程已被注册,必须手动杀死才行)。


对于ListView控件,其实是可以进行遍历的,用UiScrollable获取一个ListView控件的列表,然后getChildCount是返回当前视线内的元素个数,注意是当前视线,不在屏幕上的,不算在内,用getChildByInstance进行遍历,第二个参数指明是第几个元素,注意,这里也是当前视线。这样就会有个问题,只对当前视线进行遍历。我做过测试,发现当前视线也不是很准确,比如当前其实有10行,但遍历到6,7行就认为遍历完了。


屏幕模仿滑动的时候,使用的是swipe方法,从左到右和从右到左,比如getUiDevice().swipe(0, nheight / 2, nwidth , nheight / 2, 10);  但是这样发现有一些问题,就是向左滑的太快了,小米手机是这样,华为没有这种现象。于是就想了办法,不从边缘开始 getUiDevice().swipe(1, nheight / 2, nwidth - 1, nheight / 2, 10); 改成这样就正常了。

后来发现这样修改也不行。原来是presshome搞得鬼,有的手机点击就留在当前,有的会跳到日历那个桌面上。


华为智能桌面的问题,我的华为手机如果安装智能桌面后,程序中调用presshome就会直接呼出华为桌面,而另一台华为手机则不会,这导致不能在代码中使用presshome

你可能感兴趣的:(uiautomator中踩过的坑)