問(wèn)題描述
問(wèn)題的產(chǎn)生是這樣滴喉誊,俺們公司的app登錄時(shí)有一步需要輸入手勢(shì)密碼召边,九宮格那種的,看下圖:
解決目標(biāo)是需要用appium自動(dòng)的輸入手勢(shì)密碼裹驰。
搜解決方案
于是乎,上網(wǎng)搜現(xiàn)成的經(jīng)驗(yàn)片挂,有了如下結(jié)果:
遇到了問(wèn)題
按照?qǐng)D示幻林,九宮格的9個(gè)點(diǎn)應(yīng)該為9個(gè)ImageView對(duì)象,如法炮制使用UIAutomator擼一遍咱要測(cè)試的app音念,發(fā)現(xiàn)現(xiàn)實(shí)有點(diǎn)骨干 ?? 看下圖
原來(lái)咱公司的app手勢(shì)密碼鍵盤(pán)用了LockViewPattern沪饺,沒(méi)有辦法拿到9個(gè)點(diǎn)對(duì)象;
也就是說(shuō)網(wǎng)上搜到的現(xiàn)成方法不適用我遇到的問(wèn)題??
換個(gè)思路 另辟蹊徑
那咋辦呢闷愤,這時(shí)理所應(yīng)當(dāng)?shù)南氲搅薚ouchAction整葡;利用觸摸動(dòng)作行為,直接做相應(yīng)的手勢(shì)讥脐。上網(wǎng)一搜就可以找到一段示例代碼
touchAction.press(beginX,beginY).moveTo(xStep,yStep).moveTo(xStep,yStep).release().perform();
雖然之前我沒(méi)有接觸過(guò)app的自動(dòng)化測(cè)試遭居,但是從這段例子代碼中我得到了一些暗示啼器;我猜他的意思是 在 (beingX,beginY)點(diǎn)按下手指,然后先移動(dòng) (xStep,yStep), 再移動(dòng)(xStep,yStep) 最后松開(kāi)俱萍。
實(shí)操辦法
為了簡(jiǎn)化測(cè)試難度端壳,我設(shè)定的手勢(shì)密碼是沿中間三個(gè)點(diǎn) 從上往下畫(huà)一條直線;
但是直接用坐標(biāo)點(diǎn)找會(huì)有一些問(wèn)題枪蘑,比如手機(jī)屏幕大小不同损谦,找點(diǎn)的位置可能會(huì)有偏差,所以輸入hardcode坐標(biāo)點(diǎn)是絕對(duì)不可取的岳颇;怎么辦呢照捡,看下圖
目前我從LockPatternView對(duì)象上可以拿到它的左上角起點(diǎn)的坐標(biāo) (beginX,beginY), 高度 height, 寬度width;如果是從中間第2點(diǎn) 垂直往下一條直線话侧,那么第二個(gè)點(diǎn)的x軸坐標(biāo)肯定是 beginX + width/2 栗精,畢竟在中點(diǎn)茎刚; 它的Y軸坐標(biāo) 大約為 beginY + height/4 亏镰; 從第二個(gè)點(diǎn)起始申屹,先往下走到第5點(diǎn) 然后再是 第8點(diǎn)却音; 它們大約要移動(dòng) 2個(gè) 1/4 * height的高度诽表;有了這些可變的相對(duì)坐標(biāo)位置吨铸,就不怕屏幕大小變化了 ??
嘗試了幾款屏幕大小不同的手機(jī)纺荧,均獲成功 ??
當(dāng)然這應(yīng)該只是解決思路之一捣郊,歡迎大家補(bǔ)充其他更好的辦法??
代碼參考
public static void setLockPattern(AppiumDriver driver) throws Exception{
List<WebElement> view = Toolkit.waifForExistence("http://android.view.View[contains(@resource-id,'view_lock_pattern')]",driver); //九宮格鍵盤(pán)view
WebElement welem = view.get(0);
int startX = welem.getLocation().getX();
int startY = welem.getLocation().getY();
int height = welem.getSize().getHeight();
int width = welem.getSize().getWidth();
int yStep = height / 4;
int beginX = (2 * startX + width) / 2;
int beginY = startY + yStep;
//手勢(shì)密碼設(shè)置
logger.info("開(kāi)始設(shè)置手勢(shì)密碼叭披,中間垂直直線 上->下");
TouchAction touchAction1 = new TouchAction(driver);
touchAction1.press(beginX,beginY).moveTo(0,yStep).moveTo(0,yStep).release().perform();
Toolkit.wait(1);
logger.info("再次設(shè)置手勢(shì)密碼寥殖,中間垂直直線 上->下");
touchAction1.press(beginX,beginY).moveTo(0,yStep).moveTo(0,yStep).release().perform();
logger.info("手勢(shì)密碼設(shè)置完畢");
}