UIAutomator自动化知识点

  1. 输入命令:adb shell ps     查看当前正在运行的uiautomator的进程

    输入如下命令:

    adb shell 

    ps | grep uiautomator
  2. 注意返回的信息

    第一个数字,即是uiautomator的进程号

  3. 3

    拿出大招,kill 结束进程

    敲入:

    adb shell 

    kill [刚才查到的进程号]

    adb shell 

    kill 4444

UiObject browserobject = new UiObject(new UiSelector().text("浏览器"));//找到名为浏览器的图标
browserObject.clickAndWaitForNewWindow();//等待一个新窗口响应
UiObject browserobject = new UiObject(new UiSelector).className("包名")//找到Class
editObject.ckick();//点击
UiDevice.getInstance().pressDelete();//按删除键
editObject.setText("文本")//输入文本
UiDevice.getInstance().pressEnter();//点击回车键
sleep(2000);//延迟两秒

//模拟home键
public void testHomeScreen(){

    Intent i= new Intent(Intent. ACTION_MAIN);

    i.setFlags(Intent. FLAG_ACTIVITY_NEW_TASK);

    i.addCategory(Intent. CATEGORY_HOME);

    startActivity(i);
}


生成测试jar android create uitest-project -n abc -t 1 -p E:\AndroidProject\Test2
-n 为生成的jar名,-t为使用第几个SDK -p为生成JAVA项目的路径
将包放入手机 adb push 文件路径 /data/local/tmp/
运行测试文件 adb shell uiautomator runtest demo.jar -c com.jikexueyuan. Test
demo.jar 为测试包名 -c为完整包名方法名


waitForWindowUpdate(final String packageNamelong timeout)


等待符合packageName的应用触发 AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED时间,在timeout时间内不触发,报timeoutException错误。


sleep()


如果当前屏幕不处于睡眠状态,那么就按power键让设备睡眠返回true。如果处于睡眠,无操作,返回false。


isScreenOn()


获得屏幕的状态,如果处于睡眠返回false.否则返回true.


wakeUp()


唤醒屏幕,0.5秒内不接受任何操作


setOrientationNatural()


设置设备向右旋转,并且在该方向上冻结传感器。


setOrientationRight()


将设备安置在右边,然后冻结


setOrientationLeft()


将设备安置在左边,然后冻结


freezeRotation()


unFreezeRotation()


冻结与解冻


isNaturalOrientation()


判断屏幕是否处于水平



以上几个方法跟游戏操控有关系。平常做系统app测试,运用不到。


setWatcherTriggered(String watcherName)


设置Watcher触发器


hasAnyWatcherTriggered()


是否存在watcher触发器


hasWatcherTriggered(String watcherName)


是否存在某一watcher触发器


resetWatcherTriggered()


重置watcher触发器


runWatchers()


启动所有watcher


removeWatcher(String watcherName)


移除某一watcher


registerWatcher(String watcherName)


注册watcher


getCurrentPackageName()


得到当前应用包名


getCurrentActivityName()


得到当前界面的activity名


waitForIdle()/waitForIdle(long timeout)


等待界面空闲0.5秒,timeout为时间限制,默认为10秒。


swipe(point[] segments,int segmentSteps)


从point数组中的第一个点到第二个点,第二个点到第三个点,依次拖拽到各点,形成一条条折线,每条直线所有步伐为segmentSteps.这和android手势密码解锁很有用


swipe(int startX,intStartY,int endX,int EndY,int steps)


从起始点滑动到结束点,所用步伐为steps


pressRecentApp()


暂时未知


pressKeyCode(int keycode)


KeyEvent   手机键盘上的值,ABCDEFG,1234567等都可以按


pressEnter()


小键盘Enter键按下


pressDelete()


按下删除键,删除一格


pressDPadRight()/pressDPadLeft()/pressDPadDown()/pressDPadUp()/pressDPadCenter()


方向键的上下左右中


pressSearch()/pressHome()/pressBack()/pressMenu()


键盘上的搜索键,home键,返回键,菜单键


getLastTraversedText()/clearLastTraversedText()


得到/清除最后一次遍历得到的文本


getProductName()


设备名


getDisplaySizeDp()


得到设备的实际宽度

android系统如何自适应屏幕大小

Android 获取屏幕实际显示尺寸的方法


getInstance()


单例模式


isInWatcherContext()


watcher是否正在运行


getAutomatorBridge()


得到链接设备的桥类

UiObject为所有对象类的父类,UiCollection/UiScrollable都继承与该类。UI界面上能操作的都可以称为UiObject.

 

exists()/waitForExists(long timeout)

 

判断是否存在/在一定时间内是否等到该控件出现。

 

waitUntilGone(long timeout)

 

在一定时间内判断控件是否消失。

 

getBounds()/getVisibleBounds()/getVisibleBounds(AccessibilityNodeInfo node)

 

得到控件的区域rect/获得当前控件可见区域/获取某一个控件的可见区域。在可滚动的控件中的子控件,getVisibleBounds和getBounds是不一样的。一个代表实际区域,一个代表用户可以看见的区域

 

getPackageName()

 

当前控件的packageName名

 

isLongClickable/isScrollable/isFocusable/isFocused()/isClickable()/isEnable()/isChecked()/isSelected()

 

是否可长点击/滚动/可获得焦点/获得焦点/点击/可用/开关已开/已选择

 

clearTextField()

 

在可编辑控件的(rect.left,rect.centerY)点长按,如果出现"select all"点击选择所有,清楚文本。

 

setText(String text)

 

在输入框中输入text,可能会由于输入法的不同跟你填入的字符串不同。先删除原有的,然后点击输入框,输入text.

 

getContentDescription()/getText()

 

得到content-desc的值/得到文本框里的值

 

longClickTopLeft()/longClick()/clickBottomRight/longClickBottomRight/clickTopLeft

 

长按控件边框的左上角/长按控件边框的中心/点击控件边框的右下角/长按控件边框的右下角/点击控件边框的左上角(距边框5个像素点)

 

clickAndWaitForNewWindow()/clickAndWaitForNewWindow(long timeout)

 

点击控件等待新窗口的出现/有时间限制的等待,默认为5.5秒

 

click()

 

在控件的中心点点击

 

getScrollableParent(AccessibilityNodeInfo info)

 

等待当前控件的可滚动的父控件

 

swipeLeft(int steps)

 

从距右边框5个像素点的位置滑动到距左边框5个像素点的位置,所用步伐为steps.Y坐标为控件的中心点Y坐标

 

swipeRight(int steps)

 

同上,方向相反

 

swipeDown(int steps)

 

从距上边框5个像素点的位置滑动到距下边框5个像素点的位置,所用步伐为steps,X坐标为控件的中心点坐标

 

swipeUp(int steps)

 

同上,方向相反

 

findAccessibilityNodeInfo(long timeout)

 

得到当前控件的AccessibilityNodeInfo对象

 

getChildCount()

 

得到控件的子控件个数,就是在树形结构中的下一层节点排列的所有子节点,后面的层级不算在内。包括滚动栏里没显示的控件调用的是AccessibiltyNodeInfo.getChildCount()方法

 

getFromParent(UiSelector uiSelector)

 

从当前控件的父节点中找到符合选择器条件的控件UiObject对象

 

getChild(UiSelector uiSelector)

 

在该控件的子子孙孙中找到符合选择器条件的控件

 

getInteractionController()

 

得到InteractionController对象

 

getQueryController()

 

得到QueryController对象

 

getSelector()

 

得到当前控件的UiSelector对象

uiautomator中UiSelector学习笔记(3)

UiSelector为条件器,你在获得一个UiObject/UiCollection/UiScrollable对象时都要传入这样一个UiSelector对象进去。UiSelector对象里的方法就是添加各种条件。

 

text(String text)/textStartsWith(String text)/textContains(String text)

 

设置Text等于text字符串/以text字符串开始/包含text字符串


 description(String desc)/descriptionStartsWith(String desc)/descriptionContains(String desc)


设置Content-desc的值为desc/以desc开始/包含desc


selected(boolean val)/scrollable(boolean val)/checked(boolean val)/clickable(boolean val)/enabled(boolean val)/focusable(boolean val)/focused(boolean val)

 

设置selected/scrollable/checked/clickable/enabled/focusable/focusable/focused属性

 

index(int index)/instance(int instance)/packageName(String name)/className(String className)

 

设置index/instance/packageName/className属性值


buildSelector(int selectorId,Object  selectorValue)

 

 返回的还是UiSelector对象,传入的参数都会放在UiSelector中的变量mSelectorAttributes中,该变量为一个SparseArray数组中。


childSelector(UiSelector selector)


设置SELECTOR_CHILD的值


patternSelector(UiSelector selector)


设置SELECTOR_PATTERN的值


containerSelector(UiSelector selector)


设置SELECTOR_CONTAINER的值


fromParent(UiSelector selector)


设置SELECTOR_PARENT的值


cloneSelector()


复制当前UiSelector,产生一个新的UiSelector。


patternBuilder(UiSelector selector)/patternBuilder(UiSelector contain,UiSelector pattern)


暂时未知(用2个已知的匹配器构建出复杂的匹配器,得到的新匹配器要同时符合传进来的2个匹配器?)


getChildSelector()


在hashMap得到以SELECTOR_CHILD为key值的Selector对象


getPatternSelector()


在hashMap得到以SELECTOR_PATTERN为key值的Selector对象


getContainSelector()


在hashMap得到以SELECTOR_CONTAINER为key值的Selector对象

 

getParentSelector()


在hashMap得到以SELECTOR_PARENT为key值的Selector对象

 

 getInstance()


得到key=9个的值,整数值。找不到的话返回0


getString(int criterion)/getBoolean(int criterion)/getInt(int criterion)


得到key=criterion的值,找不到返回null/false/0


isMatchFor(AccessibilityNodeInfo info,int index)


判断info是否符合该匹配器所匹配的控件,index匹配SELECTOR_INDEX的值


matchOrUpdateInstance()


SELECTOR_INSTANCE和SELECTOR_COUNT是否相等,如果不相等就更新SELECTOR_COUNT的值


isLeaf()


方法名为叶子,看源码意思就是是否存在子节点和父节点。


hasChildSelector()/hasPatternSelector()/hasParentSelector()/hasContainerSelector()


存放属性的SparseArray对象是否包含SELECTOR_CHILD/SELECTOR_PATTERN/SELECTOR_PARENT/SELECTOR_CONTAINER对象


getLastSubSelector()


获得SELECTOR_CHILD对象,如果没有则获得SELECTOR_PARENT对象。深度遍历直到不存在SELECTOR_CHILD或SELECTOR_PARENT.返回该对象

uiautomator中UiCollection学习笔记(4)

4.1版本


UiCollection继承UiObject。例如listView就可以作为UiCollection对象,然后通过获得子控件的方法获得里面的子子孙孙控件


getChildCount(UiSelector selector)


在属性结构中找寻符合selector选择器的控件。即在当前collection的子子孙孙中计算控件数


getChildByText(UiSelector childPattern,String text)


在子子孙孙中找寻符合selector选择器的控件,且该控件的文本值要和传递进来的值相等.


getChildByInstance(UiSelector childPattern,int instance)


通过instance值和selector选择器找寻控件


getChildByDescription(UiSelector childPattern,String desc)


通过desc和selector获取控件

uiautomator中的UiScrollable学习笔记(5)

4.1版本


UiScrollable继承UiCollection类。所以作为UiCollection和其父类UiObject类里的方法,UiScrollable都具有,且看它有哪些新扩展的新方法


scrollIntoView(UiSelector selector)


滑动到指定控件,先判断当前控件是否在当前界面出现,如果当前界面就存在那么就直接返回。如果当前界面不存在,则先滚动动开始,从开始位置一步一步向前滑动,直到结束,在此过程中找到控件就立即返回。


scrollTextIntoView(String text)/scrollDescriptionIntoView(String desc)


都是通过scrollIntoView方法查找控件,只是以text/desc作为条件查找。


scrollForward(int steps)/scrollForward()


向前滑动,如果控件滑动方向是垂直的,从下滑到上。如果是横向的,从右滑倒左。一共用steps步,每步5ms。默认为55


scrollBackward(int steps)/scrollBackward()


向后滑动,与上面的方法相反


scrollToBeginning(int maxSearchSwipe)/scrollToBeginning(int maxSearchSwipe ,int steps)


调用scrollForward(int),滚动次数为maxSearchSwipe。


scrollToEnd(int maxSearchSwi)/scrollToEnd(int maxSearchSwipe ,int steps)


方法内调用scrollBackward(int steps),滚动次数为maxSearchSwipe。


setAsHorizontalList()/setAsVerticalList()


滚动方向设置


setMaxSearchSwipes(int size)/getMaxSearchSwipes()


设置、获得最大滑动的次数


setSwipeDeadZonePercentage(double zone)/getSwipeDeadZonePercentage()


设置/获得点击盲区的百分比


flingForward()/flingBackward()/flingToBeginning(int)/flingToEnd(int)


向前飞划/向后飞划/向前飞划/向后飞划

uiautomator中UiWatcher学习笔记(6)

4.1版本


UiWatcher接口就一个方法


checkForCondition()


我们可以为一个UiObject注册一个UiWatcher,通过UiDevice.registerWatcher()方法。UiWatcher前辈总结文章。UiWatcher处理一些在ui测试过程中一些突发情况,这时候可以通过在checkForCondition做一些处理。让它返回到正常情况,继续让case跑下去。

uiautomator中AccessibilityNodeInfoDumper学习笔记(7)

4.1版本


accessibilityCheck(AccessibilityNodeInfo)


当nodeinfo对象满足可点击、可用,且desc和text都为空的情况下,返回false。有一项不符合就返回true.


dumpNodeRec(AccessibilityNodeInfo,XmlSerializer,in)


将界面UI控件信息序列化写到xml文件中。


dumpWindowToFile(AccessibilityNodeInfo)/dumpWindowToFile(AccessibilityNodeInfo,File)


将节点信息配置保存到xml文件里。默认文件为data/local/window_dump.xml


excludedClass(AccessibilityNodeInfo)


想要了解该方法,先看EXCLUDED_CLASSES,为String[],包含LinearLayout\ListView\RelativeLayout.该方法就是判断传入的对象的className是否以其中的元素结尾。


stripInvalidXMLChars(CharSequence)


剔除无效的unicode字符:


[#x1-#x8], [#xB-#xC], [#xE-#x1F], [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF],
[#x1FFFE-#x1FFFF], [#x2FFFE-#x2FFFF], [#x3FFFE-#x3FFFF],
[#x4FFFE-#x4FFFF], [#x5FFFE-#x5FFFF], [#x6FFFE-#x6FFFF],
[#x7FFFE-#x7FFFF], [#x8FFFE-#x8FFFF], [#x9FFFE-#x9FFFF],
[#xAFFFE-#xAFFFF], [#xBFFFE-#xBFFFF], [#xCFFFE-#xCFFFF],
[#xDFFFE-#xDFFFF], [#xEFFFE-#xEFFFF], [#xFFFFE-#xFFFFF],
[#x10FFFE-#x10FFFF].

uiautomator中InteractionController学习笔记(8)

4.1版本


InteractionController将用户的键盘事件注入到android系统中,与系统进行交互(电视为什么不能设计成可组装,屏幕多大自己决定,想 多大就多大)


click(int,int)


在某点点击。


clickAndWaitForNewWindow(int,int,long)


点击某点,得带界面信息变化


freezeRotation()/unFreezeRotation()/isNaturalRotation()/setRotationLeft()/setRotationNatural()/setRotationRight()


这些方法在UiDevice里同样存在,名称也是一样的,不再解释,可以返回UiDevice参考。


getSystemLongPressTime()


通过ContentProvider从系统中获得长安时间


injectEventSync(InputEvent)


将用户的输入时间注入到系统中


isScreenOn()


判断屏幕是后点亮


longTap(int,int)


长按某一点


scrollSwipe(int,int,int,int,int)


sendKey(int,int)


发送键盘事件


sentText(String)

发送字符串

sleepDevice()/wakeDevice()

如果屏幕是亮的,则按power键让屏幕休眠/与sleep相反

swipe(Point[],int)

与UiDevice相同

swipe(int,int,int,int,int)

与UiDevice相同

touchDown(int,int)/touchMove(int,int)/touchUp(int,int)

按下/拖动/抬起。


uiautomator中QueryControlller学习笔记(9)

4.1版本


QueryController主要是给UiSelector提供服务的类,将条件传入系统去查询AccessibilityNodeInfo信息。包访问权限,不提供给用户调用


clearLastTraversedText()/getLastTraversedText()


在UiDevice里有同名方法,如有不明白可回UiDevice学习笔记(1)查看


findAccessibilityNodeInfo(UiSelector)/findAccessibilityNodeInfo(UiSelector,Boolean)


调用translateCompoundSelector方法的接口,先得到根节点,然后将根节点,选择器,布尔值传入。主要作用参见translateCompoundSelector。boolean值默认为false.


findNodePatternRecursive(UiSelector,AccessibilityNodeInfo,int,UiSelector)


以传入的nodeinfo为基准,递归遍历其所有的子节点,直到找到符合UiSelector条件的对象并返回。


findNodePatternRecursive(UiSelector,AccessibilityNodeInfo,int)


同上,只是少了一个subSelector判断条件


formatLog()


Log辅助类,格式化日志输出


getAccessibilityRootNode()


在前面AccessibilityService中提到过getRootInActiveWindow()方法。实际上该方法就去去调用getRootNodeInActiveWindow()。


getCurrentPackageName()/getCurrentActivityName()


顾名思义,包名/activity名


getPatternCount()


得到条件的数目


getRootNode()


得到根节点


initializeNewSearch()

------------------------------------------------------------------------------我是一条你看不见的分割线 ------------------------------ ---------------------------

初始化4个变量,因为Selector是多种组合的,出错时,你无法判断是哪一个条件出错,通过下面4个变量,可以给每个条件标上索引,这样错处就会以索引标识。

private void initializeNewSearch() {
        mPatternCounter = 0;//匹配数量
        mPatternIndexer = 0;//匹配索引
        mLogIndent = 0;//Log索引
        mLogParentIndent = 0;;//父log索引
    }

translateCompoundSelector(UiSelector,AccessibilityNodeInfo,boolean)

translatePatternSelector(UiSelector,AccessibilityNodeInfo,boolean)

translateReqularSelector(UiSelector,AccessibilityNodeInfo)


UiSelector包含3中格式的selector,如下所示:


regular_selector = By[attributes... CHILD=By[attributes... CHILD=By[....]]]
pattern_selector = ...CONTAINER=By[..] PATTERN=By[instance=x PATTERN=[regular_selector]
compound_selector = [regular_selector [pattern_selector]]

所以要要想通过UiSelector获得对象,得分3中方法分别处理对应的字符串组合,然后再通过findNodePatternRecursive方法获得所需的子节点。
------------------------------------------------------------------------------我是一条你看不见的分割线 ------------------------------ ---------------------------
父类 Parent  子类Children 同胞Sibling 先辈Ancestor 后代Descendant

------------------------------------------------------------------------------我是一条你看不见的分割线 ------------------------------ ---------------------------

Rect r  =  Rect(93, 724 - 522, 1024)
r. bottom = 1024
r. left=93
r.right=522
r. top=724
r.centerX() r.centerY() 中心值
rect.width()宽
rect.height()高
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值