截图原理(二)——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 ...
随机推荐
- delphi RTTI 三 属性读取与赋值
delphi RTTI 读取属性 运行期 通过RTTI给属性赋值 http://docwiki.embarcadero.com/CodeExamples/Berlin/en/Event_RTTI_In ...
- 深度学习原理与框架-神经网络架构 1.神经网络构架 2.激活函数(sigmoid和relu) 3.图片预处理(减去均值和除标准差) 4.dropout(防止过拟合操作)
神经网络构架:主要时表示神经网络的组成,即中间隐藏层的结构 对图片进行说明:我们可以看出图中的层数分布: input layer表示输入层,维度(N_num, input_dim) N_num表示输 ...
- Others-常用数学符号大全
常用数学符号读法大全 大写 小写 英文注音 国际音标注音 中文注音 Α α alpha alfa 阿耳法 Β β beta beta 贝塔 Γ γ gamma gamma 伽马 Δ δ deta de ...
- Dockerfile构建MySQL
转自:https://www.cnblogs.com/jsonhc/p/7807931.html 利用Dockerfile自定义构建MySQL服务折腾了几天,一直在启动服务上出现错误,现在终于解决了该 ...
- 访问Nginx报错
今天新装Nginx,一切妥善后,访问虚拟机服务器的IP,结果发现响应超时 这是因为防火墙的80端口没有打开,在新装的Linux上搭服务器一般会遇到这个问题,重新开放80端口即可解决: (1)firew ...
- foreman自动化工具安装使用
简单的安装指导在官网上 官网地址为:https://theforeman.org/ 点击get started 找到 Installation 选择直接的发行版按照步骤一个一个来 需要注意的是,主机名 ...
- avalon2学习教程01
经过难苦奋战,avalon2终于面世了.这花了大半年时间,其中1.6还胎死腹中.长达半年没有产出,我都担心自己会被裁掉…… avalon2许多API与1.4.×保持一致,当然也添加了一些1.5的功能, ...
- 关于T-SQL中exists或者not exists子查询的“伪优化”的做法
问题起源 在使用t-sql中的exists(或者not exists)子查询的时候,不知道什么时候开始,发现一小部分人存在一种“伪优化”的一些做法,并且向不明真相的群众传递这一种写法“优越性”,实在看 ...
- 【原】Ubuntu virtual terminal
CTRL+ALT+F1 ~ F6 six virtual terminal ALT-F7 return to graphic desktop
- Hibernate学习笔记2.1(Hibernate基础配置)
Hibernate基础配置 1.<property name="hbm2ddl.auto">update</property> 在SessionFactor ...
