溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

移植MonkeyRunner的圖片對(duì)比和獲取子圖功能的實(shí)現(xiàn)-Appium篇

發(fā)布時(shí)間:2020-07-19 22:07:17 來(lái)源:網(wǎng)絡(luò) 閱讀:1157 作者:zhukev 欄目:移動(dòng)開(kāi)發(fā)
如果你的目標(biāo)測(cè)試app有很多imageview組成的話,這個(gè)時(shí)候monkeyrunner的截圖比較功能就體現(xiàn)出來(lái)了。而其他幾個(gè)流行的框架如Robotium,UIAutomator以及Appium都提供了截圖,但少了兩個(gè)功能:
  • 獲取子圖
  • 圖片比較
既然Google開(kāi)發(fā)的MonkeyRunner能盛行這么久,且它體功能的結(jié)果驗(yàn)證功能只有截屏比較,那么必然有它的道理,有它存在的價(jià)值,所以我們很有必要在需要的情況下把它相應(yīng)的功能給移植到其他框架上面上來(lái)。
經(jīng)過(guò)本人前面文章描述的幾個(gè)框架的源碼的研究(robotium還沒(méi)有做),大家可以知道MonkeyRunner是跑在PC端的,只有在需要發(fā)送相應(yīng)的命令事件時(shí)才會(huì)驅(qū)動(dòng)目標(biāo)機(jī)器的monkey或者shell等。比如獲取圖片是從目標(biāo)機(jī)器的buffer設(shè)備得到,但是比較圖片和獲取子圖是從客戶PC端做的。
這里Appium工作的方式非常的類似,因?yàn)樗彩窃诳蛻舳伺?,但需要注入事件發(fā)送命令時(shí)還是通過(guò)目標(biāo)機(jī)器段的bootstrap來(lái)驅(qū)動(dòng)uiatuomator來(lái)完成的,所以要把MonkeyRunner的獲取子圖已經(jīng)圖片比較的功能移植過(guò)來(lái)是非常容易的事情。
但UiAutomator就是另外一回事了,因?yàn)樗耆窃谀繕?biāo)機(jī)器那邊跑的,所以你的代碼必須要android那邊支持,所以本人在移植到UiAutomator上面就碰到了問(wèn)題,這里先給出Appium 上面的移植,以方便大家的使用,至于UiAutomator和Robotium的,今后本人會(huì)酌情考慮是否提供給大家。

還有就是這個(gè)移植過(guò)來(lái)的代碼沒(méi)有經(jīng)過(guò)優(yōu)化的,比如失敗是否保存圖片以待今后查看等。大家可以基于這個(gè)基礎(chǔ)實(shí)現(xiàn)滿足自己要求的功能

1. 移植代碼

移植代碼放在一個(gè)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就可能需要大改動(dòng),要重現(xiàn)實(shí)現(xiàn)了。

2. 客戶端調(diào)用代碼舉例

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); 		 	}  	 } 
也不多解析了,沒(méi)有什么特別的東西。
大家用得上的就支持下就好了...


 

作者

自主博客

微信

CSDN

天地會(huì)珠海分舵

http://techgogogo.com


服務(wù)號(hào):TechGoGoGo

掃描碼:

移植MonkeyRunner的圖片對(duì)比和獲取子圖功能的實(shí)現(xiàn)-Appium篇

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI

<menuitem id="qsss2"></menuitem>
<button id="qsss2"></button>

<sub id="qsss2"></sub>
<td id="qsss2"></td>