渡九不渡十 發表於 2019-7-24 15:00:00

Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)

<h2><strong>简介</strong></h2>
<p><strong>  </strong>看《西游记》第五十七回,说是“六耳猕猴”化作孙悟空的摸样,伤了唐僧,后又和孙悟空大打出手…… 这位假孙悟空,实力不用多说了吧,和真孙悟空一般无二,大战孙悟空,闹到上天入地下海。 在唐僧那:念紧箍咒,两个都喊疼,自然看不出哪个真假; 到天宫:拖塔天王拿照妖镜照,也看不出; 又到观音那:观音也看不出。最后到幽冥处阎罗那,经“谛听”听过之后,“谛听”却说:“我看出来了,却不敢说” 最后还是如来老佛爷道出六耳真身并用金钵盂罩住,才被孙悟空一棍子打死。想必各位小伙伴都看过这以精彩片段。不过据知情人士说真假美猴王存在阴谋,这里有黑幕:说是真的孙悟空被打死了,活下来的是假的。好了废话少说,还是回到今天的主题:真假美猴王Monkeyrunner与Monkey傻傻的分不清楚。</p>
<p>  今天宏哥就带着各位小伙伴和童鞋们再当一回和尚:如来佛祖辨一辨真假美猴王,前边我们已经对monkey做过一些详细的介绍和讲解,今天我们就再来介绍和讲解一下monkeyrunner。看看他们之间的到底是一样还是有区别的。</p>
<h2><strong>monkeyrunner简介</strong></h2>
<p>1.<span style="font-size: 14px">monkeyrunner工具使用Jython,这是一种使用Java编程语言的Python实现。Jython允许monkeyrunner API与Android框架轻松交互。使用Jython,您可以使用Python语法来访问API的常量,类和方法。MonkeyRunner工具是使用Jython(使用Java编程语言实现的</span></p>
<p><span>Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制Android设备app,测试其稳定性并通过截屏可以方便地记录出现的问题。</span></p>
<p><span style="font-size: 14px">2.我们来看一下monkeyrunner官网是如何介绍monkeyrunner的:</span></p>
<p><span>官网介绍(已翻译成中文)宏哥在这里给小伙伴截取一段翻译,如下:</span></p>
<p><span style="font-size: 14px">   monkeyrunner工具提供了一个API,用于编写从Android代码外部控制Android设备或模拟器的程序。使用monkeyrunner,您可以编写一个Python程序,安装Android应用程序或测试包,运行它,向其发送击键,截取其用户界面,并在工作站上存储屏幕截图、</span></p>
<p>monkeyrunner工具主要用于测试功能/框架级别的应用程序和设备以及运行单元测试套件,但您可以将其用于其他目的。</p>
<p><span>monkeyrunner工具与UI / Application Exerciser Monkey无关 ,也称为monkey工具。该monkey工具adb直接在设备或仿真器上的shell中运行, 并生成用户和系统事件的伪随机流。相比之下,monkeyrunner工具通过从API发送特定命令和事件来控制工作站中的设备和</span></p>
<p>仿真器。</p>
<p><span style="font-size: 14px">3.monkeyrunner即android SDK中自带的工具之一,此工具提供API可按制android设备或模拟器。</span></p>
<p>4.有兴趣的小伙伴们或者童鞋可以查看一下monkeyrunner官网:https://www.android-doc.com/tools/help/monkeyrunner_concepts.html</p>
<p><span style="font-size: 14px">5.monkeyrunner 路径:Andriod_SDK\tools</span></p>
<h2><strong>MonkeyRunner工具独特功能</strong></h2>
<p>1.多设备控制:monkeyrunner API可以跨多个设备或仿真器应用一个或多个测试套件。您可以物理连接所有设备或立即启动所有模拟器(或两者),以编程方式依次连接到每个设备,然后运行一个或多个测试。您还可以以编程方式启动模拟器配置,运行一个或多个测试,然后关闭模拟器。</p>
<p>2.功能测试:monkeyrunner可以对Android应用程序进行自动化的从头到尾的测试。您可以通过击键或触摸事件提供输入值,并将结果视为屏幕截图。</p>
<p>3.回归测试 - monkeyrunner可以通过运行应用程序并将其输出屏幕截图与一组已知正确的屏幕截图进行比较来测试应用程序的稳定性。</p>
<p>4.可扩展的自动化 - 由于monkeyrunner是一个API工具包,您可以开发一个基于Python的模块和程序的整个系统来控制Android设备。除了使用monkeyrunner API本身,您还可以使用标准的Python&nbsp;<code>os</code>和&nbsp;<code>subprocess</code>&nbsp;模块来调用Android工具,例如&nbsp;Android Debug Bridge。</p>
<p>您还可以将自己的类添加到monkeyrunner API中。这在“&nbsp;使用插件扩展monkeyrunner&nbsp;”一节中有更详细的描述&nbsp;。</p>
<h2><strong>Monkeyrunner与Monkey区别</strong></h2>
<p class="p">monkeyrunner和money没有什么直接的关系,monkey是在设备直接运行adb shell命令生成随机事件来进行测试的。相比较而言,monkeyrunner则是通过API发送特定的命令和事件来控制设备。</p>
<p>为了支持黑盒自动化测试的场景,Android SDK提供了monkey和monkeyrunner两个测试工具,这两个测试工具除了名字类似外,还都可以向待测应用发送按键等消息,往往容易产生混淆,以下是他俩的不同之处。</p>
<p>Monkey:</p>
<p>Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。</p>
<p>1.monkey运行在设备或者模拟器上边,可以脱离PC运行,其运行时如下图所示。</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190723151622115-2022255479.png" alt=""></p>
<p>&nbsp;</p>
<p>Monkeyrunner:</p>
<p>Monkeyrunner工具是在工作站上通过API定义的特定命令和事件控制设备或模拟器。</p>
<p>而monkeyrunner运行在PC上,需要通过服务器/客户端的的模式向设备或者模拟器上的android应用发送指令来执行测试,其运行时如下图所示。</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190723152043213-171977450.png" alt=""></p>
<p>&nbsp;</p>
<p>2.普遍的做法是将monkey作为一个向待测应用发送随机按键消息的测试工具,验证待测应用在这些随机性的输入面前是否会有闪退或者崩溃。而monkeyrunner则接受一个明确的测试脚本(使用python语言编写的)。</p>
<p>3.虽然monkey也可以根据一个指定的命令脚本发送按键消息,但其不支持条件判断,也不支持读取界面的信息来执行验证操作。而monkeyrunner的测试脚本中有明确 的条件判断等语句,可用来做功能测试。</p>
<p>&nbsp;总结:</p>
<p>  实际操作中,monkey由于缺少必要的条件判断等命令,难以在功能测试上有所作为,只能作为生成一些随机事件的工具,测试应用程序的健壮程度,待测应用崩溃后可以根据monkey打印的日志,再用monkey创建一个重现步骤,供开发调试。monkey服务器模式更适合用于黑盒测试,不建议用于自动化测试。</p>
<p>  而Monkeyrunner虽然有Python和Java类库的强大支持,但其自身提供的API有限,还得需要插件扩展其功能。</p>
<h2><strong>monkeyrunner API</strong></h2>
<p><span>monkeyrunner API包含在包中的三个模块中&nbsp;</span><code>com.android.monkeyrunner</code><span>:</span></p>
<p><code>1.MonkeyRunner</code>:monkeyrunner程序的一类实用方法。此类提供了将monkeyrunner连接到设备或模拟器的方法。它还提供了为monkeyrunner程序创建UI以及显示内置帮助的方法。</p>
<p><code>2.MonkeyDevice</code>:表示设备或模拟器。此类提供了安装和卸载软件包,启动Activity以及向应用程序发送键盘或触摸事件的方法。您还可以使用此类来运行测试包。</p>
<p><code>3.MonkeyImage</code>:表示屏幕捕获图像。此类提供捕获屏幕,将位图图像转换为各种格式,比较两个MonkeyImage对象以及将图像写入文件的方法。</p>
<p><span><span>在Python程序中,您可以将每个类作为Python模块进行访问。</span><span>monkeyrunner工具不会自动导入这些模块。</span><span>要导入模块,请使用Python&nbsp;</span></span><code>from</code><span>语句:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">from</span> com.android.monkeyrunner import &lt;module&gt;</pre>
</div>
<p><span><code>&lt;module&gt;</code><span><span>您要导入的类名</span><span>&nbsp;在哪里</span><span>。</span></span><code>from</code><span><span>通过用逗号分隔模块名称,</span><span>可以在同一</span><span>语句中</span><span>导入多个模块</span><span>。</span></span></span></p>
<h2><span><span><span>运行monkeyrunner</span></span></span></h2>
<p><span><span>您可以从文件中运行monkeyrunner程序,也可以在交互式会话中输入monkeyrunner语句。</span><span>您可以通过调用</span><span>SDK目录子目录中</span><span>的</span></span><code>monkeyrunner</code><span><span>命令来</span><span>执行这两项操作</span></span><code>tools/</code><span><span>。</span><span>如果提供文件名作为参数,则该</span></span><code>monkeyrunner</code><span><span>命令将文件的内容作为Python程序运行;&nbsp;</span><span>否则,它会启动一个交互式会话。</span></span></p>
<p><span>该</span><code>monkeyrunner</code><span><span>命令</span><span>的语法</span><span>是</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> monkeyrunner -plugin &lt;plugin_jar&gt; &lt;program_filename&gt; &lt;program_options&gt;</pre>
</div>
<p><span>表1解释了标志和参数。</span></p>
<p id="table1" class="table-caption"><strong>表1.</strong>&nbsp;<code>monkeyrunner</code><span>标志和参数。</span></p>
<p>&nbsp;</p>
<table>
<tbody>
<tr><th><span><span>参数</span></span></th><th><span><span>描述</span></span></th></tr>
<tr>
<td><code>-plugin &lt;plugin_jar&gt;</code></td>
<td><span><span>(可选)指定</span></span><code>.jar</code><span><span>包含monkeyrunner插件</span><span>的</span><span>文件。</span><span>要了解有关monkeyrunner插件的更多信息,请参阅&nbsp;</span></span>使用插件扩展monkeyrunner<span><span>。</span><span>要指定多个文件,请多次包含该参数。</span></span></td>
</tr>
<tr>
<td><code>&lt;program_filename&gt;</code></td>
<td><span><span>如果提供此参数,则该</span></span><code>monkeyrunner</code><span><span>命令将该文件的内容作为Python程序运行。</span><span>如果未提供参数,则该命令将启动交互式会话。</span></span></td>
</tr>
<tr>
<td><code>&lt;program_options&gt;</code></td>
<td><span><span>(可选)&lt;program_file&gt;中程序的标志和参数。<br><br></span></span></td>




















</tr>




















</tbody>



















</table>
<p>运行monkeyrunner</p>
<p>命令语法为:</p>
<div class="cnblogs_code">
<div>monkeyrunner&nbsp;-plugin&nbsp;&lt;plugin_jar&gt;&nbsp;&lt;program_filename&gt;&nbsp;&lt;program_options&gt;</div>

















</div>
<p>&nbsp;</p>
<p>方式一:在CMD命令窗口直接运行monkeyrunner</p>
<p>方式二:使用Python编写测试代码文件,在CMD中执行monkeyrunner hongge.py运行</p>
<p>不论使用哪种方式,您都需要调用SDK目录的tools子目录下的monkeyrunner命令。</p>
<p>&nbsp;</p>
<div>注意:在运行monkeyrunner之前必须先运行相应的模拟器或连接真机,否则monkeyrunner无法连接到设备</div>
<div>运行模拟器有两种方法:1、通过eclipse中执行模拟器 2、在CMD中通过命令调用模拟器</div>
<div>这里介绍通过命令,在CMD中执行模拟器的方法</div>
<div>
<div class="cnblogs_code">
<div>emulator&nbsp;-avd&nbsp;test</div>

















</div>

















</div>
<div>上面命令中test是指模拟器的名称。</div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: small">附:这部分前边已经讲解过,在这里就不再赘述)</span></p>
<p>问题:CMD运行提示monkeyrunner不是内部或外部命令,也不是可运行的程序或批处理文件。</p>
<p>解决:电脑环境变量未配置,将monkeyrunner所在目录配在环境变量里。</p>
<p>变量名:Path</p>
<p>变量值:D:\android\android-sdk-windows\tools;D:\android\android-sdk-windows\platform-tools</p>
<h3 id="Mon5">实例</h3>
<p><strong>实例一:卸载旧的APP,安装新的APP&nbsp;</strong></p>
<p><strong>*准备</strong></p>
<p>a.&nbsp;连接安卓夜神模拟器设备</p>
<p>b.&nbsp;运行CMD,检测是否连接成功</p>
<p>CMD&gt;adb devices</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724140453547-1677769529.png" alt=""></p>
<p>&nbsp;</p>
<p>附:(这部分前边已经讲解过,在这里就不再赘述)</p>
<p>问题:CMD运行提示adb不是内部或外部命令,也不是可运行的程序或批处理文件。</p>
<p>解决:电脑环境变量未配置,将adb所在目录配在环境变量里。&nbsp;&nbsp;</p>
<p><strong>*方式一:</strong>&nbsp;</p>
<p>1.打开CMD,运行monkeyrunner</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724141816019-389109459.png" alt=""></p>
<p>&nbsp;</p>
<p>2.进入monkeyrunner的shell命令交互模式后,逐条输入以下命令</p>
<div class="cnblogs_code">
<div>1&nbsp;from&nbsp;com.android.monkeyrunner&nbsp;import&nbsp;MonkeyRunner,&nbsp;MonkeyDevice,&nbsp;MonkeyImage<br>2&nbsp;device&nbsp;=&nbsp;MonkeyRunner.waitForConnection()<br>3&nbsp;device.removePackage('com.taobao.taobao')<br>4&nbsp;device.installPackage('C:\\Users\\DELL\\Desktop\\702757.apk')</div>


















</div>
<p>(1)输入命令前的夜神模拟器:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724141633810-995857666.png" alt=""></p>
<p>(2)输入第三行命令后的夜神模拟器</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724141949951-477522064.png" alt=""></p>
<p>(3)输入第四行的夜神模拟器</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724142237858-1376009324.png" alt=""></p>
<p>&nbsp;</p>
<p>注:每条命令的作用,请见方法二中的注解</p>
<p>实操如图:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724142405241-1106331487.png" alt=""></p>
<p>&nbsp;</p>
<p>c.检查手机app是否已更新&nbsp;</p>
<p><strong>*方式二:</strong></p>
<p><strong>a.&nbsp;编写Python测试代码</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)"># File:   Test1.py
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> # Vision: V1.<span style="color: rgba(128, 0, 128, 1)">0</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)"># Author: honggeQQ群:707699217
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)"># 引入本程序所用到的模块
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)"># 连接手机设备
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> device =<span style="color: rgba(0, 0, 0, 1)"> MonkeyRunner.waitForConnection()
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)"># 截图
</span><span style="color: rgba(0, 128, 128, 1)">11</span> result =<span style="color: rgba(0, 0, 0, 1)"> device.takeSnapshot()
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)"># 将截图保存到文件
</span><span style="color: rgba(0, 128, 128, 1)">13</span> result.writeToFile(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">E:\\JAVA\\monkeyrunner\\Test1\\Test1_001.png</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">png</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)"># 卸载APP
</span><span style="color: rgba(0, 128, 128, 1)">16</span> device.removePackage(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">cn.richinfo.thinkdrive</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">17</span> print (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Uninstall Success!</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)"># 暂停5秒
</span><span style="color: rgba(0, 128, 128, 1)">20</span> MonkeyRunner.sleep(<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)"># 截图
</span><span style="color: rgba(0, 128, 128, 1)">23</span> result =<span style="color: rgba(0, 0, 0, 1)"> device.takeSnapshot()
</span><span style="color: rgba(0, 128, 128, 1)">24</span> result.writeToFile(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">E:\\JAVA\\monkeyrunner\\Test1\\Test1_002.png</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">png</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">25</span>
<span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)"># 安装新的APP
</span><span style="color: rgba(0, 128, 128, 1)">27</span> device.installPackage(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">28</span> print (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Install Success!</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">29</span>
<span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 0, 1)"># 截图
</span><span style="color: rgba(0, 128, 128, 1)">31</span> result =<span style="color: rgba(0, 0, 0, 1)"> device.takeSnapshot()
</span><span style="color: rgba(0, 128, 128, 1)">32</span> result.writeToFile(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">E:\\JAVA\\monkeyrunner\\Test1\\Test1_003.png</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">png</span><span style="color: rgba(128, 0, 0, 1)">'</span>)</pre>
</div>
<p>注:拷贝运行时请去掉中文注释;或者在开头加入&nbsp;#coding=utf-8&nbsp;</p>
<p><strong>b.执行Test1.py脚本</strong></p>
<div class="cnblogs_code">
<pre>Monkeyrunner C:\Users\DELL\Desktop\test.py</pre>
</div>
<p>实操如图:</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724143612597-1937846247.png" alt=""></p>
<p>&nbsp;</p>
<p>c.检查手机app是否已更新</p>
<p>d.查看截图文件夹,截图和上边逐条输入命令,宏哥截得模拟器一模一样的。</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724145203353-1716925033.png" alt=""></p>
<p>e.注意如果截图不一样自己加个等待时间,就会一样,参考代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> #coding=utf-<span style="color: rgba(128, 0, 128, 1)">8</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)"># File:   Test1.py
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> # Vision: V1.<span style="color: rgba(128, 0, 128, 1)">0</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> # Author: honggeQQ群:<span style="color: rgba(128, 0, 128, 1)">707699217</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)"># 引入本程序所用到的模块
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
</span><span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"># 连接手机设备
</span><span style="color: rgba(0, 128, 128, 1)">15</span>
<span style="color: rgba(0, 128, 128, 1)">16</span> device =<span style="color: rgba(0, 0, 0, 1)"> MonkeyRunner.waitForConnection()
</span><span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span>
<span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)"># 截图
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> result =<span style="color: rgba(0, 0, 0, 1)"> device.takeSnapshot()
</span><span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)"># 将截图保存到文件
</span><span style="color: rgba(0, 128, 128, 1)">25</span>
<span style="color: rgba(0, 128, 128, 1)">26</span> result.writeToFile(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">C:\\Users\\DELL\\Desktop\\test\\Test1_001.png</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">png</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">27</span>
<span style="color: rgba(0, 128, 128, 1)">28</span>
<span style="color: rgba(0, 128, 128, 1)">29</span>
<span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 0, 1)"># 卸载APP
</span><span style="color: rgba(0, 128, 128, 1)">31</span>
<span style="color: rgba(0, 128, 128, 1)">32</span> device.removePackage(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">com.taobao.taobao</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">33</span>
<span style="color: rgba(0, 128, 128, 1)">34</span> print (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Uninstall Success!</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">35</span>
<span style="color: rgba(0, 128, 128, 1)">36</span>
<span style="color: rgba(0, 128, 128, 1)">37</span>
<span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 0, 1)"># 暂停5秒
</span><span style="color: rgba(0, 128, 128, 1)">39</span>
<span style="color: rgba(0, 128, 128, 1)">40</span> MonkeyRunner.sleep(<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">41</span>
<span style="color: rgba(0, 128, 128, 1)">42</span>
<span style="color: rgba(0, 128, 128, 1)">43</span>
<span style="color: rgba(0, 128, 128, 1)">44</span> <span style="color: rgba(0, 0, 0, 1)"># 截图
</span><span style="color: rgba(0, 128, 128, 1)">45</span>
<span style="color: rgba(0, 128, 128, 1)">46</span> result =<span style="color: rgba(0, 0, 0, 1)"> device.takeSnapshot()
</span><span style="color: rgba(0, 128, 128, 1)">47</span>
<span style="color: rgba(0, 128, 128, 1)">48</span> result.writeToFile(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">C:\\Users\\DELL\\Desktop\\test\\Test1_002.png</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">png</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">49</span>
<span style="color: rgba(0, 128, 128, 1)">50</span>
<span style="color: rgba(0, 128, 128, 1)">51</span> <span style="color: rgba(0, 0, 0, 1)"># 暂停5秒
</span><span style="color: rgba(0, 128, 128, 1)">52</span>
<span style="color: rgba(0, 128, 128, 1)">53</span> MonkeyRunner.sleep(<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">54</span>
<span style="color: rgba(0, 128, 128, 1)">55</span>
<span style="color: rgba(0, 128, 128, 1)">56</span> <span style="color: rgba(0, 0, 0, 1)"># 安装新的APP
</span><span style="color: rgba(0, 128, 128, 1)">57</span>
<span style="color: rgba(0, 128, 128, 1)">58</span> device.installPackage(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">C:\\Users\\DELL\\Desktop\\702757.apk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">59</span>
<span style="color: rgba(0, 128, 128, 1)">60</span> print (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Install Success!</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">61</span>
<span style="color: rgba(0, 128, 128, 1)">62</span> <span style="color: rgba(0, 0, 0, 1)"># 暂停5秒
</span><span style="color: rgba(0, 128, 128, 1)">63</span>
<span style="color: rgba(0, 128, 128, 1)">64</span> MonkeyRunner.sleep(<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">65</span>
<span style="color: rgba(0, 128, 128, 1)">66</span> <span style="color: rgba(0, 0, 0, 1)"># 截图
</span><span style="color: rgba(0, 128, 128, 1)">67</span>
<span style="color: rgba(0, 128, 128, 1)">68</span> result =<span style="color: rgba(0, 0, 0, 1)"> device.takeSnapshot()
</span><span style="color: rgba(0, 128, 128, 1)">69</span>
<span style="color: rgba(0, 128, 128, 1)">70</span> result.writeToFile(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">C:\\Users\\DELL\\Desktop\\test\\Test1_003.png</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">png</span><span style="color: rgba(128, 0, 0, 1)">'</span>)</pre>
</div>
<p>&nbsp;</p>
<h2 id="Help"><span>monkeyrunner内置帮助</span></h2>
<p><span>您可以通过运行以下命令为monkeyrunner生成API参考:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> monkeyrunner help.py &lt;format&gt; &lt;outfile&gt;</pre>
</div>
<p><span>论点是:</span></p>
<ul>
<li><code>&lt;format&gt;</code><span>或者是</span><code>text</code><span>纯文本的输出或</span><code>html</code><span>用于HTML输出。</span></li>
<li><code>&lt;outfile&gt;</code><span>&nbsp;是输出文件的路径限定名称。</span></li>
</ul>
<h2 id="Plugins"><span>使用插件扩展monkeyrunner</span></h2>
<p><span>您可以使用Java编程语言编写的类扩展monkeyrunner API,并将其构建为一个或多个</span><code>.jar</code><span><span>文件。</span><span>您可以使用此功能使用您自己的类扩展monkeyrunner API或扩展现有类。</span><span>您还可以使用此功能初始化monkeyrunner环境。</span></span></p>
<p><span>要为monkeyrunner提供插件,请</span><code>monkeyrunner</code><span><span>使用</span><span>表1中</span></span><code>-plugin &lt;plugin_jar&gt;</code><span><span>描述</span><span>的</span><span>参数&nbsp;</span><span>调用该</span><span>命令&nbsp;</span><span>。</span></span></p>
<p><span>在你的插件代码,你可以导入和扩展的主要monkeyrunner类&nbsp;</span><code>MonkeyDevice</code><span>,</span><code>MonkeyImage</code><span>和</span><code>MonkeyRunner</code><span>在</span><code>com.android.monkeyrunner</code><span>(见</span>的monkeyrunner API<span>)。</span></p>
<p><span><span>请注意,插件不允许您访问Android SDK。</span><span>您无法导入包等</span></span><code>com.android.app</code><span><span>。</span><span>这是因为monkeyrunner与框架API级别下的设备或模拟器交互。</span></span></p>
<h3><span>插件启动类</span></h3>
<p><code>.jar</code><span><span>插件</span><span>&nbsp;的</span><span>文件可以指定在脚本处理开始之前实例化的类。</span><span>要指定此类,请将密钥添加&nbsp;</span></span><code>MonkeyRunnerStartupRunner</code><span>到</span><code>.jar</code><span><span>文件的清单中。</span><span>该值应该是启动时要运行的类的名称。</span><span>以下代码段显示了如何在</span></span><code>ant</code><span><span>构建脚本中</span><span>执行此操作</span><span>:</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;jar jarfile=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">myplugin</span><span style="color: rgba(128, 0, 0, 1)">"</span> basedir=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${build.dir}</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span> &lt;manifest&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span> &lt;attribute name=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MonkeyRunnerStartupRunner</span><span style="color: rgba(128, 0, 0, 1)">"</span> value=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.myapp.myplugin</span><span style="color: rgba(128, 0, 0, 1)">"</span>/&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span> &lt;/manifest&gt;
<span style="color: rgba(0, 128, 128, 1)">5</span> &lt;/jar&gt;</pre>
</div>
<p><span><span><span>要访问monkeyrunner的运行时环境,启动类可以实现&nbsp;</span></span><code>com.google.common.base.Predicate&lt;PythonInterpreter&gt;</code><span><span>。</span><span>例如,此类在默认命名空间中设置一些变量:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">package com.android.example;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> import com.google.common.<span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">.Predicate;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">import org.python.util.PythonInterpreter;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Main implements Predicate&lt;PythonInterpreter&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">    @Override
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>   <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> boolean apply(PythonInterpreter anInterpreter) {
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>         <span style="color: rgba(0, 128, 0, 1)">/*</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 128, 0, 1)">      * Examples of creating and initializing variables in the monkeyrunner environment's
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 128, 0, 1)">      * namespace. During execution, the monkeyrunner program can refer to the variables "newtest"
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 128, 0, 1)">      * and "use_emulator"
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 128, 0, 1)">      *
</span><span style="color: rgba(0, 128, 128, 1)">15</span>         <span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>         anInterpreter.<span style="color: rgba(0, 0, 255, 1)">set</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">newtest</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">enabled</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">17</span>         anInterpreter.<span style="color: rgba(0, 0, 255, 1)">set</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">use_emulator</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span>         <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">20</span>   }</pre>
</div>
<h2><strong>monkeyrunner环境搭建</strong></h2>
<p>1.安装并配置好jdk环境</p>
<p>2.安装android sdk</p>
<p>3.安装python&nbsp;</p>
<p>4.monkeyrunner环境变量配置: {Path}\Andriod_SDK\tools</p>
<h2><strong>安装结果检测</strong></h2>
<p class="p">在docs命令控制台输入命令:monkeyrunner出现如下显示内容则说明安装成功</p>
<p class="pre"><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190723141619119-1204423009.png" alt=""></p>
<p>&nbsp;</p>
<p class="p">Tips:退出monkeyrunner命令行模式可以 使用快捷键 ctrl+D退出。</p>
<p class="p"><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190723141713371-101370164.png" alt=""></p>
<p>&nbsp;</p>
<h2>小结</h2>
<h3>1.在方式二运行monkeyrunner报错(190724 14:33:20.837:S Script terminated due to an exception)</h3>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724143914277-707253371.png" alt=""></p>
<p>解决方法,报出该错误是使用的notepad++编码格式问题,notepad++默认编码格式是ansi,我们使用的monkeyrunner脚本格式是utf-8,因此有冲突</p>
<p>修改方法如下</p>
<p>首先,看我们的脚本编码格式是什么,我这里的是utf-8,因此不用再做修改</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724144045351-1660297025.png" alt=""></p>
<p>3.如果编码格式不是utf-8的,就要对它进行修改了,点击格式,选择utf-8,再保存,也可选择无BOM格式的</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724144158830-1423340720.png" alt=""></p>
<p>4.再来运行一下,这次成功了</p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724143612597-1937846247.png" alt=""></p>
<p>&nbsp;</p>
<h3>2.monkeyrunner常用的知识点</h3>
<div>#引入程序所用的模块</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">from</span> com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage </pre>
</div>
</div>
<p>&nbsp;</p>
<p>#引入程序所用的模块,使用别名</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">from</span> com.android.monkeyrunner import MonkeyRunner <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> mr
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">from</span> com.android.monkeyrunner import MonkeyDevice <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> md
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">from</span> com.android.monkeyrunner import MonkeyImage <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> mi
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">#如果给导入的模块起了别名,就必须使用别名,否则会出现错误。
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)">#比如连接设备或模拟器,起了以上别名后,命令应该如下:
</span><span style="color: rgba(0, 128, 128, 1)">6</span> device=mr.waitForConnection()</pre>
</div>
<p>&nbsp;</p>
<p>#连接到设备或模拟器</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">#参数1:超时时间,单位秒,浮点数。默认是无限期地等待。
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">#参数2:串deviceid,指定的设备名称。默认为当前设备(手机优先,比如手机通过USB线连接到PC、其次为模拟器)。
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">#默认连接:
</span><span style="color: rgba(0, 128, 128, 1)">4</span> device =<span style="color: rgba(0, 0, 0, 1)"> MonkeyRunner.waitForConnection()
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)">#参数连接:
</span><span style="color: rgba(0, 128, 128, 1)">6</span> device = MonkeyRunner.waitForConnection(<span style="color: rgba(128, 0, 128, 1)">1.0</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">4df74b8XXXXXXX</span><span style="color: rgba(128, 0, 0, 1)">'</span>) </pre>
</div>
<p>&nbsp;</p>
<p>#向设备或模拟器安装APK&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">#以下两种方式都是对的
</span><span style="color: rgba(0, 128, 128, 1)">2</span> device.installPackage(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">E:/JAVA/monkeyrunner/Test1/ThinkDrive_new.apk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">3</span> device.installPackage(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">4</span> #参数可以为绝对路径,也可为相对路径</pre>
</div>
<p>&nbsp;</p>
<p>#卸载设备或模拟器中的APK&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">#参数为APK包名
</span><span style="color: rgba(0, 128, 128, 1)">2</span> device.removePackage(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">cn.richinfo.thinkdrive</span><span style="color: rgba(128, 0, 0, 1)">'</span>) </pre>
</div>
<p>&nbsp;</p>
<div>#启动任意的Activity</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> #device.startActivity(component=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">包名/启动Activity</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">#以下两种都OK
</span><span style="color: rgba(0, 128, 128, 1)">3</span> device.startActivity(component=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cn.richinfo.thinkdrive/cn.richinfo.thinkdrive.ui.activities.NavigateActivity</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">4</span> device.startActivity(component=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cn.richinfo.thinkdrive/.ui.activities.NavigateActivity</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p>&nbsp;</p>
</div>
<div>&nbsp;</div>
<p>#手机截图&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">#获取设备的屏蔽缓冲区,产生了整个显示器的屏蔽捕获。(截图)
</span><span style="color: rgba(0, 128, 128, 1)">2</span> result=<span style="color: rgba(0, 0, 0, 1)">device.takeSnapshot()
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">#返回一个MonkeyImage对象(点阵图包装),我们可以用以下命令将图保存到文件
</span><span style="color: rgba(0, 128, 128, 1)">4</span> result.writeToFile(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">E:\\JAVA\\monkeyrunner\\Test1\\Test1_001.png</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">png</span><span style="color: rgba(128, 0, 0, 1)">'</span>)</pre>
</div>
<p>&nbsp;</p>
<p>#暂停&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">#暂停目前正在运行的程序指定的秒数
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">#MonkeyRunner.sleep(秒数,浮点数)
</span><span style="color: rgba(0, 128, 128, 1)">3</span> MonkeyRunner.sleep(<span style="color: rgba(128, 0, 128, 1)">5</span>)</pre>
</div>
<p>&nbsp;</p>
<div>#字符串发送到键盘&nbsp;</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> #device.type(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">字符串</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">2</span> device.type(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hongge</span><span style="color: rgba(128, 0, 0, 1)">'</span>)</pre>
</div>
<p>&nbsp;</p>
</div>
<div>#唤醒设备屏幕</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">#锁屏后,屏幕关闭,可以用下命令唤醒
</span><span style="color: rgba(0, 128, 128, 1)">2</span> device.wake()</pre>
</div>
</div>
<div>&nbsp;</div>
<p>#重起手机</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> device.reboot()</pre>
</div>
<p>&nbsp;</p>
<p>#模拟滑动</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">#device.drag(X,Y,D,S)
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">#X 开始坐标
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">#Y 结束坐标
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">#D 拖动持续时间(以秒为单位),默认1.0秒
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)">#S 插值点时要采取的步骤。默认值是10
</span><span style="color: rgba(0, 128, 128, 1)">6</span> device.drag((<span style="color: rgba(128, 0, 128, 1)">100</span>,<span style="color: rgba(128, 0, 128, 1)">1053</span>),(<span style="color: rgba(128, 0, 128, 1)">520</span>,<span style="color: rgba(128, 0, 128, 1)">1053</span>),<span style="color: rgba(128, 0, 128, 1)">0.1</span>,<span style="color: rgba(128, 0, 128, 1)">10</span>)</pre>
</div>
<p>&nbsp;</p>
<p>#在指定位置发送触摸事件&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">#device.touch(x,y,触摸事件类型)
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">#x,y的单位为像素
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">#触摸事件类型,请见下文中Findyou对device.press描述
</span><span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> device.touch(<span style="color: rgba(128, 0, 128, 1)">520</span>,<span style="color: rgba(128, 0, 128, 1)">520</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">DOWN_AND_UP</span><span style="color: rgba(128, 0, 0, 1)">'</span>)</pre>
</div>
<p>&nbsp;</p>
<p>#发送指定类型指定键码的事件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">#device.press(参数1:键码,参数2:触摸事件类型)
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">#参数1:见android.view.KeyEvent
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">#参数2,如有TouchPressType()返回的类型-触摸事件类型,有三种。
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> #<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">、DOWN 发送一个DOWN事件。指定DOWN事件类型发送到设备,对应的按一个键或触摸屏幕上。
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> #<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">、UP 发送一个UP事件。指定UP事件类型发送到设备,对应释放一个键或从屏幕上抬起。
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> #<span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">、DOWN_AND_UP 发送一个DOWN事件,然后一个UP事件。对应于输入键或点击屏幕。
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">以上三种事件做为press()参数或touch()参数
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">#按下HOME键
</span><span style="color: rgba(0, 128, 128, 1)">10</span> device.press(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">KEYCODE_HOME</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,MonkeyDevice.DOWN_AND_UP)
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">#按下BACK键
</span><span style="color: rgba(0, 128, 128, 1)">12</span> device.press(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">KEYCODE_BACK</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,MonkeyDevice.DOWN_AND_UP)
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">#按下下导航键
</span><span style="color: rgba(0, 128, 128, 1)">14</span> device.press(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">KEYCODE_DPAD_DOWN</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,MonkeyDevice.DOWN_AND_UP)
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">#按下上导航键
</span><span style="color: rgba(0, 128, 128, 1)">16</span> device.press(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">KEYCODE_DPAD_UP</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,MonkeyDevice.DOWN_AND_UP)
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">#按下OK键
</span><span style="color: rgba(0, 128, 128, 1)">18</span> device.press(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">KEYCODE_DPAD_CENTER</span><span style="color: rgba(128, 0, 0, 1)">'</span>,MonkeyDevice.DOWN_AND_UP) </pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;3.好了时间也不早了,今天就啰嗦、水到这里吧,哈哈!晚安。好梦!!!</p>
<p><span style="font-size: 14pt"><strong><strong>您的肯定就是我进步的动力。</strong>如果你感觉还不错,就请鼓励一下吧!记得点波&nbsp;<span style="font-size: 18pt; color: rgba(255, 0, 0, 1)">推荐</span>&nbsp;哦!!!(点击右边的小球即可)</strong></span><br><img class="csdn-preview-img" src="https://img-bbs.csdn.net/upload/201609/27/1474961982_791741.gif" alt=""></p>
<p><strong>个人公众号</strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201906/1232840-20190613114641312-1547169156.png" alt="" width="158" height="158"></p>
<p><strong>微信群</strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1232840/201907/1232840-20190724094259908-725232122.png" alt="" width="213" height="339"></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <div id="MySignature" style="display: block">
        <div style="font-size: 13px; border: 1px dashed rgb(45, 161, 45); padding: 10px 15px; background-color: rgb(248, 248, 248)">
                <label style="font-weight: bold">
                        &nbsp;&nbsp;&nbsp;&nbsp;为了方便大家在移动端也能看到我分享的博文,现已注册个人微信公众号,扫描左下方二维码即可,欢迎大家关注,提前解锁更多测试干货!有时间会及时分享相关技术博文。
                </label>
                <br>
                <label style="font-weight: bold">
                        &nbsp;&nbsp;&nbsp;&nbsp;为了方便大家互动讨论相关技术问题,刚刚建立了咱们的专门的微信群交流互动群,群内会分享交流测试领域前沿知识。请您扫描中间的微信二维码进群
                </label>
                <br>
                <label style="font-weight: bold">
                        &nbsp;&nbsp;&nbsp;&nbsp;为了方便大家互动讨论相关技术问题,现已组建专门的微信群,由于微信群满100,请您扫描右下方宏哥个人微信二维码拉你进群
                        <label style="font-weight: bold; color: red; font-size: 15px">
                                (请务必备注:已关注公众号进群)平时上班忙(和你一样),所以加好友不及时,请稍安勿躁~
                        </label>
                        ,欢迎大家加入这个大家庭,我们一起畅游知识的海洋。
                </label>
                <br>
                &nbsp;&nbsp;&nbsp;&nbsp;感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
                <br>
                &nbsp;&nbsp;&nbsp;&nbsp;如果您觉得阅读本文对您有帮助,请点一下左下角
               
                        “推荐”
               
                按钮,您的
                <label style="font-weight: bold; color: red; font-size: 15px">
                        “推荐”
                </label>
                将是我最大的写作动力!另外您也可以选择
               
                        【
                        <strong>
                                关注我
                        </strong>
                        】
               
                ,可以很方便找到我!
                <br>
                &nbsp;&nbsp;&nbsp;&nbsp;本文版权归作者和博客园共有,来源网址:
               
                        https://www.cnblogs.com/du-hong
               
                欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
        </div>
        <div style="text-align: center; margin-top: 10px">
                <p style=" font-weight: bolder; color: red; ">
                        公众号(关注宏哥)&NonBreakingSpace; &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;
                        &NonBreakingSpace; &NonBreakingSpace; &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;
                        &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace; &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;
                        &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace; &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;
                        微信群(扫码进群) &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;
                        &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace; &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;
                        &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace; &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;
                        &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace;
                        &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace; &NonBreakingSpace;&NonBreakingSpace;
                        &NonBreakingSpace;&NonBreakingSpace;&NonBreakingSpace; &NonBreakingSpace;&NonBreakingSpace;客服微信
                </p>
                <img style="width: 200px;padding-right: 50px;" alt="个人微信公众号" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191119095948011-608816619.png">
                <img style="width: 200px;padding-right: 65px;" alt="微信群" src="https://img2024.cnblogs.com/blog/1232840/202506/1232840-20250610113707419-637869921.png">
                <img style="width: 200px" alt="个人微信" src="https://img2018.cnblogs.com/common/1741949/201911/1741949-20191106101257091-849954564.png">
        </div>
</div><br><br>
来源:https://www.cnblogs.com/du-hong/p/11231188.html
頁: [1]
查看完整版本: Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)