截图原理(二)——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 ...
随机推荐
- ssh-keygen生成git ssh密钥
title: ssh-keygen生成git ssh密钥 date: 2018-05-07 08:49:21 tags: [git,ssh-keygen] --- ssh-keygen生成git ss ...
- MFC中在picture control中显示CBitmap图像的方法
CStatic *pStatic1 = (CStatic *)GetDlgItem(IDC__IMAGE_STATIC2); CBitmap cbmp; cbmp.LoadBitmap(MAKEINT ...
- APP-2-Hbuilder开发环境搭建
1.Hbuilder下载 http://www.dcloud.io/hbuilderx.html 2.夜神模拟器下载 https://www.yeshen.com/ 3.chrome浏览器下载 htt ...
- Dictionary转为Model实例
Dictionary<string, object> dic = new Dictionary<string, object>(); dic.Add(); dic.Add(&q ...
- 转:用JS获取地址栏参数的方法(超级简单)
转载链接: http://www.cnblogs.com/fishtreeyu/archive/2011/02/27/1966178.html 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实 ...
- 一张图知道HTML5布局(图)
- Android 设备,如何root,执行adb shell,查看设备中的数据库信息等【转】
原文地址: Android 设备,如何root,执行adb shell,查看设备中的数据库信息等
- VPS 相关
1.一键测试 wget http://soft.laozuo.org/tools/cpu-io.shsh cpu-io.sh 2.锐速破解 wget -N --no-check-certificate ...
- 创建DLL动态链接库——声明导出法
DLL声明导出法:是通过使用__declspec(dllexport),添加到需要导出的函数前,进行声明. 头文件定义如下(OPdll.h): 源文件定义如下(OPdll.cpp): 通过以上两个文件 ...
- Windows Server 2008 R2微软官方下载
注意:Windows Server 2008 R2仅有64位版本. 以下下载地址为Windows Server 2008 R2 RTM Build 7600.16385的评估版本,此版本可免费试用18 ...