51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1665|回复: 0
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-4-10 15:15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近看到cpfeng0124 的关于二次开发之自动生成控件定位符,心里感概真是相当棒的思路,但是可能由于是
公司的项目所以就点到为止并没有深入去解释其他一些功能。
这两天抽空研究了下吧,将部分的功能也一一的进行了研究完善。
uiautomatorviewer的原理我就不在这里说明里,首先说一下右键单击弹出菜单。我们要动手脚的地方是



  1. UiAutomatorView 是用来显示出截图后的界面的,
  2. mScreenshotCanvas.addMouseListener(new MouseAdapter() {
  3.             @SuppressWarnings("unused")
  4.             @Override
  5.             public void mouseUp(MouseEvent e) {
  6.                 if (mModel != null) {
  7.                     mModel.toggleExploreMode();
  8.                     redrawScreenshot();
  9.                 }
  10.             }
  11. }
复制代码

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

  1. mScreenshotCanvas.addMouseListener(new MouseAdapter() {
  2.             @SuppressWarnings("unused")
  3.             @Override
  4.             public void mouseUp(MouseEvent e) {
  5.                 if (mModel != null) {
  6.                     mModel.toggleExploreMode();
  7.                     redrawScreenshot();
  8.                 }
  9.                 //如果为鼠标右键点击那么就弹出右键菜单   
  10.                 if (e.button==3){
  11.                     Menu menu = new Menu(mScreenshotCanvas);  
  12.                     mScreenshotCanvas.setMenu(menu);  
  13.                     MenuItem item = new MenuItem(menu, SWT.PUSH);  
  14.                     item.setText("控件点击");  
  15.                     item.addSelectionListener(new SelectionAdapter() {
  16.                         @Override
  17.                         public void widgetSelected(SelectionEvent e) {
  18.                                         //获取选择的矩形区域
  19.                             Rectangle rect = mModel.getCurrentDrawingRect();
  20.                             objectClick(rect);  
  21.                         };
  22.                     });
  23.                 }
  24.             }
  25.         }
复制代码




以上的代码就是实现右键弹出菜单,按钮叫控件点击,接着实现该按钮的点击事件,获取到所选择控件的矩
形区域,进行点击操作。
那下来我们来看看到底要如何实现点击的操作呢,实际也很点击,通过adb shell input 就可以了。
public void objectClick(Rectangle rectangle){
    String adbStr = "adb shell input tap "+(rectangle.x+rectangle.width/2)+" " +(rectangle.y+rectangle.height/2);
    execCmd(adbStr);
}

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

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

  1. package com.android.uiautomator.actions;

  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;

  8. import org.eclipse.jface.action.Action;
  9. import org.eclipse.jface.resource.ImageDescriptor;

  10. import com.android.uiautomator.UiAutomatorViewer;

  11. public class RecordAction extends Action {


  12.     private static boolean isRun = false;
  13.     public RecordAction(UiAutomatorViewer viewer){
  14.          super("&录制/停止");
  15.     }

  16.     @Override
  17.     public ImageDescriptor getImageDescriptor() {

  18.         if (isRun){
  19.             return ImageHelper.loadImageDescriptorFromResource("images/stop.png");

  20.         }else{
  21.             return ImageHelper.loadImageDescriptorFromResource("images/play.png");
  22.         }
  23.     }

  24.     @Override
  25.     public void run() {


  26.         if (isRun){
  27.             StringBuffer sb = new StringBuffer();
  28.             sb.append("if __name__ == \"__main__\":\n");
  29.             sb.append("    unittest.main()\n");
  30.             writeFile(sb);
  31.             isRun = false;
  32.             this.setImageDescriptor(ImageHelper.loadImageDescriptorFromResource("images/play.png"));
  33.         }else{
  34.             isRun = true;
  35.             this.setImageDescriptor(ImageHelper.loadImageDescriptorFromResource("images/stop.png"));
  36.             try{
  37.                 //生成部分初始化话的代码
  38.                 File file = new File("C:\\a.py");
  39.                 try{
  40.                     file.delete();
  41.                 }catch(Exception e){
  42.                     e.printStackTrace();
  43.                 }
  44.                 file.createNewFile();
  45.                 FileOutputStream out=new FileOutputStream(file,true);
  46.                 StringBuffer sb = new StringBuffer();
  47.                 String deviceName = getDeviceList();
  48.                 sb.append("# -*- coding: utf-8 -*-\n");
  49.                 sb.append("from appium import webdriver\n");
  50.                 sb.append("from appium.webdriver.common import touch_action\n");
  51.                 sb.append("import unittest\n");
  52.                 sb.append("class testDemo(unittest.TestCase):\n");
  53.                 sb.append("    def setUp(self):\n");
  54.                 sb.append("        desired_caps = {}\n");
  55.                 sb.append("        desired_caps['deviceName'] = '"+deviceName+"'\n");
  56.                 sb.append("        desired_caps['udid'] = '"+deviceName+"'\n");
  57.                 sb.append("        desired_caps['appPackage'] = 'com.seewo.teachercare'\n");
  58.                 sb.append("        desired_caps['platformName'] = 'Android'\n");
  59.                 sb.append("        desired_caps['platformVersion'] = '4.4.2'\n");
  60.                 sb.append("        desired_caps['appActivity'] = '.ui.TeacherMainActivity'\n");
  61.                 sb.append("        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)\n");
  62.                 sb.append("    def tearDown(self):\n");
  63.                 sb.append("        self.driver.quit()\n");
  64.                 sb.append("    def testa(self):\n");
  65.                 out.write(sb.toString().getBytes("utf-8"));
  66.                 out.close();
  67.             }catch(IOException ex){
  68.                 System.out.println(ex.getStackTrace());
  69.             }

  70.         }
  71.     }


  72.     /**
  73.      * 获取设备列表
  74.      * @throws IOException
  75.      */
  76.     @SuppressWarnings("resource")
  77.     private String  getDeviceList() throws IOException{
  78.         Process p = Runtime.getRuntime().exec("cmd.exe /c adb devices");
  79.         InputStream inStream = p.getInputStream();
  80.         InputStreamReader inReader = new InputStreamReader(inStream,"UTF-8");
  81.         BufferedReader inBuffer = new BufferedReader(inReader);
  82.         String s = null;
  83.         while((s = inBuffer.readLine()) != null){

  84.             if(s.endsWith("device")){
  85.                 s =s.substring(0, s.lastIndexOf("device")).trim();
  86.                 System.out.println(s);
  87.                 return s;
  88.             }

  89.         }

  90.         return null;
  91.     }
  92.     /**
  93.      * 写文件操作
  94.      * @param sb
  95.      */
  96.     public static void writeFile(StringBuffer sb){

  97.         if(isRun){
  98.             try{
  99.                 //生成部分初始化话的代码
  100.                 File file = new File("C:\\a.py");
  101.                 if(!file.exists()){
  102.                     file.createNewFile();
  103.                 }
  104.                 FileOutputStream out=new FileOutputStream(file,true);
  105.                 out.write(sb.toString().getBytes("utf-8"));
  106.                 out.close();

  107.             }catch(IOException ex){
  108.                 System.out.println(ex.getStackTrace());
  109.             }
  110.         }   
  111.     }
  112. }
复制代码



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

//加上按钮
toolBarManager.add(new RecordAction(this));


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-17 22:44 , Processed in 0.061461 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表