python android自动化_python在Android下的自动化测试用法

# This Python file uses the following encoding: utf-8

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice

from com.android.monkeyrunner.easy import EasyMonkeyDevice #提供了根据ID进行访问

from com.android.monkeyrunner.easy import By #根据ID返回PyObject的方法

device=MonkeyRunner.waitForConnection()

device.startActivity(component="com.example.android.apis/com.example.android.apis.ApiDemos")

easy_device=EasyMonkeyDevice(device)#必须在activity启动之后

#登录界面,点击账号输入框

easy_device.touch(By.id('id/text1'),MonkeyDevice.DOWN_AND_UP)

转载部分知识:

http://www.cnblogs.com/yanghj010/p/4670292.html

一:直接在shell命令下输入以下命令;

命令说明

device=MonkeyRunner.waitForConnection() #连接手机设备

device.installPackage("../samples/android-10/ApiDemos/bin/Apidemos.apk") #安装apk包到手机设备。

启动其中的任意activity了,只要传入package和activity名称即可。命令如下:

device.startActivity(component="com.example.android.apis/com.example.android.apis.ApiDemos")

此时模拟器会自动打开ApiDemos这个应用程序的主页。

device.reboot() #手机设备重启

device.touch(300,300,'DOWN_AND_UP')

MonkeyRunner.alert("hello")#在emulator上会弹出消息提示

device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)

device.type('hello')#向编辑区域输入文本'hello'

二:将以下命令写到python文件里,例如test.py,然后我们再从命令行直接通过monkeyrunner运行它即可。比如,我们还是用上面的例子,语法如下:monkeyrunner test.py 接下来monkeyrunner会自动调用test.py,并执行其中的语句,相当方便。

实例:test.py

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice

device=MonkeyRunner.waitForConnection()

device.startActivity(component="your.www.com/your.www.com.TestActivity")

在CMD中执行

monkeyrunner test.py

可能出现错误“Can't open specified script file”,如下图所示:

原因在于python脚本文件路径不正确。你可以有以下解决办法:

1、将test.py文件存放到monkeyrunner文件同一目录中。可以执行:monkeyrunner test.py 调用

2、指定python文件位置。如果test.py文件在D盘根目录下,可以这样执行:monkeyrunner d:\test.py

三 、MonkeyRunner语法

3.1 monkeyrunner

monkeyrunner工具提供了一个API,运用该API编写的程序可以不用通过android代码来直接控制android设备和模拟器,我们可以写一个python程序对android应用程序或测试包进行安装、运行、发送模拟击键,对用户界面进行截图并将截图存储在workstation上等操作。monkeyrunner工具的主要设计目的是用于测试application/framework层上的应用程序和设备、或用于运行单元测试套件,也可以用于其它目的。

3.2 monkeyrunner为android测试提供了以下独特的功能:

1、多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。可以在同一时间接上所有设备或一次启动全部模拟器,依据程序依次连接到每一个,然后运行一个或多个测试。也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。

2、功能测试:monkeyrunner可以为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。

4、回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。

4、可扩展的自动化:由于monkeyrunner是一个API工具包,我们可以开发基于python模块和程式的一整套系统,以此来控制android设备。除了使用monkeyrunner API,我们还可以使用标准的python os和ubprocess模块来调用android debug bridge这样的android工具。如ADB这样的android工具,也可以将自己写的类添加到monkeyrunner API中。

3.3  运行monkeyrunner

可以直接使用一个代码文件运行monkeyrunner,抑或在交互式对话中输入monkeyrunner语句。不论使用哪种方式,你都需要调用SDK目录的tools子目录下的monkeyrunner命令。如果提供一个文件名作为运行参数,则monkeyrunner将视文件内容为python程序,并加以运行;否则,它将提供一个交互对话环境。

3.4  monkeyrunner命令语法

monkeyrunner -plugin

3.5 monkeyrunner API

主要包括三个模块

1、MonkeyRunner:这个类提供了用于连接monkeyrunner和设备或模拟器的方法,它还提供了用于创建用户界面显示提供了方法。

2、MonkeyDevice:代表一个设备或模拟器。这个类为安装和卸载包、开启Activity、发送按键和触摸事件、运行测试包等提供了方法。

3、MonkeyImage:这个类提供了捕捉屏幕的方法。这个类为截图、将位图转换成各种格式、对比两个MonkeyImage对象、将image保存到文件等提供了方法。

3.6 导入需要的模块

方式一:

import sys

from com.android.monkeyrunner import MonkeyRunner as mr

from com.android.monkeyrunner import MonkeyDevice as md

from com.android.monkeyrunner import MonkeyImage as mi

如果给导入的模块起了别名,就应该使用别名,而不能使用原名,否则会出现错误。

比如连接设备或模拟器,起了以上别名后,命令应该如下:

device=mr.waitForConnection()

方式二:

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage

方式三:

import com.android.monkeyrunner

但是在使用时,就显得特别麻烦

device=com.android.monkeyrunner.MonkeyRunner.waitForConnection()

方式四:

我们也可以给它一个别名

import com.android.monkeyrunner as cam

但是在使用时,就显得特别麻烦

device=cam.MonkeyRunner.waitForConnection()

#等待连接到设备,与模拟器连接,返回monkeydevice对象,代表连接的设备。没有报错的话说明连接成功。

参数1:超时时间,单位秒,浮点数。默认是无限期地等待。

参数2:串deviceid,指定的设备名称。默认为当前设备(手机优先,比如手机通过USB线连接到PC、其次为模拟器)。

默认连接:device=MonkeyRunner.waitForConnection()

参数连接:device = mr.waitForConnection(1.0,'emulator-5554')

3.7 向设备或模拟器安装要测试的APK

device.installPackage('myproject/bin/MyApplication.apk') #参数是相对或绝对APK路径

路径级别用“/”,不能用“\”,比如d:\www\a.apk,而应该写成d:/www/a.apk

安装成功返回true,此时查看模拟器我们可以在IDLE界面上看到安装的APK的图标了。

3.8 从设备中删除指定的软件包,包括其相关的数据和调整缓存

device.removePackage('myproject/bin/MyApplication.apk')

删除成功返回true。

3.9 启动任意的Activity

device.startActivity(component="your.www.com/your.www.com.TestActivity")

或者

device.startActivity(component="your.www.com/.TestActivity")

此时可以向模拟器发送如按键、滚动、截图、存储等操作了。

执行一个adb shell命令,并返回结果,如果有的话

device.shell("...")

3.10 暂停目前正在运行的程序指定的秒数

MonkeyRunner.sleep(秒数,浮点数)

3.11 捕捉屏幕写入文件

获取设备的屏蔽缓冲区,产生了整个显示器的屏蔽捕获。(截图)

result=device.takeSnapshot()

返回一个MonkeyImage对象(点阵图包装),我们可以用以下命令将图保存到文件

result.writeToFile('takeSnapshot\\result1.png','png')

MonkeyImage.writeToFile(参数1:输出文件名,也可以包括路径,参数2:目标格式)

写成功返回true,否则返回false

3.12 type

键盘上的类型指定的字符串,这相当于要求每个字符串中的字符按(键码,DOWN_AND_UP).

字符串发送到键盘

device.type('字符串')

3.13 唤醒设备屏幕(在设备屏幕上唤醒)

device.wake()

3.14 重新引导到指定的引导程序指定的设备

device.reboot()

3.15 touch、press

在指定位置发送触摸事件(x,y的单位为像素)

device.touch(x,y,TouchPressType-触摸事件类型)

发送到指定键的一个关键事件

device.press(参数1:键码,参数2:触摸事件类型)

参数1:见android.view.KeyEvent

参数2,如有TouchPressType()返回的类型-触摸事件类型,有三种。

1、DOWN 发送一个DOWN事件。指定DOWN事件类型发送到设备,对应的按一个键或触摸屏幕上。

2、UP 发送一个UP事件。指定UP事件类型发送到设备,对应释放一个键或从屏幕上抬起。

3、DOWN_AND_UP 发送一个DOWN事件,然后一个UP事件。对应于输入键或点击屏幕。

以上三种事件做为press()或touch()参数。原英文如下:

use this with the type argument of press() or touch() to send a down event.

为了模拟输入键,发送DOWN_AND_UP。

参数1的部分具体内容逻辑:

按下HOME键 device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)

按下BACK键 device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)

按下下导航键 device.press('KEYCODE_DPAD_DOWN',MonkeyDevice.DOWN_AND_UP)

按下上导航键 device.press('KEYCODE_DPAD_UP',MonkeyDevice.DOWN_AND_UP)

按下OK键 device.press('KEYCODE_DPAD_CENTER',MonkeyDevice.DOWN_AND_UP)

device.press('KEYCODE_ENTER',MonkeyDevice.DOWN_AND_UP)#输入回车

device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)#点击返回

home键 KEYCODE_HOME

back键 KEYCODE_BACK

send键 KEYCODE_CALL

end键 KEYCODE_ENDCALL

上导航键 KEYCODE_DPAD_UP

下导航键 KEYCODE_DPAD_DOWN

左导航 KEYCODE_DPAD_LEFT

右导航键 KEYCODE_DPAD_RIGHT

ok键 KEYCODE_DPAD_CENTER

上音量键 KEYCODE_VOLUME_UP

下音量键 KEYCODE_VOLUME_DOWN

power键 KEYCODE_POWER

camera键 KEYCODE_CAMERA

menu键 KEYCODE_MENU

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第五届蓝桥杯校内选拔赛试题java组_第五届蓝桥杯校内选拔赛试题java组

第五届“蓝桥杯”全国软件和信息技术专业人才大赛校内选拔赛试题(Java组)第一部分:准备工作:1、在D:盘中建立一个以自己“学号姓名”命名的考生文件夹。如:学号:123456,姓名:张三,则…

nfs需要开通什么端口_创业板开通需要什么条件?开通创业板门槛,要怎么样开通创业板?...

开通创业板需要什么条件,创业板要怎么开通?根据这两个问题进行详细分析创业板股票开通的条件和具体怎么开通,开通创业板之前必须要满足创业板开通条件。一、旧创业板开通条件就得创业板开通是非常简单的,只要满足以下两点&#xf…

java自学报告_Vi,Java,Ant和Junit自学报告

vi自学报告概述vi 编辑器是所有 Unix 及 Linux 系统下最基本的编辑器,它直接以命令行窗口作为显示界面。vim是vi的升级版,完全兼容vi并提供了一些新的特性。因为vi、vim完全脱离鼠标而使用纯键盘控制,所以熟练以后能大大提高编辑效率。vi的模…

java开发文档怎么写_程序员该不该写技术文档,怎么写文档,易懂又能提升自己...

最近公司项目的调用量突然涨了一大波,很多系统都纷纷扛不住了,于是需要对系统进行优化,系统优化的第一步,便是梳理业务!在这个过程中,经常出现了这样一些情况,发现数据库的某些字段,…

java矩阵类_java矩阵类,矩阵的乘法

问题如下我采用的是3重循环,先计算的列的结果,应该还可以先计算行的结果,然后求出矩阵的乘法。没有过多的技巧,就是循环的使用。相关的codepackage day20180728;import java.util.Scanner;class Matrix{private int m,n;private i…

python个人网站系统_利用基于Python的Pelican打造一个自己的个人纯静态网站

其实呢这么多年以来我一直建议每个有技术追求的开发者都要有写技术博客记笔记的良好习惯,一来可以积累知识,二来可以帮助别人,三来可以把开发中遇到的问题记录用来自省,第四可以通过交换友链来结识更多的技术领域的同仁。之前我曾…

java 编译宏_java – 制作一个“宏”命令来运行程序

(编辑:根据您的评论,让我展开以添加更多情况)如果您的目标是让其他人运行您没有安装Java的程序,并且您不希望让他们在运行您的应用程序之前安装Java运行时环境,那么您需要的是一个转换.class或.jar的程序将文件转换为您正在使用的平台的本机可执行文件.其他问题涉及…

python在工厂中的运用_在python中使用元类实现工厂设计模式

我很乐意听到人们对此的评论,但我认为这是你想做什么的一个例子class FactoryMetaclassObject(type):def __init__(cls, name, bases, attrs):"""__init__ will happen when the metaclass is constructed:the class object itself (not the instanc…

java多线程教程_java 基础教程之多线程详解及简单实例

java 多线程详解在这篇文章里,我们关注多线程。多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性、如何创建线程、线程的状态切换以及线程通信。线程是操作系统运行的基本单位,它被封装在进程中&#xff0c…

多个for语句嵌套执行顺序_阿里真实面试题解析之实现多个线程顺序执行的几种方式...

前几天有一位同事在阿里一面的时候被问到这么一个多线程问题:如何保证多个线程的顺序执行。当时他没有回答上来,所以为了避免大家以后遇到同样的面试题还是回答不上来,今天我们就来分析解答下这个问题。问题缘由由于线程执行是靠CPU分时间片来…

java filter过滤器 网站访问量_Servlet过滤器实现网站访问计数器功能

实现网站在线访问计数器功能,网站的初始值设置为1000(1)创建CountFilter的类,实现javax。servlet.Filter接口,是一个过滤器对象,通过过滤器实现统计网站人数功能:package com.lixiyu;import java.io.IOException;impor…

js立即执行函数_《JS 函数的执行时机》

1 、为什么如下代码会打印 6 个 6let i 0 for(i 0; i<6; i){setTimeout(()>{console.log(i)},0) }那是因为setTiout函数的意义是‘做完当前的事情&#xff0c;再去执行’0代表时间&#xff0c;表示做完循环立刻打印i的值&#xff0c;所以 i的值经过for循环已经循环到6&…

java微信demo_微信登陆 , 简单的demo , java

这几天简单的做了一下微信登陆的demo&#xff0c;希望对大家有帮助不多说&#xff0c;直接上代码&#xff1a;/**** author TY**/ControllerRequestMapping("/wechatlogin")public class WechatLoginController {/*** 请求CODE** param response* throws Exception*/…

windows的python切换环境_Windows下的python虚拟环境设置

Windows下的python虚拟环境设置&#xff1a;virtualenv在python开发中&#xff0c;我们可能会遇到一种情况&#xff1a;就是当前的项目依赖的是某一个版本&#xff0c;但是另一个项目依赖的是另一个版本&#xff0c;这样就会造成依赖冲突。在这种情况之下&#xff0c;我们就需要…

python怎么理解_讨论 - 廖雪峰的官方网站

我的电脑是win7x64的系统安装的是Python3.4.3这是hello.py模块!/usr/bin/env python3-- coding: utf-8 --just a testauthor HZFimport sysdef test():args sys.argvif len(args)1:print(Hello world!)elif len(args)2:print(Hello %s! % args[1])else:print(Too many argume…

java visitor_java11教程--接口FileVisitor用法

文件的访问者。该接口的实现被提供给Files.walkFileTree方法以访问文件树中的每个文件。用法示例&#xff1a;假设我们要删除文件树。 在这种情况下&#xff0c;删除目录中的条目后&#xff0c;应删除每个目录。Path start ...Files.walkFileTree(start, new SimpleFileVisito…

postscript怎么打开_怎么把在学习中用的Adobe PDF文件转换成Microsoft office Word

现在我们普遍用的都是Adobe PDF格式的文件&#xff0c;可是Microsoft office Word&#xff08;.doc,.docx&#xff09;文档也是我们经常要用的&#xff0c;所以就需要将Adobe PDF转换Microsoft office Word&#xff08;.doc,.docx&#xff09;文档了&#xff0c;怎么将Adobe PD…

python类实例覆盖_避免类实例覆盖默认值

我正在处理初始化类的问题。下面是一个复制的例子&#xff0c;突出了潜在的问题(我没有设法使它小得多)&#xff1a;课程我们有两个类A,B。等级制度A&#xff1a;第一类实例有两个属性link;name^{cd2>的一个属性是这个类的。在为了更快地声明B的实例&#xff0c;我考虑了以下…

vector父类类型可以存放子类吗_拼夕夕三轮面经:被问到反射和泛型的bug,你踏空了吗?...

点击上方“JavaEdge”&#xff0c;关注公众号设为“星标”&#xff0c;好文章不错过&#xff01;1 当反射遇见方法重载重载grade方法&#xff0c;入参分别为int、Integer。若不通过反射这种高级编程方式&#xff0c;选用哪个重载方法自然很清晰&#xff0c;比如传666走int参数重…

雨林木风系统封装工具封装xp_如何用小丸工具大幅度压缩视频且画质损失较小?...

如何大幅度把视频体积压下去&#xff0c;并保持清晰度&#xff0c;就只有用比视频原本低的码率&#xff0c;降低分辨率和压缩音频这三种方法。降低码率可以使用CRF来控制&#xff0c;值越大码率越小&#xff0c;成反比。一些录屏和直播的视频产生的码率都很高&#xff0c;文件体…