由 uiautomator 二次开发得到的启发以及完善

UI自动化测试增强
本文介绍了一种使用UIAutomatorViewer自动生成控件定位符的方法,并深入探讨了如何通过添加自定义功能来提升UI自动化测试效率。包括实现右键菜单、脚本录制功能,以及通过ADB shell进行控件点击的具体实现。

最近看到cpfeng0124 的关于二次开发之自动生成控件定位符,心里感概真是相当棒的思路,但是可能由于是公司的项目所以就点到为止并没有深入去解释其他一些功能。
这两天抽空研究了下吧,将部分的功能也一一的进行了研究完善。
uiautomatorviewer的原理我就不在这里说明里,首先说一下右键单击弹出菜单。我们要动手脚的地方是


UiAutomatorView 是用来显示出截图后的界面的,

<span class="n">mScreenshotCanvas</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">addMouseListener</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">MouseAdapter</span><span class="o" style="color: rgb(102, 102, 102);">()</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
            <span class="nd" style="color: rgb(170, 34, 255);">@SuppressWarnings</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"unused"</span><span class="o" style="color: rgb(102, 102, 102);">)</span>
            <span class="nd" style="color: rgb(170, 34, 255);">@Override</span>
            <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="n">mouseUp</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">MouseEvent</span> <span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
                <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">if</span> <span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">mModel</span> <span class="o" style="color: rgb(102, 102, 102);">!=</span> <span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">null</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
                    <span class="n">mModel</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">toggleExploreMode</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                    <span class="n">redrawScreenshot</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                <span class="o" style="color: rgb(102, 102, 102);">}</span>
            <span class="o" style="color: rgb(102, 102, 102);">}</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>

我们找到这个鼠标监听事件,可以看到readrawScreenshot()这函数的从字面上就能明白它的作用就是将你鼠标点击的区域绘制的红色,那么我就从这里入手了,修改代码如下:

<span class="n">mScreenshotCanvas</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">addMouseListener</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">MouseAdapter</span><span class="o" style="color: rgb(102, 102, 102);">()</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
            <span class="nd" style="color: rgb(170, 34, 255);">@SuppressWarnings</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"unused"</span><span class="o" style="color: rgb(102, 102, 102);">)</span>
            <span class="nd" style="color: rgb(170, 34, 255);">@Override</span>
            <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="n">mouseUp</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">MouseEvent</span> <span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
                <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">if</span> <span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">mModel</span> <span class="o" style="color: rgb(102, 102, 102);">!=</span> <span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">null</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
                    <span class="n">mModel</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">toggleExploreMode</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                    <span class="n">redrawScreenshot</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                <span class="o" style="color: rgb(102, 102, 102);">}</span>
                <span class="c1" style="color: rgb(176, 178, 176); font-style: italic;">//如果为鼠标右键点击那么就弹出右键菜单   </span>
                <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">if</span> <span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">button</span><span class="o" style="color: rgb(102, 102, 102);">==</span><span class="mi" style="color: rgb(102, 102, 102);">3</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
                    <span class="n">Menu</span> <span class="n">menu</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">Menu</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">mScreenshotCanvas</span><span class="o" style="color: rgb(102, 102, 102);">);</span>  
                    <span class="n">mScreenshotCanvas</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">setMenu</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">menu</span><span class="o" style="color: rgb(102, 102, 102);">);</span>  
                    <span class="n">MenuItem</span> <span class="n">item</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">MenuItem</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">menu</span><span class="o" style="color: rgb(102, 102, 102);">,</span> <span class="n">SWT</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">PUSH</span><span class="o" style="color: rgb(102, 102, 102);">);</span>  
                    <span class="n">item</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">setText</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"控件点击"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>  
                    <span class="n">item</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">addSelectionListener</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">SelectionAdapter</span><span class="o" style="color: rgb(102, 102, 102);">()</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
                        <span class="nd" style="color: rgb(170, 34, 255);">@Override</span>
                        <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="n">widgetSelected</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">SelectionEvent</span> <span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
                                        <span class="c1" style="color: rgb(176, 178, 176); font-style: italic;">//获取选择的矩形区域</span>
                            <span class="n">Rectangle</span> <span class="n">rect</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">mModel</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">getCurrentDrawingRect</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                            <span class="n">objectClick</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">rect</span><span class="o" style="color: rgb(102, 102, 102);">);</span>  
                        <span class="o" style="color: rgb(102, 102, 102);">};</span>
                    <span class="o" style="color: rgb(102, 102, 102);">});</span>
                <span class="o" style="color: rgb(102, 102, 102);">}</span>
            <span class="o" style="color: rgb(102, 102, 102);">}</span>
        <span class="o" style="color: rgb(102, 102, 102);">}</span>


以上的代码就是实现右键弹出菜单,按钮叫控件点击,接着实现该按钮的点击事件,获取到所选择控件的矩形区域,进行点击操作。
那下来我们来看看到底要如何实现点击的操作呢,实际也很点击,通过adb shell input 就可以了。

<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="nf" style="color: rgb(0, 160, 0);">objectClick</span><span class="p">(</span><span class="n">Rectangle</span> <span class="n">rectangle</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
    <span class="n">String</span> <span class="n">adbStr</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="s" style="color: rgb(187, 68, 68);">"adb shell input tap "</span><span class="o" style="color: rgb(102, 102, 102);">+(</span><span class="n">rectangle</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">x</span><span class="o" style="color: rgb(102, 102, 102);">+</span><span class="n">rectangle</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">width</span><span class="o" style="color: rgb(102, 102, 102);">/</span><span class="mi" style="color: rgb(102, 102, 102);">2</span><span class="o" style="color: rgb(102, 102, 102);">)+</span><span class="s" style="color: rgb(187, 68, 68);">" "</span> <span class="o" style="color: rgb(102, 102, 102);">+(</span><span class="n">rectangle</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">y</span><span class="o" style="color: rgb(102, 102, 102);">+</span><span class="n">rectangle</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">height</span><span class="o" style="color: rgb(102, 102, 102);">/</span><span class="mi" style="color: rgb(102, 102, 102);">2</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
    <span class="n">execCmd</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">adbStr</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>

置于execCmd做什么操作就不用多说了,直接java调用cmd运行就可以了。

再就是一个脚本录制的功能,实际上这东西也不麻烦。只要你模范com.android.uiautomator.actions中的类写一个

<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">package</span> <span class="n">com</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">android</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">uiautomator</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">actions</span><span class="o" style="color: rgb(102, 102, 102);">;</span>

<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">java.io.BufferedReader</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">java.io.File</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">java.io.FileOutputStream</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">java.io.IOException</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">java.io.InputStream</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">java.io.InputStreamReader</span><span class="o" style="color: rgb(102, 102, 102);">;</span>

<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">org.eclipse.jface.action.Action</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">org.eclipse.jface.resource.ImageDescriptor</span><span class="o" style="color: rgb(102, 102, 102);">;</span>

<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">com.android.uiautomator.UiAutomatorViewer</span><span class="o" style="color: rgb(102, 102, 102);">;</span>

<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">class</span> <span class="nc" style="color: blue;">RecordAction</span> <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">extends</span> <span class="n">Action</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>


    <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">private</span> <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">static</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">boolean</span> <span class="n">isRun</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">false</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
    <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="n">RecordAction</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">UiAutomatorViewer</span> <span class="n">viewer</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
         <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">super</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"&录制/停止"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
    <span class="o" style="color: rgb(102, 102, 102);">}</span>

    <span class="nd" style="color: rgb(170, 34, 255);">@Override</span>
    <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="n">ImageDescriptor</span> <span class="n">getImageDescriptor</span><span class="o" style="color: rgb(102, 102, 102);">()</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>

        <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">if</span> <span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">isRun</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
            <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">return</span> <span class="n">ImageHelper</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">loadImageDescriptorFromResource</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"images/stop.png"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>

        <span class="o" style="color: rgb(102, 102, 102);">}</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">else</span><span class="o" style="color: rgb(102, 102, 102);">{</span>
            <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">return</span> <span class="n">ImageHelper</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">loadImageDescriptorFromResource</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"images/play.png"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
        <span class="o" style="color: rgb(102, 102, 102);">}</span>
    <span class="o" style="color: rgb(102, 102, 102);">}</span>

    <span class="nd" style="color: rgb(170, 34, 255);">@Override</span>
    <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="n">run</span><span class="o" style="color: rgb(102, 102, 102);">()</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>


        <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">if</span> <span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">isRun</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
            <span class="n">StringBuffer</span> <span class="n">sb</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">StringBuffer</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
            <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"if __name__ == \"__main__\":\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
            <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"    unittest.main()\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
            <span class="n">writeFile</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
            <span class="n">isRun</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">false</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
            <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">this</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">setImageDescriptor</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">ImageHelper</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">loadImageDescriptorFromResource</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"images/play.png"</span><span class="o" style="color: rgb(102, 102, 102);">));</span>
        <span class="o" style="color: rgb(102, 102, 102);">}</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">else</span><span class="o" style="color: rgb(102, 102, 102);">{</span>
            <span class="n">isRun</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">true</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
            <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">this</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">setImageDescriptor</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">ImageHelper</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">loadImageDescriptorFromResource</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"images/stop.png"</span><span class="o" style="color: rgb(102, 102, 102);">));</span>
            <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">try</span><span class="o" style="color: rgb(102, 102, 102);">{</span>
                <span class="c1" style="color: rgb(176, 178, 176); font-style: italic;">//生成部分初始化话的代码</span>
                <span class="n">File</span> <span class="n">file</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">File</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"C:\\a.py"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">try</span><span class="o" style="color: rgb(102, 102, 102);">{</span>
                    <span class="n">file</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">delete</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                <span class="o" style="color: rgb(102, 102, 102);">}</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">catch</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">Exception</span> <span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
                    <span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">printStackTrace</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                <span class="o" style="color: rgb(102, 102, 102);">}</span>
                <span class="n">file</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">createNewFile</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                <span class="n">FileOutputStream</span> <span class="n">out</span><span class="o" style="color: rgb(102, 102, 102);">=</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">FileOutputStream</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">file</span><span class="o" style="color: rgb(102, 102, 102);">,</span><span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">true</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">StringBuffer</span> <span class="n">sb</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">StringBuffer</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                <span class="n">String</span> <span class="n">deviceName</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">getDeviceList</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"# -*- coding: utf-8 -*-\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"from appium import webdriver\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"from appium.webdriver.common import touch_action\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"import unittest\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"class testDemo(unittest.TestCase):\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"    def setUp(self):\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"        desired_caps = {}\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"        desired_caps['deviceName'] = '"</span><span class="o" style="color: rgb(102, 102, 102);">+</span><span class="n">deviceName</span><span class="o" style="color: rgb(102, 102, 102);">+</span><span class="s" style="color: rgb(187, 68, 68);">"'\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"        desired_caps['udid'] = '"</span><span class="o" style="color: rgb(102, 102, 102);">+</span><span class="n">deviceName</span><span class="o" style="color: rgb(102, 102, 102);">+</span><span class="s" style="color: rgb(187, 68, 68);">"'\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"        desired_caps['appPackage'] = 'com.seewo.teachercare'\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"        desired_caps['platformName'] = 'Android'\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"        desired_caps['platformVersion'] = '4.4.2'\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"        desired_caps['appActivity'] = '.ui.TeacherMainActivity'\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"    def tearDown(self):\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"        self.driver.quit()\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">append</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"    def testa(self):\n"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">out</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">write</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">toString</span><span class="o" style="color: rgb(102, 102, 102);">().</span><span class="na" style="color: rgb(187, 68, 68);">getBytes</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"utf-8"</span><span class="o" style="color: rgb(102, 102, 102);">));</span>
                <span class="n">out</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">close</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
            <span class="o" style="color: rgb(102, 102, 102);">}</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">catch</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">IOException</span> <span class="n">ex</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
                <span class="n">System</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">out</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">println</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">ex</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">getStackTrace</span><span class="o" style="color: rgb(102, 102, 102);">());</span>
            <span class="o" style="color: rgb(102, 102, 102);">}</span>

        <span class="o" style="color: rgb(102, 102, 102);">}</span>
    <span class="o" style="color: rgb(102, 102, 102);">}</span>


    <span class="cm" style="color: rgb(176, 178, 176); font-style: italic;">/**
     * 获取设备列表
     * @throws IOException 
     */</span>
    <span class="nd" style="color: rgb(170, 34, 255);">@SuppressWarnings</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"resource"</span><span class="o" style="color: rgb(102, 102, 102);">)</span>
    <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">private</span> <span class="n">String</span>  <span class="n">getDeviceList</span><span class="o" style="color: rgb(102, 102, 102);">()</span> <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">throws</span> <span class="n">IOException</span><span class="o" style="color: rgb(102, 102, 102);">{</span>
        <span class="n">Process</span> <span class="n">p</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">Runtime</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">getRuntime</span><span class="o" style="color: rgb(102, 102, 102);">().</span><span class="na" style="color: rgb(187, 68, 68);">exec</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"cmd.exe /c adb devices"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
        <span class="n">InputStream</span> <span class="n">inStream</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">p</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">getInputStream</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
        <span class="n">InputStreamReader</span> <span class="n">inReader</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">InputStreamReader</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">inStream</span><span class="o" style="color: rgb(102, 102, 102);">,</span><span class="s" style="color: rgb(187, 68, 68);">"UTF-8"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
        <span class="n">BufferedReader</span> <span class="n">inBuffer</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">BufferedReader</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">inReader</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
        <span class="n">String</span> <span class="n">s</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">null</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
        <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">while</span><span class="o" style="color: rgb(102, 102, 102);">((</span><span class="n">s</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">inBuffer</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">readLine</span><span class="o" style="color: rgb(102, 102, 102);">())</span> <span class="o" style="color: rgb(102, 102, 102);">!=</span> <span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">null</span><span class="o" style="color: rgb(102, 102, 102);">){</span>

            <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">if</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">s</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">endsWith</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"device"</span><span class="o" style="color: rgb(102, 102, 102);">)){</span>
                <span class="n">s</span> <span class="o" style="color: rgb(102, 102, 102);">=</span><span class="n">s</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">substring</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="mi" style="color: rgb(102, 102, 102);">0</span><span class="o" style="color: rgb(102, 102, 102);">,</span> <span class="n">s</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">lastIndexOf</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"device"</span><span class="o" style="color: rgb(102, 102, 102);">)).</span><span class="na" style="color: rgb(187, 68, 68);">trim</span><span class="o" style="color: rgb(102, 102, 102);">();</span> 
                <span class="n">System</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">out</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">println</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">s</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">return</span> <span class="n">s</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
            <span class="o" style="color: rgb(102, 102, 102);">}</span>

        <span class="o" style="color: rgb(102, 102, 102);">}</span>

        <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">return</span> <span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">null</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
    <span class="o" style="color: rgb(102, 102, 102);">}</span>
    <span class="cm" style="color: rgb(176, 178, 176); font-style: italic;">/**
     * 写文件操作
     * @param sb
     */</span>
    <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">static</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="n">writeFile</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">StringBuffer</span> <span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">){</span>

        <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">if</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">isRun</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
            <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">try</span><span class="o" style="color: rgb(102, 102, 102);">{</span>
                <span class="c1" style="color: rgb(176, 178, 176); font-style: italic;">//生成部分初始化话的代码</span>
                <span class="n">File</span> <span class="n">file</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">File</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"C:\\a.py"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">if</span><span class="o" style="color: rgb(102, 102, 102);">(!</span><span class="n">file</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">exists</span><span class="o" style="color: rgb(102, 102, 102);">()){</span>
                    <span class="n">file</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">createNewFile</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
                <span class="o" style="color: rgb(102, 102, 102);">}</span>
                <span class="n">FileOutputStream</span> <span class="n">out</span><span class="o" style="color: rgb(102, 102, 102);">=</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">FileOutputStream</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">file</span><span class="o" style="color: rgb(102, 102, 102);">,</span><span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">true</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
                <span class="n">out</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">write</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">sb</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">toString</span><span class="o" style="color: rgb(102, 102, 102);">().</span><span class="na" style="color: rgb(187, 68, 68);">getBytes</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"utf-8"</span><span class="o" style="color: rgb(102, 102, 102);">));</span>
                <span class="n">out</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">close</span><span class="o" style="color: rgb(102, 102, 102);">();</span>

            <span class="o" style="color: rgb(102, 102, 102);">}</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">catch</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">IOException</span> <span class="n">ex</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
                <span class="n">System</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">out</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">println</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">ex</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">getStackTrace</span><span class="o" style="color: rgb(102, 102, 102);">());</span>
            <span class="o" style="color: rgb(102, 102, 102);">}</span>
        <span class="o" style="color: rgb(102, 102, 102);">}</span>   
    <span class="o" style="color: rgb(102, 102, 102);">}</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>


上面有些代码我都写死了。因为这也是仓促完成,另外本人真是新手,所有代码写的烂求轻点拍。
上面主要的功能就是点击录制按钮时,初始化就写入内容,点击结束时,将main方法补上。其他写文件就是在右键时进行控件点击等时同时进行写文件操作就可以了。
最后在Uiautomatorviewer类中实例化该类

<span class="c1" style="color: rgb(176, 178, 176); font-style: italic;">//加上按钮</span>
<span class="n">toolBarManager</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">add</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">RecordAction</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">this</span><span class="o" style="color: rgb(102, 102, 102);">));</span>

第一次发帖,写的可能很乱,代码也写的很渣,不知道各位能不能看的懂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值