截图原理(二)——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.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自动化测试学习历程的更多相关文章
- Robotium原理初步--Android自动化测试学习历程
章节:自动化基础篇——Robotium原理初步(第四讲) 主要讲解内容与笔记: 一.基于控件 1.spinner——下拉菜单 2.TabHost——左右滑动选择菜单,类似电话本 3.Gallery—— ...
- Appium原理初步--Android自动化测试学习历程
章节:自动化基础篇——Appium原理初步(第七讲) 本期关键词: Appium.跨语言跨平台.Bootstrap 主要讲解内容及笔记: 一.what is appium 一种封装了uiautomat ...
- Selenium原理初步--Android自动化测试学习历程
章节:自动化基础篇——Selenium原理初步(第五讲) 注:其实所有的东西都是应该先去用,但是工具基本都一样,底层都是用的最基础的内容实现的,测试应该做的是: (1)熟练使用工具,了解各个工具的利弊 ...
- MonkeyRunner原理初步--Android自动化测试学习历程
章节:自动化基础篇——MonkeyRunner原理初步 主要讲解内容及笔记: 一.理论知识和脚本演示 最佳方式是上官网文档去查看monkeyrunner的介绍,官网上不去,就找了一个本地的androi ...
- AndroidDriver原理初步--Android自动化测试学习历程
章节:自动化基础篇——AndroidDriver原理初步(第六讲) 主要讲解内容及笔记: 一.AndroidDriver核心原理 对上图的解析: PC端的端口通过adb,将android版的Remot ...
- 截图原理(一)——Android自动化测试学习历程
把两节的内容汇总起来,第一节讲的是如何在apk中直接进行截屏,用到了Robotium的Solo类的takeScreenShot方法,有一个小的demo,以及从方法一直往里钻,知道它具体是怎么进行截屏的 ...
- 百度Cafe原理--Android自动化测试学习历程
主要讲解内容及笔记: 一.Cafe原理 Cafe是一款自动化测试框架,解决问题:跨进程测试.快速深度测试 官网:http://baiduqa.github.io/Cafe/ Cafe provides ...
- Monkey原理初步和改良优化--Android自动化测试学习历程
章节:自动化基础篇——Monkey原理初步和改良优化(第三讲) 主要讲解内容与笔记: 一.理论知识: 直接看文档,来了解monkey的概念.基本原理,以及如何使用. First,what is And ...
- 自动化预备知识上&&下--Android自动化测试学习历程
章节:自动化基础篇——自动化预备知识上&&下 主要讲解内容及笔记: 一.需要具备的能力: 测试一年,编程一年,熟悉并掌握业界自动化测试工具(monkey--压力测试.monkeyrun ...
随机推荐
- smarty获取php中的变量
{$smarty}保留变量不需要从PHP脚本中分配,是可以在模板中直接访问的数组类型变量,通常被用于访问一些特殊的模板变量.例如,直接在模板中访问页面请求变量.获取访问模板时的时间邮戳.直接访问PHP ...
- WDA-Web Dynpro的POWL(个人对象工作清单)
POWL(Personal Object Worklist) for Web Dynpro 转载地址:https://blogs.sap.com/2013/02/15/powlpersonal-obj ...
- 大批量数据导出到Excel的实现
在平时的项目中,将数据导出到Excel的需求是很常见的,在此对一些常见的方法做以总结,并提供一种大数据量导出的实现. OLEDB 使用OLEDB可以很方便导出Excel,思路很简单,处理时将Exc ...
- 用Hadoop AVRO进行大量小文件的处理(转)
使用 使用使用 使用 HDFS 保存大量小文件的缺点:1.Hadoop NameNode 在内存中保存所有文件的“元信息”数据.据统计,每一个文件需要消耗 NameNode600 字节内存.如果需要保 ...
- (笨方法)利用stat函数实现ls -l filename
学习了一段时间的Linux了,但是我感觉我做不出来啥子,后头选择利用系统IO函数实现命令,先从ls走起吧.先来看看ls -l filename给我们显示了什么吧 : 可以看到,一共八项:文件类型.用户 ...
- [PHP]PHP缓存机制之Output Control
---------------------------------------------------------------------------------------------------- ...
- springboot配置异常 web页面跳转
第一步 controller中 package cn.itcast.springboot.controller; import org.springframework.stereotype.Contr ...
- 关于ubuntu14.04,忘记root密码解决方案(经测试,内核3.13和4.2可行)。
网上已经有很多方案啦,我这里就不画蛇添足,直接上链接: http://jingyan.baidu.com/article/c843ea0b9e851077931e4aea.html 注意,有些机子没有 ...
- 安装PostGIS 2.1.1 时遇到checking for library containing GDALAllRegister... no
在postgis中执行./configure时,遇到 checking for library containing GDALAllRegister... no 的错误信息 [root@test po ...
- KMP与AC自动机模板
HDU 1711 Number Sequence(KMP模板题) http://acm.hdu.edu.cn/showproblem.php?pid=1711 #include<bits/std ...
