【自动化__GUI自动化】__java__Windows应用程序识别__计算器

 

 

一、代码如下

package www.woniu.gui.one;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;

public class CalcJava {
	static int BM_CLICK= 0x00F5;
	static int WM_CLOSE= 0x0010;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CalcJava cj= new CalcJava();
		cj.calTest();
		

	}
	
	private void calTest() {
		// TODO Auto-generated method stub
		CalcJava cj= new CalcJava();
		try {
			
			//Process process= runtime.exec("dir d:");
			//Process process= runtime.exec("ping www.woniuxy.com");
			//Process process= runtime.exec("ipconfig");
			//InputStream is= process.getInputStream();
			//InputStreamReader isr= new InputStreamReader(is, "GBK");
			//BufferedReader br= new BufferedReader(isr);
			//String line= "", body="";
			//while((line=br.readLine()) != null) {
				//body +=line;
			//	body +=line + "\n";
			//}
			//System.out.println(body);
			//被测应用程序的启动
			Runtime runtime= Runtime.getRuntime();
			Process process= runtime.exec("tasklist");//检查被测应用程序是否启动
			InputStreamReader isr= new InputStreamReader(process.getInputStream());
			BufferedReader br= new BufferedReader(isr);
			String line= "";
			boolean isOpen= false;
			while((line=br.readLine()) != null) {
				if(line.indexOf("calc.exe") >= 0) {
					isOpen= true;
					break;
				}
			}
			if(!isOpen) {
				runtime.exec("D:\\calcen.exe");//强子指定的计算器
				Thread.sleep(2000);
			}
			
			
			//int parentHandle= 
			Thread.sleep(2000);
			int window= this.findWindow("sciCalc", "Calculator");
			System.out.println("应用程序编号为:"+window);
			System.out.println("=========");
			
			int control= 0;
			control= this.findWindowEx(window, "Button", "3");
			this.sendMessage(control, BM_CLICK);			
			System.out.println(control);
			Thread.sleep(1000);
			
			control= this.findWindowEx(window, "Button", "+");
			this.sendMessage(control, BM_CLICK);
			Thread.sleep(1000);
			control= this.findWindowEx(window, "Button", "2");
			this.sendMessage(control, BM_CLICK);
			Thread.sleep(1000);
			control= this.findWindowEx(window, "Button", "=");
			this.sendMessage(control, BM_CLICK);
			Thread.sleep(1000);
			
			//将结果进行复制 Ctrl+C
			Robot robot= new Robot();
			robot.keyPress(KeyEvent.VK_CONTROL);
			robot.keyPress(KeyEvent.VK_C);
			robot.keyRelease(KeyEvent.VK_CONTROL);
			robot.keyRelease(KeyEvent.VK_C);
			Thread.sleep(2000);
			
			//从剪贴板取出复制的值,同预期结果进行比较,断言
			String content= "";
			Clipboard clip= Toolkit.getDefaultToolkit().getSystemClipboard();
			Transferable clipT= clip.getContents(null);
			if(clipT != null) {
				if(clipT.isDataFlavorSupported(DataFlavor.stringFlavor)) {
					content= (String) clipT.getTransferData(DataFlavor.stringFlavor);
				}
			}
			System.out.println(content);
			if(content.equals("5")) {
				System.out.println("测试成功");
			} else {
				System.out.println("测试失败");
			}
			
			this.sendMessage(window, WM_CLOSE);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block  
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block  InterruptedException
			e.printStackTrace();
		} catch (AWTException e) {
			// TODO Auto-generated catch block  InterruptedException AWTException 
			e.printStackTrace();
		} catch (UnsupportedFlavorException e) {
			// TODO Auto-generated catch block  InterruptedException AWTException UnsupportedFlavorException
			e.printStackTrace();
		}
		

	}
	
	
	private int findWindowEx(int parentHandle, String controlClass, String windowCaption) {
		// TODO Auto-generated method stub
		int result= 0;
		try {
			JNative jnative= new JNative("user32.dll", "FindWindowExA");
			jnative.setRetVal(Type.INT);
			jnative.setParameter(0, Type.INT, String.valueOf(parentHandle));
			jnative.setParameter(1, Type.INT, "0");
			jnative.setParameter(2, Type.STRING, controlClass);
			jnative.setParameter(3, Type.STRING, windowCaption);
			jnative.invoke();
			result= Integer.parseInt(jnative.getRetVal());
			
		} catch (NativeException e) {
			// TODO Auto-generated catch block  IllegalAccessException
			e.printStackTrace();
		}catch (IllegalAccessException e) {
			// TODO Auto-generated catch block  IllegalAccessException
			e.printStackTrace();
		}
		
		return result;
	}
	
	private int findWindow(String windowClass, String windowCaption ) {
		// TODO Auto-generated method stub
		int result= 0;
		try {
			JNative jnative= new JNative("user32.dll", "FindWindowA");
			jnative.setRetVal(Type.INT);
			jnative.setParameter(0, Type.STRING, windowClass);
			jnative.setParameter(1, Type.STRING, windowCaption);
			jnative.invoke();
			result= Integer.parseInt(jnative.getRetVal());
			
		} catch (NativeException e) {
			// TODO Auto-generated catch block  IllegalAccessException
			e.printStackTrace();
		}catch (IllegalAccessException e) {
			// TODO Auto-generated catch block  IllegalAccessException
			e.printStackTrace();
		}
		
		return result;
		

	}

	
	private void sendMessage(int parentHandle, int message) {
		// TODO Auto-generated method stub
		try {
			JNative jnative= new JNative("user32.dll", "SendMessageA");
			jnative.setRetVal(Type.VOID);
			jnative.setParameter(0, Type.INT, String.valueOf(parentHandle));
			jnative.setParameter(1, Type.INT, String.valueOf(message));
			jnative.setParameter(2, Type.STRING, "0");
			jnative.setParameter(3, Type.STRING, "0");
			jnative.invoke();
			Thread.sleep(2000);
			
		} catch (NativeException e) {
			// TODO Auto-generated catch block  IllegalAccessException InterruptedException
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block  IllegalAccessException
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block  IllegalAccessException
			e.printStackTrace();
		}
		
	}
	
	
	
	
}

 

posted @ 2017-09-02 22:10  18513757531  阅读(757)  评论(0编辑  收藏  举报