天天看點

Webview 方式下實作tap事件

因為 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

繼續閱讀