zoukankan      html  css  js  c++  java
  • 截图原理(二)——android自动化测试学习历程

    接上一篇(截图原理)

    视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877121&courseId=712011

    四、非APK的操作,通过PC端实现截屏操作,及原理

    通过adb桥接的方式,调用ddmlib.jar中的IDevice和AndroidDebugBridge类对通过adb连接的设备进行截图,截图之后保存在PC端,可在短时间内截取多张图

    五、adb桥接方式实现截屏的代码分析

    import java.awt.*;
    import java.awt.event.*;
    import java.io.File;
    
    import com.android.ddmlib.AndroidDebugBridge;
    
    
    public class PerformAnalysis extends Frame implements ActionListener {
    
        private String title = "性能测试工具";
        private Button takepicture;
        private Button getCPUmem;
        private Label tip;
        private static TextField picturenum;
        
        public  PerformAnalysis() {
            setTitle(title);
            takepicture = new Button("获取屏幕截图");
            takepicture.setSize(150, 100);
            getCPUmem = new Button("获取内存和CPU");
            getCPUmem.setSize(350, 300);
            picturenum = new TextField("1");
            picturenum.setSize(100, 20);
            tip = new Label("输入截图个数,一秒截一次");
            
            FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT,50,60);  
            setLayout(flowLayout);  
            add(takepicture);  
            add(getCPUmem);
            add(tip);
            add(picturenum);
            
            takepicture.addActionListener(this);
            
            addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent we){
                    System.exit(0);
                }
            });
            
            File file = new File("D://lixia//getpicture");if(!file.isDirectory()){//这里的多级目录跟Python中一样,必须得是mkdirs才行,否则根本就建不成功
                file.mkdirs();
            }
            AndroidDebugBridge.init(false);
            
            setBounds(50, 350, 350, 350);
            setVisible(true);
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            if(e.getSource() == takepicture){
                ScreenShot screenShot = new ScreenShot();
                screenShot.main();
            }
        }
        
        public void setNumber(){
            picturenum.setText("123");
        }
        
        public static String getNumber(){
            return picturenum.getText().toString();
        }
        
        public static void main(String[] args){
            PerformAnalysis p = new PerformAnalysis();
            
        }
        
    }
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.imageio.ImageIO;
    
    import com.android.ddmlib.AdbCommandRejectedException;
    import com.android.ddmlib.AndroidDebugBridge;
    import com.android.ddmlib.IDevice;
    import com.android.ddmlib.RawImage;
    import com.android.ddmlib.TimeoutException;
    
    /**
     * @author lixia-xy
     * @function 截屏类,需要用到device类,直接去进行截图操作。。。
     */
    public class ScreenShot {
    
        private static int number = 1;
        public ScreenShot(){
            //啥也不干了
        }
        
        public void main(){
            
            ScreenShot screenShot = new ScreenShot();
            number = Integer.parseInt(PerformAnalysis.getNumber());
            System.out.println("截图个数" + number);
            
            IDevice device = screenShot.getDevice();
            for(int i = 0; i < number; i++){
                Date date = new Date();
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
                String nowTime = df.format(date);
                
                if(device != null)
                {
                    boolean landscape = false;
                    screenShot.getScreenShot(device, "D://lixia//getpicture", nowTime, false);
                }
            }
            
        }
    
        private void getScreenShot(IDevice device, String filePath, String fileName, boolean landscape) {
            // TODO Auto-generated method stub
            //调用系统的devie.getScreenShot()方法来获取到截图,并且按照我想要的路径将其存起来
            RawImage rawScreen = null;
            try{
                try {
                    rawScreen = device.getScreenshot();
                } catch (TimeoutException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (AdbCommandRejectedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }catch(IOException e){
                return ;
            }
            
            if(rawScreen == null){
                return ;
            }
            
            int width = landscape? rawScreen.height:rawScreen.width;
            int height = landscape? rawScreen.rawScreen.height;
            //初始化一个缓冲图
            BufferedImage bufferImage = new BufferedImage(width, height, 
                    BufferedImage.TYPE_INT_RGB);
            
            int index = 0;
            int IndexInc = rawScreen.bpp >> 3;
            for (int y = 0 ; y < rawScreen.height ; y++) {
                for (int x = 0 ; x < rawScreen.width ; x++) {
                    int value = rawScreen.getARGB(index);
                    index += IndexInc;
                    bufferImage.setRGB(x, y, value);
                }
            }
    
            try {
                if (!ImageIO.write(bufferImage, "png", new File(filePath+"//"+fileName+".png"))) {
                    throw new IOException("Failed to find png writer");
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        private IDevice getDevice() {
            // TODO Auto-generated method stub
            IDevice device = null;
            AndroidDebugBridge bridge = AndroidDebugBridge.createBridge("adb", false);
            waitDevicesList(bridge);
            System.out.println("等待设备连接...");
            IDevice devices[] = bridge.getDevices();
            if(devices.length > 0)
            {
                device = devices[0];
                System.out.println("设备名称:" + device.getName());
            }
            return device;
        }
    
        private void waitDevicesList(AndroidDebugBridge bridge) {
            // TODO Auto-generated method stub
            int count = 0;
            while (bridge.hasInitialDeviceList() == false) {
                try {
                    Thread.sleep(100);
                    count++;
                } catch (InterruptedException e) {
                    // pass
                }
    
                // let's not wait > 10 sec.
                if (count > 100) {
                    System.err.println("Timeout getting device list!");
                    return;
                }
            }
        }
    }

    金阳光测试

    新浪微博:金阳光woody

             

              网站地址

    1、百度搜:金阳光测试

    2、官网:www.goldensunshine.cc

    微信公众号

  • 相关阅读:
    自动补全的java封装
    angular创建服务
    forEach和for包含异步调用的区别
    angular获取dom节点
    angular父组件给子组件传值
    angular环境
    SQL Server DBA 30问 【itpub】 天高地厚
    【转】任务管理器各参数说明 天高地厚
    开机引导 天高地厚
    测试发现数据库性能问题后的SQL调优 天高地厚
  • 原文地址:https://www.cnblogs.com/keke-xiaoxiami/p/4338354.html
Copyright © 2011-2022 走看看