截图原理(二)——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

微信公众号

原文地址:https://www.cnblogs.com/keke-xiaoxiami/p/4338354.html