因為 click 事件會有一定時間的延遲,是以前端頁面的開發中傾向于使用tap事件,那麼在App的測試中應該怎樣觸發tap事件呢?
如果這個App是原生的App,可以直接使用TouchAction中的tap事件,其實用click事件也是可以觸發的。TouchAction 執行個體化時的driver 是MobileDriver
public TouchAction(MobileDriver driver){
this.driver = driver;
this.parameterBuilder = ImmutableList.builder();
}
但是實際中大部分應用都是混合應用,很多是加載的h5實作的頁面,定位h5 頁面的元素則需要轉到webview方式下,在webview模式下其實就相當于測試web頁面,再使用TouchAction中的方法就不會起作用了。這時候可以使用TouchActions中的方法,注意TouchAction 是 java_client包裡的,适用于AppiumDriver,而TouchActions 是 适用WebDriver的對象的,TouchActions 的一個構造函數如下:
public TouchActions(WebDriver driver) {
this(((HasInputDevices) driver).getKeyboard(),
((HasTouchScreen) driver).getTouch());
}
如果此時再用AppiumDriver 對象就會報錯。
網上查了很多方法,最終實作的方式是繼承 AndroidDriver 類,重寫HasTouchScreen 中的getTouch方法,繼承AndroidDriver 的類如下:
public class AndroidTouchableDriver extends AndroidDriver implements HasTouchScreen {
public RemoteTouchScreen touch;
public AndroidTouchableDriver(URL URL, Capabilities Cap) {
super(URL, Cap);
touch = new RemoteTouchScreen(getExecuteMethod());
}
@Override
public TouchScreen getTouch() {
return touch;
}
}
把所有使用AndroidDriver 執行個體化的 driver對象改成 AndroidTouchableDriver 進行執行個體化,既會保留AndroidDriver中的方法,又可以使用TouchActions 中的方法。
可以自己封裝一下singleTap方法:
public void singleTap(By byElement) {
TouchActions touchActions = new TouchActions(driver);
WebElement element = findElement(byElement);
touchActions.singleTap(element).perform();
}
使用的時候直接調用重新封裝的singleTap方法即可。
另外也可以擴充ChromDriver 實作TouchActions 中的方法:
參考下面的博文:
讓ChromeDriver支援TouchActions