問題引入
很多app的都有訪問手機相冊,然后發送圖片的功能。這個功能也是比較常測試的一點。
一般來說,點開手機相冊,就有的相冊的縮略圖。如下圖所示:
這種縮略圖,在appium是找不到任何定位。xpath也沒有。在下面的情況下,該如何選擇該圖片,進行發送呢。解決的方案來自於這篇博客
https://appiumpro.com/editions/32
appium1.7引入了根據圖片策略來定位元素。傳入圖片的base64位編碼,然后引入opencv(開源視圖處理庫來匹配圖片元素。
首先我們要做的是安裝opencv4nodejs庫。opencv4nodejs庫的介紹如下https://www.npmjs.com/package/opencv4nodejs
安裝的步驟按照這個鏈接:https://gist.github.com/adwellj/61e7f202bcfe5b96f312293e9c812ca6
注,這邊說的是兩種方式,只要選擇其中的就好了。
下面列出主要代碼:
獲取圖片的Base64編碼:
public String getPictureImageB64() throws URISyntaxException,IOException{
String ImageName="picturetest02.jpg";
URL refImgUrl=getClass().getClassLoader().getResource(ImageName);
File refImgFile=Paths.get(refImgUrl.toURI()).toFile();
return Base64.getEncoder().encodeToString(Files.readAllBytes(refImgFile.toPath()));
}
將Base64編碼變成對應的appium中MobileBy(MobileBy需要java-clinet7.0 以上的版本,需要更新客戶端庫。
By imageBy=MobileBy.image(getPictureImageB64());
這里只需要將你所要選擇圖片放到項目的resources文件夾即可。上述代碼就可以找到。
appium定位元素位置:
public void SelectImageElement(AndroidDriver<AndroidElement> driver,By ImageBy){
WebDriverWait wait=new WebDriverWait(driver,10);
AndroidElement androidElement=null;
wait.until(ExpectedConditions.presenceOfElementLocated(ImageBy)).click();
}
}
在appium的官方文檔上,其實也談到一個方法。http://appium.io/docs/en/advanced-concepts/image-elements/
driver.findElementByImage(String Base64Code)
上面返回的圖片元素只能進行下面的操作
- click
- isDisplayed
- getSize
- getLocation
- getLocationInView
- getElementRect
上述的操作,而不能進行別的類似sendKeys操作等。