Android测试工具 UIAutomator入门与介绍

  UI Automator 测试工具定义以及用途


 

        UI Automator 测试框架提供了一组 API,用于构建在用户应用和系统应用上执行交互的界面测试。通过 UI Automator API,您可以执行在测试设备中打开“设置”菜单或应用启动器等操作。UI Automator 测试框架非常适合编写黑盒式自动化测试,此类测试的测试代码不依赖于目标应用的内部实现细节。


 

        优点:可以对所有的操作来进行自动化,操作简单(eg:点击事件 ,侧滑事件,上拉事件,以及模拟键盘输入测试用例)。可以测试所有设备的程序。

        缺点:必须要Android4.0以上才能使用。


 

UI Automator 的执行呢,需要我们编写完毕打成jar包,直接上传到/data/local/tmp/ 目录下面,然后用adb 命令执行即可。由于是安卓原生的,比较稳定,运行的速度也比较快。

        我们下载了安卓的环境变量后,然后下载任意大于4.0的安卓版本sdk即可。

 

 

都会有这个jar包,我们在写代码,创建工程的时候,直接引入即可。

如何获取定位呢,我们可以uiautomatorviewer。

 

 

    

UI Automator 测试框架的主要功能包括:

        用于检查布局层次结构的查看器。

        用于检索状态信息并在目标设备上执行操作的 API。

        支持跨应用界面测试的 API。

UI Automator 测试框架提供了一个 UiDevice 类,用于在运行目标应用的设备上访问和执行操作。您可以调用其方法以访问设备属性,如当前屏幕方向或显示屏尺寸。UiDevice 类还可用于执行以下操作:

        改变设备的旋转。

        按硬件键,如“音量调高按钮”。

        按返回、主屏幕或菜单按钮。

        打开通知栏。

        截取当前窗口的屏幕截图。

UI Automator API

通过 UI Automator API,您可以编写可靠的测试,而无需了解目标应用的实现细节。您可以使用这些 API 在多个应用间捕获和操纵界面组件:

        UiCollection:枚举容器的界面元素,目的是为了计数,或者按可见文本或内容说明属性来定位子元素。

 

        UiObject:表示设备上可见的界面元素。

        UiScrollable:支持搜索可滚动界面容器中的项目。

        UiSelector:表示对设备上的一个或多个目标界面元素的查询。

        Configurator:可让您设置用于运行 UI Automator 测试的关键参数。

官方文档

https://developer.android.com/reference/androidx/test/uiautomator/package-summary

官方文档有着详细的介绍

 

 

正常的我们加入后,在后可以看到,有什么类,方式是什么,里面有什么api。

       我们可以在引入后查看。

 

 

 

 

下面列举几个类的方法

   

    UiDevice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
void    clearLastTraversedText()
// 清除上次UI遍历的事件
 
boolean click(int x, int y)
// 根据坐标点击
 
boolean drag(int startX, int startY, int endX, int endY, int steps)
// 拖动
 
void    dumpWindowHierarchy(File dest)
// dump当前的层次化结构到文件中
 
void    dumpWindowHierarchy(OutputStream out)
// dump当前的层次化结构到流中
 
void    dumpWindowHierarchy(String fileName)
// dump当前的层次化结构到文件中
 
UiObject2   findObject(BySelector selector)
// 根据BySelector查找
 
UiObject    findObject(UiSelector selector)
// 根据UiSelector 查找
 
List<UiObject2> findObjects(BySelector selector)
// 根据BySelector查找
 
void    freezeRotation()
// 冻结旋转的状态
 
String  getCurrentActivityName()
// 获取当前Activity的名字,已经被废弃
 
String  getCurrentPackageName()
// 获取当前package
 
int getDisplayHeight()
// Gets the height of the display, in pixels.
 
int getDisplayRotation()
// Returns the current rotation of the display, as defined in Surface
 
Point   getDisplaySizeDp()
// Returns the display size in dp (device-independent pixel) The returned display size is adjusted per screen rotation.
 
int getDisplayWidth()
// Gets the width of the display, in pixels.
 
static UiDevice getInstance()
// 获取一个对象
 
static UiDevice getInstance(Instrumentation instrumentation)
// Retrieves a singleton instance of UiDevice
 
String  getLastTraversedText()
// 获取上一次遍历的文本
 
String  getLauncherPackageName()
// 获取运行的packagename
 
String  getProductName()
// Retrieves the product name of the device.
 
boolean hasAnyWatcherTriggered()
 
// 检查是否有触发器触发
 
boolean hasObject(BySelector selector)
// 是否有符合的条件的
 
boolean hasWatcherTriggered(String watcherName)
// Checks if a specific registered UiWatcher has triggered.
 
boolean isNaturalOrientation()
// Check if the device is in its natural orientation.
 
boolean isScreenOn()
// Checks the power manager if the screen is ON.
 
boolean openNotification()
// Opens the notification shade.
// 打开通知
 
boolean openQuickSettings()
// 打开设置
 
<R> R   performActionAndWait(Runnable action, EventCondition<R> condition, long timeout)
// Performs the provided action and waits for the condition to be met.
 
boolean pressBack()
// Simulates a short press on the BACK button.
 
boolean pressDPadCenter()
// Simulates a short press on the CENTER button.
 
boolean pressDPadDown()
// Simulates a short press on the DOWN button.
 
boolean pressDPadLeft()
// Simulates a short press on the LEFT button.
 
boolean pressDPadRight()
// Simulates a short press on the RIGHT button.
 
boolean pressDPadUp()
// Simulates a short press on the UP button.
 
boolean pressDelete()
// Simulates a short press on the DELETE key.
 
boolean pressEnter()
// Simulates a short press on the ENTER key.
 
boolean pressHome()
// Simulates a short press on the HOME button.
 
boolean pressKeyCode(int keyCode)
// Simulates a short press using a key code.
 
boolean pressKeyCode(int keyCode, int metaState)
// Simulates a short press using a key code.
 
boolean pressMenu()
// Simulates a short press on the MENU button.
 
boolean pressRecentApps()
// Simulates a short press on the Recent Apps button.
 
boolean pressSearch()
// Simulates a short press on the SEARCH button.
 
void    registerWatcher(String name, UiWatcher watcher)
// Registers a UiWatcher to run automatically when the testing framework is unable to find a match using a UiSelector.
 
void    removeWatcher(String name)
// Removes a previously registered UiWatcher.
 
void    resetWatcherTriggers()
// Resets a UiWatcher that has been triggered.
 
void    runWatchers()
// This method forces all registered watchers to run.
 
void    setCompressedLayoutHeirarchy(boolean compressed)
// Enables or disables layout hierarchy compression.
 
void    setOrientationLeft()
// 设置旋转方向
 
void    setOrientationNatural()
// Simulates orienting the device into its natural orientation and also freezes rotation by disabling the sensors.
 
void    setOrientationRight()
// Simulates orienting the device to the right and also freezes rotation by disabling the sensors.
 
void    sleep()
// 关闭屏幕
 
boolean swipe(int startX, int startY, int endX, int endY, int steps)
// Performs a swipe from one coordinate to another using the number of steps to determine smoothness and speed.
 
boolean swipe(Point[] segments, int segmentSteps)
// Performs a swipe between points in the Point array.
 
boolean takeScreenshot(File storePath, float scale, int quality)
// 截屏
boolean takeScreenshot(File storePath)
// Take a screenshot of current window and store it as PNG Default scale of 1.0f (original size) and 90% quality is used The screenshot is adjusted per screen rotation
 
void    unfreezeRotation()
// Re-enables the sensors and un-freezes the device rotation allowing its contents to rotate with the device physical rotation.
 
<R> R   wait(SearchCondition<R> condition, long timeout)
// Waits for given the condition to be met.
 
void    waitForIdle(long timeout)
// Waits for the current application to idle.
 
void    waitForIdle()
// Waits for the current application to idle.
 
boolean waitForWindowUpdate(String packageName, long timeout)
// Waits for a window content update event to occur.
 
void    wakeUp()
// 点亮屏幕

  

UiObject

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
void    clearTextField()
// 清空输入接口
 
boolean click()
// 点击
 
boolean clickAndWaitForNewWindow()
// 点击并等待新界面
 
boolean clickAndWaitForNewWindow(long timeout)
// 点击并等待新界面,设置等待时间
 
boolean clickBottomRight()
// 点击右下边
 
boolean clickTopLeft()
// Clicks the top and left corner of the UI element
 
boolean dragTo(UiObject destObj, int steps)
// 拖动
 
boolean dragTo(int destX, int destY, int steps)
// Drags this object to arbitrary coordinates.
 
boolean exists()
// 判断是否存在
 
 
Rect    getBounds()
// 返回边界
 
UiObject    getChild(UiSelector selector)
// 根据条件获取子元素
 
int getChildCount()
// 获取子元素数量
 
String  getClassName()
// 获取当前元素的class name
 
String  getContentDescription()
// Reads the content_desc property of the UI element
 
UiObject    getFromParent(UiSelector selector)
// Creates a new UiObject for a sibling view or a child of the sibling view, relative to the present UiObject.
 
String  getPackageName()
// Reads the view's package property
 
final UiSelector    getSelector()
// Debugging helper.
 
String  getText()
// Reads the text property of the UI element
 
Rect    getVisibleBounds()
// 获取可见边界
 
boolean isCheckable()
// 是否可以点击
 
boolean isChecked()
// 是否已经选中
 
boolean isClickable()
// Checks if the UI element's clickable property is currently true.
 
boolean isEnabled()
// Checks if the UI element's enabled property is currently true.
 
boolean isFocusable()
// Check if the UI element's focusable property is currently true.
 
boolean isFocused()
// Check if the UI element's focused property is currently true
 
boolean isLongClickable()
// Check if the view's long-clickable property is currently true
 
boolean isScrollable()
// Check if the view's scrollable property is currently true
 
boolean isSelected()
// Checks if the UI element's selected property is currently true.
 
boolean longClick()
// 长按
 
boolean longClickBottomRight()
// Long clicks bottom and right corner of the UI element
 
boolean longClickTopLeft()
// Long clicks on the top and left corner of the UI element
 
boolean performMultiPointerGesture(PointerCoords... touches)
// Performs a multi-touch gesture.
 
boolean performTwoPointerGesture(Point startPoint1, Point startPoint2, Point endPoint1, Point endPoint2, int steps)
// Generates a two-pointer gesture with arbitrary starting and ending points.
 
boolean pinchIn(int percent, int steps)
// Performs a two-pointer gesture, where each pointer moves diagonally toward the other, from the edges to the center of this UiObject .
 
boolean pinchOut(int percent, int steps)
// Performs a two-pointer gesture, where each pointer moves diagonally opposite across the other, from the center out towards the edges of the this UiObject.
 
boolean setText(String text)
// 设置输入内容
 
boolean swipeDown(int steps)
// Performs the swipe down action on the UiObject.
 
boolean swipeLeft(int steps)
// Performs the swipe left action on the UiObject.
 
boolean swipeRight(int steps)
// Performs the swipe right action on the UiObject.
 
boolean swipeUp(int steps)
// Performs the swipe up action on the UiObject.
 
boolean waitForExists(long timeout)
// Waits a specified length of time for a view to become visible.
 
boolean waitUntilGone(long timeout)
// Waits a specified length of time for a view to become undetectable.

  

下面给大家展示一个UiAutomator的testcase

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package cn.cool;
 
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
 
import android.os.RemoteException;
 
public class Testone extends UiAutomatorTestCase {
   @Override
    protected void setUp() throws Exception {
        super.setUp();
    }
    public void testCool() throws RemoteException, InterruptedException {
       
    }
    @Override
    protected void tearDown() throws Exception {
  
    }
 
}

  

然后我们可以在实际的项目中,去实现我们真实的业务的代码。实现完毕呢,
我们就可以用 adb . shell push cool.jar /data/local/tmp/
然后使用
adb shell uiautomator runtest cool.jar -c cn.cool.Testone
就可以执行了。uiautomator 由于只能打成jar包,所以它不能直接在编辑器上进行调试。
欢迎关注我的公众号,专注测试技术的分享

 

 

posted @   北漂的雷子  阅读(1434)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示