UiAutomator2.0

uiautomator2.0+脱离PC运行(apk启动uiautomator2.0+)的实现方案 uiautomator2.0+脱离PC运行(apk启动uiautomator2.0+)效果:打开MyTest.apk,点击run uiautomator,就能直接运行你的脚本。方案概述: 新建一个Android app工程MyTest,在Activity中添加Button,用于启动脚本 给这个app添加系统签名 在MyTest中新建一个module,命名为MyTestCase,用于编写脚本 使用am 阅读详情

1.     概述

UI测试(功能测试、黑盒测试)不需要测试者了解应用程序的内部实现细节,只需要知道当执行了某些特定的动作后是否会得到其预期的输出。这种测试方法,在团队合作中可以更好地分离的开发和测试角色。

常见的UI测试的方法是手动去执行,然后去验证程序是否达到的预期的效果,很显然这种方法耗时、繁琐并且很容易出错。因此我们需要一种可靠的方法来进行UI测试,通过测试框架,我们可以完成针对具体使用场景的测试用例,然后可以循环的、自动的来运行我们的测试case。

 

Android的SDk提供了以下的工具来支持我们进行UI自动化测试:

uiautomatorviewer:一个用来扫描和分析Android应用程序的UI控件的GUI工具。

uiautomator:一个包含创建测试、执行自动化测试API的java库。(Uiautomator文档:http://android.toolib.net/tools/help/uiautomator/index.html )

 

要使用这些工具,你必须安装Android开发工具以下版本:

Android SDKTools:API 21 版本或者21以上版本;

Android SDKPlatform:API 16 版本或者16以上版本.


 

2.     UiAutomatorViewer使用

在你开始写测试用例之前,使用uiautomatorviewer可以帮助你熟悉你的UI组件(包括视图和控件)。你可以使用它对当前连接到你电脑上的手机屏幕进行一个快照,然后可以看到手机当前页面的层级关系和每个控件的属性。利用这些信息,你可以写出针对特定UI控件的测试用例。

在 ..\sdk\tools\ 目录下打开uiautomatorviewer.bat (打开前请手机连接电脑)


1)        获取快照

当你要分析一个页面时,首先将手机的页面停留在你要分析的页面,然后用数据线连接电脑。然后点击uiautomatorviewer左上角的第二个图标按钮 Device Screenshot,点击之后会将当前手机界面的快照更新到这里来。

2)        页面层级

右上方的整个区域,就是当前页面布局的层级关系。

3)        控件属性

右下方的整个区域,是当前选中的页面或者是控件的属性信息。这部分比较重要,我们以后写代码的时候就是需要通过查看属性中的控件的id或者是text等来获取控件的实例,然后点击操作它。

我们可以通过text、resource-id、class、content-desc等来获取控件。


 

3.     UiAutomator

UiAutomator2.0做了一些改进:

1)      基于 Instrumentation,可以获取应用 Context,使用 Android 服务及接口

2)      基于 Junit 4,测试用例无需继承于任何父类,方法名不限,使用注解 Annotation 进行

UI 执行效率比 1.0 快,测试执行可使用Android Junit 方式及 gradle 方式

3)      API 更新,新增UiObject2、Until、By、BySelector 等:API For UI Automator

4)      Log 输出变更,以往使用System.out.print 输出流回显至执行端,2.0 输出至 Logcat。


 

4.     UiAutomator2.0使用步骤

1)        在android studio新建一个工程

2)        添加依赖

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group:'com.android.support',module:'support-annotations'
})
testCompile 'junit:junit:4.12'
// Set this dependencyto build and run UI Automator tests
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'


3)        在androidTest目录下新建一个Test, 点击button4,跳转到一个新页面

@RunWith(AndroidJUnit4.class)
@SdkSuppress(minSdkVersion = 18)
public class Test1 {
    private UiDevice mDevice;

    @Before
    public void before() {
        // Initialize UiDevice instance
        mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
        assertThat(mDevice, notNullValue());

        // Start from the home screen
        mDevice.pressHome();
        // open app
        openApp("com.ut.anquanguankong");
    }

    @Test
    public void test() throws InterruptedException {
        //点击desc=button4的按钮
        findObject(By.desc("button4")).click();
    }

    public void openApp(String packageName) {
        Context context = InstrumentationRegistry.getInstrumentation().getContext();
        Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(intent);
    }

    public UiObject2 findObject(BySelector selector) throws InterruptedException {
        UiObject2 object = null;
        int timeout = 30000;
        int delay = 1000;
        long time = System.currentTimeMillis();
        while (object == null) {
            object = mDevice.findObject(selector);
            sleep(delay);
            if (System.currentTimeMillis() - timeout > time) {
                break;
            }
        }
        return object;
    }
}

5.     UiAutomator2.0 API

UiAutomator2.0是兼用1.0的,2.0的API会包含1.0的API。通过了解这API方法,就可以编写UI自动化测试代码了。官方文档:

https://developer.android.google.cn/reference/android/support/test/uiautomator/package-summary.html,下面介绍常用的2.0 API:

 

 

1)   InstrumentationRegistry

a)        类说明

一个暴露的注册实例,持有instrumentation运行的进程和参数,还提供了一种简便的方法调用instrumentation, application context和instrumentation参数。

b)        相关API

返回类型

API

static Bundle

getArguments(): 返回一个instrumentation参数副本

static Context

getContext():  返回instrumentation对应包的Context

InstrumentationRegistry.getContext() == instrumentation.getContext()

static Instrumentation

getInstrumentation(): 返回当前运行的instrumentation

static Context

getTargetContext(): 返回一个目标应用程序的Context

static void

registerInstance(Instrumentation instrumentation, Bundle arguments):记录或暴露当前instrumentation运行和instrumentation参数包的副本,存储在注册中心

c)        示例

@Test
public void InstrumentationRegistryTest() {
    Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
    Context context1 = InstrumentationRegistry.getContext();
    Context context2 = InstrumentationRegistry.getTargetContext();
    Context context3= instrumentation.getContext();

    if(context1 == context2) {
        Log.i("Chris",  "InstrumentationRegistry getContext == getTargetContext");
    }else {
        Log.i("Chris",  "InstrumentationRegistry getContext != getTargetContext");
    }

    if(context1 == context3) {
        Log.i("Chris",  "InstrumentationRegistry getContext == Instrumentation getContext");
    }else {
        Log.i("Chris",  "InstrumentationRegistry getContext != Instrumentation getContext");
    }

    Intent intent = context2.getPackageManager().getLaunchIntentForPackage("xxx.xxx.xxx");
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    context2.startActivity(intent);
}

 

2)   UiDevice

a)        类说明

UiDevice用与访问关设备状态的信息,也可以使用这个类来模拟用户在设备上的操作。可以通过下面的方法得到实例:

UiDevice mdevice = getUiDevice();

b)        相关API

返回类型

API

Boolean

click(int x, int y): 模拟用户在指定位置点击

String

getCurrentActivityName():  获得的是应用程序在桌面上显示的名字

String

getCurrentPackageName():获得当前显示的应用程序的包名

int

getDisplayHeight():获得当前设备的屏幕分辨率的高

int

getDisplayWighth():获得当前设备的屏幕分辨率的宽

boolean

isScreenOn():判断手机当前是否灭屏

Void

wakeUp():点亮当前屏幕

Boolean

pressBack():点击back键

Boolean

pressHome():点击home键

Boolean

PressMenu():点击menu键

Boolean

PressCode(int code): 利用keycode值模拟一次按下事件, 例如,需要按下数字1 数字1的keycode是 KEYCODE_NUMPAD_1,更多keycode可以在 http://developer.android.com/intl/zh-cn/reference/android/view/KeyEvent.html 进行查询

boolean

swipe(int startX, int startY, int endX, int endY, int steps): 用指定的步长,从A点滑动B点

boolean

takeScreenshot(File storePath): 截取当前屏幕,保存到文件

 

UiAutomator2在UiDevice新增的API

返回类型

API

void

dumpWindowHierarchy(OutPutStream out): 获取当前页面层级到输出流

String

executeShellCommand(String cmd): 执行一个shell命令。备注:此方法只支持api21以上,手机需要5.0系统以上

UiObject2

findObject(BySelector selector): 返回第一个匹配条件的对象

UiObject

findObject(UiSelector selector): 返回一个匹配条件的代表视图的UiObject对象

List<UiObject2>

findObjects(BySelector selector): 返回所有匹配条件的对象

<R> R

wait(SearchCondition<R> condition, long timeout): 等待的条件得到满足


3)   BySelector和By

a)        类说明

BySelector和By是UiAutomator2.0的类。

BySelector类为指定搜索条件进行匹配UI元素,通UiDevice.findObject(BySelector)方式进行使用。

By类是一个实用程序类,可以以简洁的方式创建BySelectors对象。主要功能是使用缩短语法,提供静态工厂方法来构造BySelectors对象。例如:你将使用findObject(By.text("foo")),而不是findObject(newSelector().text("foo"))的方式来查找文本值为“foo”的UI元素。

b)        相关API

在这里介绍By的API,BySelector的API和By的对应的。

返回类型

API

BySelector

clazz(String calssName),

clazz(String packageName, String className),

clazz(Class clazz),

clazz(Pattern className)

通过class来匹配UI

BySelector

desc(String contentDescription)

descContains(String substring)

descStartsWith(String substring)

descEndsWith(String substring)

desc(Pattern contentDescription)

通过contentDescription来匹配UI

BySelector

text(String contentDescription)

textContains(String substring)

textStartsWith(String substring)

textEndsWith(String substring)

text(Pattern contentDescription)

通过text来匹配UI

BySelector

res(String resourceName)

res(String resourcePackage, String resourceId)

res(Pattern resourceName)

通过id来匹配UI

BySelector

checkable(boolean isCheckable)

BySelector

clickable(boolean isClickable)

BySelector

enabled(boolean isEnabled)

BySelector

focusable(boolean isFocusable)

BySelector

focused(boolean isFocused)

BySelector

longClickable(boolean isLongClickable)

BySelector

scrollable(boolean isScrollable)

 

4)   UiObject2

1)        类说明

可以理解为直接操作界面ui元素的实例。UiObject2是UiAutomator2的类。

2)        相关API

基本动作

API

说明

clear()

清楚编辑框内的内容

click()

点击一个对象

clickAndWait(EventCondition<R> condition, long timeout)

点击一个对象然后等待在超时的时间内条件满足则通过,否则抛出异常

drag(Point dest, int speed)

自定义速度拖拽这个对象到指定位置

drag(Point dest)

拖拽这个对象到指定位置

longClick()

长按某个对象

scroll(Direction direction, float percent)

对该对象执行一个滚动操作

scroll(Direction direction, float percent, int speed)

自定义速度,对该对象执行一个滚动操作

setText(String text)

设置文本内容

legacySetText(String text)

通过发送keycode,设置文本内容

 

手势动作

API

说明

pinchClose(float percent, int speed)

自定义速度执行收缩手势

pinchClose(float percent)

执行收缩手势

pinchOpen(float percent, int speed)

自定义速度执行展开手势

pinchOpen(float percent)

执行展开手势

fling(Direction direction)

执行一个扫动手势,Direction代表为起点方向

fling(Direction direction, int speed)

自定义速度,执行一个扫动手势

swipe(Direction direction, float percent, int speed)

执行一个滑动操作,可自定义滑动距离和速度

swipe(Direction direction, float percent)

执行一个滑动操作

setGestureMargin(int margin)

以像素为单位,设置手势边缘

setGestureMargins(int left, int top, int right, int bottom)

以像素为单位,设置手势边缘

 

获取层级与条件判断

API

说明

findObject(BySelector selector)

搜索在这个对象之下的所有元素,并返回第一个与搜索条件匹配的

findObjects(BySelector selector)

搜索在这个对象之下的所有元素,并返回所有与搜索条件匹配的

getChildCount()

返回这个对象直属子元素的数量

getChildren()

返回这个对象下的直接子元素的集合

getParent()

返回该对象的父类

equals(Object object)

比较两个对象是否相等

hashCode()

获取对象的哈希码

hasObject(BySelector selector)

返回该对象是否存在

recycle()

回收该对象

wait(UiObject2Condition<R> condition, long timeout)

等待条件被满足

wait(SearchCondition<R> condition, long timeout)

等待条件被满足

 

5)   Configration

a)        类说明

Configrator用于设置脚本动作的默认延时:

1.        可调节两个模拟动作之间的默认间隔

2.        可调节输入文本的输入时间间隔

3.        可调节每次滚动的时间间隔

4.        可调节等待系统空闲的默认时间

b)        相关API

延时项

默认延时

说明

API

动作

3s

设置延时

setActionAcknowledgmentTimeout(long timeout)

 

 

获取默认延时

getActionAcknowledgmentTimeout()

键盘输入

0s

设置延时

setKeyInjectionDelay(long delay)

 

 

获取默认延时

getKeyInjectionDelay()

滚动

200ms

设置延时

setScrollAcknowledgmentTimeout(long timeout)

 

 

获取默认延时

getScrollAcknowledgmentTimeout()

空闲

10s

设置延时

setWaitForIdleTimeout(long timeout)

 

 

获取默认延时

getWaitForIdleTimeout()

组件查找

10s

设置延时

setWaitForSelectorTimeout(long timeout)

 

 

获取默认延时

getWaitForSelectorTimeout()

 

 

 

6.     断言

1)   断言函数介绍

确定被测试的方法是否按照预期的效果正常工作

比如说:

if (假设成立){

    通过测试

}else{

    报错并终止当前用例测试

}

2)   断言函数用例结构

一个完整的测试用例必需要有断言函数

setUp//初始化

//测试用例,junit4版本才可以使用多条用例

test        初始化场景与数据

test        模拟操作步骤

test        断言

test        恢复场景   

tearDown//回收初始化垃圾

3)   断言函数Java错误类型

a)        Error:

一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误导致的应用程序中断,仅靠程序本身无法恢复和预防(断言)

b)        Exeeption:

表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常(最常见的是UI对象找不到的异常)

 


 

4)   断言函数API


例如:

//断言两个对象是否相等

asserEquals(Stringmessage,Object expected,Object actual){

    if (expected==null && actual==null){

        return ;   

    }

    if (expected!=null && expected.equals(actual)){

        return

    }

    failNotEquals(message,expected,actual);

}

参数

说明

Message

可选消息,在断言失败后会抛出这个消息

Expected

期望的值

Actual

实际的值

 

相关API

方法

说明

assertEquals(boolean,boolean)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(String,boolean,boolean)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(byte,byte)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(String,byte,byte)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(char,char)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(String,char,char)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(int,int)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(String,int,int)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(long,long)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(String,long,long)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(Object,Object)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(String,Object,Object)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(short,short)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(String,short,short)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(String,String)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(String,String,String)

如果期望(expected)和实际(actual)相等则通过,否则失败

assertEquals(double,double,double)

如果期望(expected)和实际(actual)相差不超过精度值(delta)则通过,否则失败

assertEquals(String,double,

double,double)

如果期望(expected)和实际(actual)相差不超过精度值(delta)则通过,否则失败

assertEquals(float,float,float)

如果期望(expected)和实际(actual)相差不超过精度值(delta)则通过,否则失败

assertEquals(String,float,float,float)

如果期望(expected)和实际(actual)相差不超过精度值(delta)则通过,否则失败

assertFalse(boolean)

如果条件(condition)为False则通过,否则失败

assertFalse(String,boolean)

如果条件(condition)为False则通过,否则失败

assertTrue(boolran)

如果条件(condition)为True则通过,否则失败

assertTrue(String,boolran)

如果条件(condition)为True则通过,否则失败

assertNotNull(Object)

如果条件(condition)为非空则通过,否则失败

assertNotNull(String,Object)

如果条件(condition)为非空则通过,否则失败

assertNull(Object)

如果条件(condition)为空则通过,否则失败

assertNull(String,Object)

如果条件(condition)为空则通过,否则失败

assertNotSame(Object,object)

如果期望(expected)和实际(actual)引用不同的内存对象对象则通过,否则失败

assertNoteSame(String,Object,Object)

如果期望(expected)和实际(actual)引用不同的内存对象对象则通过,否则失败

assertSame(Object,Object)

如果期望(expected)和实际(actual)引用相同的内存对象对象则通过,否则失败

assertSame(String,Object,Object)

如果期望(expected)和实际(actual)引用相同的内存对象对象则通过,否则失败

fail()

用例立即失败

fail(String)

用例立即失败,且抛出指定消息

failNotEquals(String,Object,Object)

用例立即失败,且抛出指定消息与期望、实际值不相等的消息

failNotSame(String,String,String)

用例立即失败,且抛出指定消息与期望、实际值不相等的消息

failSame(String)

用例立即失败,且抛出指定消息


 

 

8.     报告分析

1)   错误类型

断言错误:就是断言这个用例的成功或者失败(AssrtionFailedError)

脚本错误:UiObjectNotFoundException(找不到对象异常)、java异常等

2)   报告分析

@Test
 public void testMain() throws InterruptedException, UiObjectNotFoundException {

    BySelector tabSelector = By.desc("TabContainer");
    uiAction.click(By.desc("button4")).isExist("打开主页面出错", tabSelector);
    mDevice.pressBack();
 }

这个方法测试:点击button4,进入主页面。

 

a)        正常运行

testMain打开一个存在的页面。

run started: 1 tests 
TestRunner: started: testMain(com.chris.example.uiautomatordemo.AnquanguankongTest)
MonitoringInstrumentation: Activities that are still in CREATED to STOPPED: 0
InteractionController: runAndwaitForEvents timed out waiting for events
QueryController: Got null root node from accessibility - Retrying...
InteractionController: runAndwaitForEvents timed out waiting for events
TestRunner: finished: testMain(com.chris.example.uiautomatordemo.AnquanguankongTest)
MonitoringInstrumentation: Activities that are still in CREATED to STOPPED: 0
TestRunner: run finished: 1 tests, 0 failed, 0 ignored

从上面报告来看,testMain正常执行。

 

b)        断言错误

testMain打开一个不存在的页面。

run started: 1 tests
TestRunner: started: testMain(com.chris.example.uiautomatordemo.AnquanguankongTest)
MonitoringInstrumentation: Activities that are still in CREATED to STOPPED: 0
InteractionController: runAndwaitForEvents timed out waiting for events
QueryController: Got null root node from accessibility - Retrying...
TestRunner: failed: testMain(com.chris.example.uiautomatordemo.AnquanguankongTest)
TestRunner: ----- begin exception -----
TestRunner: junit.framework.AssertionFailedError: 打开主页面出错
at junit.framework.Assert.fail(Assert.java:50)
at junit.framework.Assert.assertTrue(Assert.java:20)
at junit.framework.Assert.assertNotNull(Assert.java:218)
at com.chris.example.uiautomatordemo.UiAutomatorActionImpl.isExist(UiAutomatorActionImpl.java:102)
at com.chris.example.uiautomatordemo.AnquanguankongTest.testMain(AnquanguankongTest.java:52)
TestRunner: ----- end exception -----
TestRunner: finished: testMain(com.chris.example.uiautomatordemo.AnquanguankongTest)
MonitoringInstrumentation: Activities that are still in CREATED to STOPPED: 0
TestRunner: run finished: 1 tests, 1 failed, 0 ignored

从上面报告来看,testMain执行失败,并给出详细的错误信息。

c)        脚本错误

testMain点击一个不存在的button

run started: 1 tests
TestRunner: started: testMain(com.chris.example.uiautomatordemo.AnquanguankongTest)
MonitoringInstrumentation: Activities that are still in CREATED to STOPPED: 0
InteractionController: runAndwaitForEvents timed out waiting for events
QueryController: Got null root node from accessibility - Retrying...
TestRunner: failed: testMain(com.chris.example.uiautomatordemo.AnquanguankongTest)
TestRunner: ----- begin exception -----
TestRunner: junit.framework.AssertionFailedError: BySelector [DESC='\Qbutton42\E'] no found
at junit.framework.Assert.fail(Assert.java:50)
at junit.framework.Assert.assertTrue(Assert.java:20)
at junit.framework.Assert.assertNotNull(Assert.java:218)
at com.chris.example.uiautomatordemo.UiAutomatorActionImpl.isExist(UiAutomatorActionImpl.java:112)
at com.chris.example.uiautomatordemo.UiAutomatorActionImpl.findObjectWithCheck(UiAutomatorActionImpl.java:75)
at com.chris.example.uiautomatordemo.UiAutomatorActionImpl.click(UiAutomatorActionImpl.java:84)
at com.chris.example.uiautomatordemo.AnquanguankongTest.testMain(AnquanguankongTest.java:52)
TestRunner: ----- end exception -----
TestRunner: finished: testMain(com.chris.example.uiautomatordemo.AnquanguankongTest)
MonitoringInstrumentation: Activities that are still in CREATED to STOPPED: 0
TestRunner: run finished: 1 tests, 1 failed, 0 ignored

从上面报告来看,testMain执行失败,并给出详细的错误信息。

 

Uiautomator2实现Android自动化测试详解 已选中的元素,通常用于复选框,参数为True,False。获得了焦点的元素,参数为True,False。当前选中的元素,参数为True,False。description符合指定正则的元素。可检查的元素,参数为True,False。可点击的元素,参数为True,False。可长按的元素,参数为True,False。可滚动的元素,参数为True,False。已激活的元素,参数为True,False。可聚焦的元素,参数为True,False。resourceId为符合指定正则的元素。 阅读详情

相关推荐

UiAutomator2.0升级填坑记

UiAutomator2.0升级填坑记 by SkySeraph

SkySeraph 优快云博客 1501

uiautomator2 库中文手册

uiautomator2 库中文手册一、安装1.安装uiautomator2;2.安装设备守护进程;3.安装weditor二、使用指南1. 连接设备2. 命令行使用三、API手册1.全局设定2.检索设备信息3.键盘操作4.设备的手势交互5. 屏幕操作6.推送和提取文件7.APP管理8.选择器Selecor获取儿孙和同级UI对象儿孙级同级通过text或description或instance,获取儿...

damao528的博客 2万+

Android UIAutomator2.0入门

Uiautomator是由谷歌推出的用于UI自动化测试的工具,花了一天时间研究了下,总体来说还是非常简单,api非常简洁,今天主要帮助大家入门。对于安卓环境搭建我就不多讲了,我们直接进入Uiautomator讲解。1 创建工程直接用android studio创建一个空工程。启动studio,点击start a new Android Studio project,在application nam...

qq752387519的专栏 906

UIAutomator2.0详解(入门篇)

看过很多博客,对于UIAutomator2.0的讲解,多是从API方面进行理论叙述,个人感觉不好理解,实战性差。因此,想从实战应用的角度,记录UIAutomator2.0的使用。本文为开篇,希望起个好头。(1)什么是UIAutomator?UIAutomator是android的自动化测试框架,可跨APP。与instrumentation框架不同,UIAutomator不需要测试对象源码,因此,为黑

breakloop 6万+

Uiautomator 2.0之UiDevice新增API学习小记

1. InstrumentationRegistry类 1.1. 类说明: 一个暴露的注册实例,持有instrumentation运行的进程和参数,还提供了一种简便的方法调用instrumentation, application context和instrumentation参数。 1.2 相关API 返回类型 API static Bundle getAr

安静的偏执的专栏 1万+

Uiautomator2.0 棘手问题:系统重启后,uiautomator会停止,后面的用例全部挂掉

Uiautomator2.0 棘手问题:系统重启后,uiautomator会停止,后面的用例全部挂掉

qq_43540385的博客 4734

Android UiAutomator2.0简介

Ui Automator 是一个 UI 测试框架,适用于整个系统上以及多个应用间的跨应用功能 UI测试。Uiautomator 测试框架提供了一组 API,用户构建在用户应用和系统应用上执行交互的界面测试。通过这些 API,可以在测试设备中执行用户操作,如滑动,点击,返回等。Uiautomator 测试框架非常适合黑盒式自动化测试。注意:Uiautomator 框架需要 Android 4.3(API 级别 18)或更高版本Uiautomator 目前分为1.0和2.0两个版本,2.0丰富了一些 API,以

新猿异码的博客 945

1.0 开篇

本手册系统介绍uiautomator2框架在Android自动化测试中的应用,包含从基础到高级的完整学习路径。主要内容涵盖环境搭建、元素定位、设备操作、应用管理、断言验证等核心知识点,并提供高级特性扩展、测试框架集成及实战项目练习。手册采用理论+实践的方式,每个章节配有代码示例和练习任务,帮助读者逐步掌握自动化测试技能。附录提供常见问题解答、学习资源和工具指南,适合移动端测试工程师系统学习Android自动化测试技术。

YAnt的博客 221

Uiautomator2.0

简介Google Android Developers 在2015年3月就发布了UiAutomator 2.0版本。重大特性1.U2 基于 Instrumentation,使用Instrumentation test runner即可运行UiAutomator,反之,也即在基于Instrumentation的test中也能使用UiAutomator; 可以获取应用Context,可以使用Android服务及接口。2.Log日志输出变更。U1可以使用System.out.print输出流回显至执行端,而U2输

Tester_muller的博客 610

python语言下使用opencv接口cv2.VideoCapture()接口调用海康机器人工业相机

文章目录 目录 文章目录 前言 一、opencv接口介绍 二、调用海康机器人工业相机 1.使用海康机器人工业相机的前提 2.调用海康机器人工业相机进行显示 3.调用海康机器人工业相机进行存图 4.调用海康机器人工业相机存视频 5.调用海康机器人工业相机进行简单图像处理 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下.

qq_39570716的博客 1万+

深入解析Flex NOC总线驱动的实时带宽与延迟优化策略

本文深入解析了Flex NOC总线驱动的核心价值与优化策略。通过解读`/proc/noc/real_time`中的实时带宽与延迟数据,并结合`sysfs`接口进行动态QoS调优,可以有效解决芯片内部数据拥堵问题。文章以智能摄像头和算力盒子的实际案例,详细说明了如何通过优先级调整、带宽限制和参数优化,提升系统在复杂任务下的实时性与稳定性。

weixin_29289821的博客 282

UiAutomator2.0遍历控件

使用过UiAutomator1.0的人应该有非常痛的痛点,那就是在遍历View树时非常麻烦或者说做不到,百度上找到的基本上是这么用的: UiScrollable list = new UiScrollable(new UiSelector().resourceId("com.xxx.xxx:id/ni")); for (int i = 0; i &lt; list.getChildCount();...

CmdMac的专栏 7234

Boost电路双闭环控制MATLAB仿真

通过电流内环控制,我们可以改变目标平均电流基准值的大小来闭环改变占空比,再改变输出电压与电路电流,直到电路电流达到基准电流才达到稳态。但是我们的基准电流依旧是外部提供的,下边的电压外环控制就是电路自己计算基准电流。

Fourglsl的博客 5844

UiAutomator2.0(转)

1.     概述 UI测试(功能测试、黑盒测试)不需要测试者了解应用程序的内部实现细节,只需要知道当执行了某些特定的动作后是否会得到其预期的输出。这种测试方法,在团队合作中可以更好地分离的开发和测试角色。 常见的UI测试的方法是手动去执行,然后去验证程序是否达到的预期的效果,很显然这种方法耗时、繁琐并且很容易出错。因此我们需要一种可靠的...

抱着肩膀笑看看 2580

基于NXP i.MX RT1180的无传感器FOC电机驱动实战指南

磁场定向控制(FOC)是一种先进的电机控制技术,它通过精密的数学变换,将三相交流电机的控制解耦为独立的转矩和磁场分量,从而实现高效、平稳、低噪音的驱动。其核心原理在于利用Park/Clark变换,在旋转坐标系下对电流进行线性控制。这项技术的价值在于显著提升了永磁同步电机(PMSM)的效率与动态性能,广泛应用于机器人、无人机和工业自动化等高精度场景。本文聚焦于利用NXP i.MX RT1180跨界处理器及其MCUXpresso SDK,快速实现一套完整的无传感器FOC解决方案。通过解析硬件平台选型、软件架构,

weixin_33925615的博客 302

rk3588 Android HDMI IN热插拔解决

1、公司在使用 别的厂商的板卡遇到一个问题,开机我们的app自启就会闪退,后来定位发现是camera 的open出错了,这个问题的出现是因为没有插HDMI IN输入的问题导致的,所以需要对HDMI IN的热插拔进行检测,后面我把这个问题也顺利解决了。下面是我的尝试和使用的解决办法。3、话不多说,我用的是读取系统文件实现的,但是这个方法,需要有status文件的系统读权限,可以修改设备下的/vendor/etc/init/hw/init.rk3588.rc文件修改的权限,这个问题交给自己或者厂家协商解决。

qq_54089476的博客 1918

Appium基础学习之 | UiAutomator2.0使用

一、Android Studio安装 Android Studio是Google开发的一款针对Android开发的IDE,由于UiAutomator2.0基于Instrumentation运行,所以脚本需要打包成应用程序APK push到device执行,并且它还是依赖gradle构建,So,我可以理解为Google是在规范大家使用Android Studio。 Android Studio下...

雨墨轩痕 2647

DisplayPort信号通道深度解析:从物理层到协议栈

DisplayPort(DP)是一种面向高速串行通信的数字显示接口标准,其核心在于嵌入式时钟、自适应均衡与链路训练三位一体的物理层架构。不同于HDMI依赖独立时钟的TMDS方案,DP通过差分主链路(Main Link)承载编码数据流,以8b/10b或128b/132b编码实现高带宽与强鲁棒性。该技术价值体现在多速率自适应、误码恢复能力及对PCB布线与阻抗控制的严苛要求,广泛应用于8K显示、工业视觉、GPU直连等高性能场景。本文聚焦DP信号通道的管脚级实现、三层协议解耦(物理层/数据链路层/事务层)及链路训练

weixin_34214500的博客 253

Uiautomator 2.0之UiObject2类学习小记

1. 基础动作 1.1. 相关API介绍 API 说明 clear() 清楚编辑框内的内容 click() 点击一个对象 clickAndWait(EventCondition condition, long timeout) 点击一个对象然后等待在超时的时间内条件满足则通过,否则抛出异常 drag(Point dest, int

安静的偏执的专栏 1万+

Claude Code、Codex、Gemini CLI、OpenCode 和 OpenClaw 配置管理太麻烦?试试这个统一管理工具

还在为 Claude Code、Codex、Gemini CLI 等 AI CLI 配置烦恼?🤯 这款桌面工具支持五大助手统一管理,一键切换 50+ 服务商,MCP 和 Skills 集中管理 🛠️,跨平台支持,让你的 AI 编程更高效 ⚡

XiaoqiangClub的博客 912

强化学习优化多目标冲突推理的决策过程设计

1. 背景介绍 强化学习(Reinforcement Learning,RL)作为机器学习的一个重要分支,近年来在计算机科学和人工智能领域取得了显著的进展。其核心思想是通过试错来学习最优策略,从而在复杂的环境中实现目标。然而,在多目标冲突推理(Multi-Objective Conflict Reasoning,MOCR)问题上,强化学习面临着诸多挑

AI天才研究院 1509

Uiautomator 2.0 VS 1.0

简介: google早已推出了uiautomator2.0,但是1.0仍然能用,最近由于许多控件不能识别,所以尝试了在2.0上有没有 这种问题存在。惊奇的发现2.0功能实在比1.0强大很多,所以我们也应该适时改变,去拥抱变化。 What’s NEW INUIAUTOMATOR 2.0 Mostimportantly, UIAutomator is now based on A

CR7mini 博客 3637

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

初探UiAutomator2.0中使用Xpath定位元素

J 今天的主题是讲一下在使用过程中遇到的一个问题,如何在UiAutomator2.0中使用Xpath定位元素?   背景   现在的app在打包成apk的时候都是有加固处理的,各种混淆加固,所以已经破坏了或扰乱了原本的代码变量命名形式,这就给我们要基于界面来做自动化测试带来了灾难性的阻碍,因为那些混淆过的id是不固定的,下一次再出个新版本,这一切都变了,所以这就没办法用id来定位混淆过的a...

qianfeng_dashuju的博客 6833

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

UiAutomator2.0资料收集

http://udn.yyuap.com/thread-70317-1-1.html                          UIAutomator2.0 简介 http://blog.csdn.net/stonree/article/details/25404125          基于UIAutomator+Jenkins Android自动化测试 实现

whatnamecaniuse的专栏 1377

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Uiautomator 2.0之UiWatcher类学习小记

1. 主要功能 使用此方法可以处理中断问题,从而保证测试用例的正常运行。 2. 相关API API 说明 registerWatcher (String name, UiWatcher watcher) 注册一个监听器,当无法匹配到对象的时候,触发监听器 removeWatcher (String name) 取消之前注册的指定的监听器 r

安静的偏执的专栏 5574
上一篇: 在tomcat部署iOS应用发布
Java18
博客等级 码龄16年 27粉丝 18原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值