189 8069 5689

移植MonkeyRunner的图片对比和获取子图功能的实现-Appium篇

如果你的目标测试app有很多imageview组成的话,这个时候monkeyrunner的截图比较功能就体现出来了。而其他几个流行的框架如Robotium,UIAutomator以及Appium都提供了截图,但少了两个功能:
  • 获取子图
  • 图片比较
既然Google开发的MonkeyRunner能盛行这么久,且它体功能的结果验证功能只有截屏比较,那么必然有它的道理,有它存在的价值,所以我们很有必要在需要的情况下把它相应的功能给移植到其他框架上面上来。
经过本人前面文章描述的几个框架的源码的研究(robotium还没有做),大家可以知道MonkeyRunner是跑在PC端的,只有在需要发送相应的命令事件时才会驱动目标机器的monkey或者shell等。比如获取图片是从目标机器的buffer设备得到,但是比较图片和获取子图是从客户PC端做的。
这里Appium工作的方式非常的类似,因为它也是在客户端跑,但需要注入事件发送命令时还是通过目标机器段的bootstrap来驱动uiatuomator来完成的,所以要把MonkeyRunner的获取子图已经图片比较的功能移植过来是非常容易的事情。
但UiAutomator就是另外一回事了,因为它完全是在目标机器那边跑的,所以你的代码必须要android那边支持,所以本人在移植到UiAutomator上面就碰到了问题,这里先给出Appium 上面的移植,以方便大家的使用,至于UiAutomator和Robotium的,今后本人会酌情考虑是否提供给大家。

还有就是这个移植过来的代码没有经过优化的,比如失败是否保存图片以待今后查看等。大家可以基于这个基础实现满足自己要求的功能

1. 移植代码

移植代码放在一个Util.java了工具类中:
	public static boolean sameAs(BufferedImage myImage,BufferedImage otherImage, double percent) 	{ 		//BufferedImage otherImage = other.getBufferedImage(); 	     //BufferedImage myImage = getBufferedImage(); 	      	 	     if (otherImage.getWidth() != myImage.getWidth()) { 	       return false; 	     } 	     if (otherImage.getHeight() != myImage.getHeight()) { 	       return false; 	     } 	      	     int[] otherPixel = new int[1]; 	     int[] myPixel = new int[1]; 	      	     int width = myImage.getWidth(); 	     int height = myImage.getHeight(); 	      	     int numDiffPixels = 0; 	      	     for (int y = 0; y < height; y++) { 	       for (int x = 0; x < width; x++) { 	         if (myImage.getRGB(x, y) != otherImage.getRGB(x, y)) { 	           numDiffPixels++; 	         } 	       } 	     } 	     double numberPixels = height * width; 	     double diffPercent = numDiffPixels / numberPixels; 	     return percent <= 1.0D - diffPercent; 	   } 	 	   public static BufferedImage getSubImage(BufferedImage image,int x, int y, int w, int h) 	   { 	     return image.getSubimage(x, y, w, h); 	   } 	     		public static BufferedImage getImageFromFile(File f) { 		 			BufferedImage img = null; 			 			try { 				img = ImageIO.read(f); 				 			} catch (IOException e) { 				//if failed, then copy it to local path for later check:TBD 				//FileUtils.copyFile(f, new File(p1)); 				e.printStackTrace(); 				System.exit(1); 			} 			return img; 		}
这里就不多描述了,基本上就是基于MonkeyRunner做轻微的修改,所以叫做移植。而UiAutomator就可能需要大改动,要重现实现了。

2. 客户端调用代码举例

package sample.demo.AppiumDemo;  import static org.junit.Assert.*;  import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL;  import javax.imageio.ImageIO;  import libs.Util; import io.appium.java_client.android.AndroidDriver;  import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.DesiredCapabilities;  public class CompareScreenShots {  	private AndroidDriver driver; 	 	@Before 	public void setUp() throws Exception { 		DesiredCapabilities cap = new DesiredCapabilities(); 		cap.setCapability("deviceName", "Android"); 		cap.setCapability("appPackage", "com.example.android.notepad"); 		cap.setCapability("appActivity", ".NotesList"); 		 		driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),cap); 	}  	@After 	public void tearDown() throws Exception { 		driver.quit(); 	}  	@Test 	public void compareScreenAndSubScreen() throws InterruptedException, IOException{ 		Thread.sleep(2000); 		 		WebElement el = driver.findElement(By.className("android.widget.ListView")).findElement(By.name("Note1")); 		el.click(); 		Thread.sleep(1000); 		String p1 = "C:/1"; 		String p2 = "C:/2";  		File f2 = new File(p2); 		 		File f1 = driver.getScreenshotAs(OutputType.FILE); 		FileUtils.copyFile(f1, new File(p1)); 		 		BufferedImage img1 = Util.getImageFromFile(f1); 		 		f2 = driver.getScreenshotAs(OutputType.FILE); 		FileUtils.copyFile(f2, new File(p2)); 		BufferedImage img2 = Util.getImageFromFile(f2);  		 		Boolean same = Util.sameAs(img1, img2, 0.9); 		assertTrue(same); 		 		BufferedImage subImg1 = Util.getSubImage(img1, 6, 39, 474, 38); 		BufferedImage subImg2 = Util.getSubImage(img1, 6, 39, 474, 38); 		same = Util.sameAs(subImg1, subImg2, 1); 		 		File f3 = new File("c:/sub-1.png"); 		ImageIO.write(subImg1, "PNG", f3); 		 		File f4 = new File("c:/sub-2.png"); 		ImageIO.write(subImg1, "PNG", f4); 		 	}  	 } 
也不多解析了,没有什么特别的东西。
大家用得上的就支持下就好了...


网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了加查免费建站欢迎大家使用!

 

作者

自主博客

微信

CSDN

天地会珠海分舵

http://techgogogo.com


服务号:TechGoGoGo

扫描码:

移植MonkeyRunner的图片对比和获取子图功能的实现-Appium篇

http://cdxtjz.cn/article/ghhjgj.html

联系我们

您好HELLO!
感谢您来到成都网站建设公司,若您有合作意向,请您为我们留言或使用以下方式联系我们, 我们将尽快给你回复,并为您提供真诚的设计服务,谢谢。
  • 电话:028- 86922220 18980695689
  • 商务合作邮箱:631063699@qq.com
  • 合作QQ: 532337155
  • 成都网站设计地址:成都市青羊区锣锅巷31号五金站写字楼6楼

小谭建站工作室

成都小谭网站建设公司拥有多年以上互联网从业经验的团队,始终保持务实的风格,以"帮助客户成功"为已任,专注于提供对客户有价值的服务。 我们已为众企业及上市公司提供专业的网站建设服务。我们不只是一家网站建设的网络公司;我们对营销、技术、管理都有自己独特见解,小谭建站采取“创意+综合+营销”一体化的方式为您提供更专业的服务!

小谭观点

相对传统的成都网站建设公司而言,小谭是互联网中的网站品牌策划,我们精于企业品牌与互联网相结合的整体战略服务。
我们始终认为,网站必须注入企业基因,真正使网站成为企业vi的一部分,让整个网站品牌策划体系变的深入而持久。