如何使用TouchAction

时间:2017-05-31 10:35:47

标签: java appium appium-ios

我无法向下滚动到iOS和Android应用中的某个元素。自从Appium 1.6.3更新到1.7.1和io.appium到6.1.0之后,不推荐使用滑动方法,唯一的解决方案是使用TouchActions。

我试图用TouchActions解决它,但它根本没有滚动或滚动方向错误。

到目前为止我的解决方案看起来像这样,也许有人可以解释我做错了什么:

public void scrollDownUntilElementVisible(WebElement element){
    TouchAction touchAction = new TouchAction(getDriver());
    for(int i=0; i<dimensions.getHeight();i++){
       if(element.isDisplayed()){
          break;
       }else{
          touchAction.press(0,0).moveTo(element).release().perform();
       }
    }
}

这不是完整的代码,但我希望你明白这个想法。

如果我使用x,y坐标代替我在我的示例中查找的webElement,它会如何工作?它不像以前的版本中的滑动方法那样工作,或者我做得不对。也许有人可以解释一下。

2 个答案:

答案 0 :(得分:5)

我需要滚动才能找到屏幕外的元素。我想出的是:

  1. 在当前/可见屏幕上搜索所需的元素。
  2. 如果找不到该元素(即在屏幕外) - scrollDown(在我的情况下我只需要向下滚动)并再次转到步骤1。我在4次迭代中限制了测试,因为在我的情况下就足够了,所以在这里使用你自己的条件。
  3. private void scrollDown() {
        //if pressX was zero it didn't work for me
        int pressX = driver.manage().window().getSize().width / 2;
        // 4/5 of the screen as the bottom finger-press point
        int bottomY = driver.manage().window().getSize().height * 4/5;
        // just non zero point, as it didn't scroll to zero normally
        int topY = driver.manage().window().getSize().height / 8;
        //scroll with TouchAction by itself
        scroll(pressX, bottomY, pressX, topY);
    }
    
    /*
     * don't forget that it's "natural scroll" where 
     * fromY is the point where you press the and toY where you release it
     */
    private void scroll(int fromX, int fromY, int toX, int toY) {
        TouchAction touchAction = new TouchAction(driver);
        touchAction.longPress(fromX, fromY).moveTo(toX, toY).release().perform();
    }
    

    P.S。你可以从元素中获取坐标并在scroll中使用它。

    P.S.S。我使用了app 1.6.5

答案 1 :(得分:2)

在最新版本的Appium上,需要添加( PointOption.point ,同时传递坐标)以使用TouchAction滚动一些代码:

private void scrollDown() {
    //if pressX was zero it didn't work for me
    int pressX = driver.manage().window().getSize().width / 2;
    // 4/5 of the screen as the bottom finger-press point
    int bottomY = driver.manage().window().getSize().height * 4/5;
    // just non zero point, as it didn't scroll to zero normally
    int topY = driver.manage().window().getSize().height / 8;
    //scroll with TouchAction by itself
    scroll(pressX, bottomY, pressX, topY);
}



private void scroll(int fromX, int fromY, int toX, int toY) {
    TouchAction touchAction = new TouchAction(driver);
    touchAction.longPress(PointOption.point(fromX, fromY)).moveTo(PointOption.point(toX, toY)).release().perform();
}