接上一篇(截图原理)

视频地址: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.width: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

微信公众号

截图原理(二)——android自动化测试学习历程的更多相关文章

  1. Robotium原理初步--Android自动化测试学习历程

    章节:自动化基础篇——Robotium原理初步(第四讲) 主要讲解内容与笔记: 一.基于控件 1.spinner——下拉菜单 2.TabHost——左右滑动选择菜单,类似电话本 3.Gallery—— ...

  2. Appium原理初步--Android自动化测试学习历程

    章节:自动化基础篇——Appium原理初步(第七讲) 本期关键词: Appium.跨语言跨平台.Bootstrap 主要讲解内容及笔记: 一.what is appium 一种封装了uiautomat ...

  3. Selenium原理初步--Android自动化测试学习历程

    章节:自动化基础篇——Selenium原理初步(第五讲) 注:其实所有的东西都是应该先去用,但是工具基本都一样,底层都是用的最基础的内容实现的,测试应该做的是: (1)熟练使用工具,了解各个工具的利弊 ...

  4. MonkeyRunner原理初步--Android自动化测试学习历程

    章节:自动化基础篇——MonkeyRunner原理初步 主要讲解内容及笔记: 一.理论知识和脚本演示 最佳方式是上官网文档去查看monkeyrunner的介绍,官网上不去,就找了一个本地的androi ...

  5. AndroidDriver原理初步--Android自动化测试学习历程

    章节:自动化基础篇——AndroidDriver原理初步(第六讲) 主要讲解内容及笔记: 一.AndroidDriver核心原理 对上图的解析: PC端的端口通过adb,将android版的Remot ...

  6. 截图原理(一)——Android自动化测试学习历程

    把两节的内容汇总起来,第一节讲的是如何在apk中直接进行截屏,用到了Robotium的Solo类的takeScreenShot方法,有一个小的demo,以及从方法一直往里钻,知道它具体是怎么进行截屏的 ...

  7. 百度Cafe原理--Android自动化测试学习历程

    主要讲解内容及笔记: 一.Cafe原理 Cafe是一款自动化测试框架,解决问题:跨进程测试.快速深度测试 官网:http://baiduqa.github.io/Cafe/ Cafe provides ...

  8. Monkey原理初步和改良优化--Android自动化测试学习历程

    章节:自动化基础篇——Monkey原理初步和改良优化(第三讲) 主要讲解内容与笔记: 一.理论知识: 直接看文档,来了解monkey的概念.基本原理,以及如何使用. First,what is And ...

  9. 自动化预备知识上&&下--Android自动化测试学习历程

    章节:自动化基础篇——自动化预备知识上&&下 主要讲解内容及笔记: 一.需要具备的能力: 测试一年,编程一年,熟悉并掌握业界自动化测试工具(monkey--压力测试.monkeyrun ...

随机推荐

  1. day11-mysql中的mysql数据库不见了

    mysql中的mysql数据库不见了 昨天刚刚在vmware虚拟机的linux上安装mysql,今天登上就发现一个问题.通过网上漫长的寻找,终于解决了.所以我在这把我解决的步骤跟大家分享一下. 问题就 ...

  2. Oracle函数使用

    数据格式化截取:  Trunc(data,[yyyy]) oracle的特有if判断: decode(sex, 0, '男', 1, '女') 分组排序:row_number() over(parti ...

  3. JavaScript的 onclick 事件是如何调用jquery 方法的

    看见个不错的问答,关于JavaScript的 onclick 事件是如何调用jquery 方法的,特此标注,链接如下:http://segmentfault.com/q/101000000033350 ...

  4. linux shell 杂

    1. 字符串截取 var=http://www.baidu.com/index.html echo ${var} var=http://www.baidu.com/index.html /*从左到右第 ...

  5. c# Type.InvokeMember用法

    函数原型: public object InvokeMember(string, BindingFlags, Binder, object, object[]);string:你所要调用的函数名Bin ...

  6. 5.Python文件操作之增删改查

    需求一:取文件的前几行: f = open("yesterday","r",encoding="utf-8") for i in range ...

  7. UNITY Profiler 真机调试

    1,WIFI方式, 2,ADB方式WIFI方式:数据通过WIFI在手机和电脑间传输,且手机和电脑必须在一个网段ADB方式如下:数据通过数据线在手机和电脑间传输.显然ADB方式速度快,无网段限制,比较好 ...

  8. Python操作远程服务器paramiko模块介绍

    paramiko模块是基于Python实现的SSH远程安全连接,可以提供在远程服务器上执行命令.上传文件到服务器或者从指定服务器下载文件的功能. paramiko模块安装方法 paramiko模块不是 ...

  9. linux配置虚拟域名

    linux环境下面配置虚拟主机域名 第一步:在root目录下面(即根目录)ls(查看文件)cd进入etc目录find hosts文件vi hosts 打开hosts文件并进行编辑在打开的文件最下面添加 ...

  10. win10自带IE上不了网的解决办法

    1.cmd以管理员身份运行powershell. 2.输入以下三条程序. netsh int tcp set heuristics disabled 回车执行后再输入 netsh int tcp se ...