Appium最新的Java client库废弃了swipe等函数后,用TouchAction实现各种手势操作

前言

更新了最新的Appium java-client库 io.appium:java-client:5.0.4,对着官方文档找函数,发现一些文档上写的函数,在代码里敲不出来,像下面这几个
http://appium.io/slate/en/master/?java#swipe

SWIPE

Simulate a user swipe.

// java
driver.swipe(75, 500, 75, 0, 0.8)
PINCH

Pinch the screen.

// java
driver.pinch(element);
ZOOM

Zoom the screen.

// java
driver.zoom(element);

后来查了文档补充部分,还有Appium官方论坛,才发现好多旧的手势函数都废除了,JavaScript方式执行“mobile:XXX”的方式也没了,现在需要用TouchAction和MultiTouchAction的方式来实现这些手势操作了。废弃的内容官方文档里没有完全更新。
https://discuss.appium.io/t/some-of-the-methods-from-mobileelement-and-appiumdriver-class-missing-in-5-0-4/19039/2
Appium最新的Java client库废弃了swipe等函数后,用TouchAction实现各种手势操作_第1张图片
http://appium.io/slate/en/master/?java#no-more-execute_script-quot-mobile-xxx-quot
Appium最新的Java client库废弃了swipe等函数后,用TouchAction实现各种手势操作_第2张图片

TouchAction实现滑动操作

TouchAction有press(), longPress(), moveTo(),release() 等基础操作函数,但是没有封装好的点击tap(), 滑动swipe()等,要实现这些必须将操作分解,如点击tap就是press+release,滑动swipe则是press+move to+release,中间也可以加必要的等待。
下面以我之前写的笑话应用为例,说明下滑动操作的实现,代码如下:

List jokes = new ArrayList<>();
jokes = driver.findElementsByXPath("//android.support.v7.widget.RecyclerView/android.widget.FrameLayout");       

AndroidElement firstJoke = jokes.get(0);
AndroidElement lastJoke = jokes.get(jokes.size()-2);       
new TouchAction(driver).press(lastJoke).waitAction(Duration.ofSeconds(1)).moveTo(firstJoke).release().perform();

首先通过xPath找到当前页面中的笑话列表,取出第一个和倒数第二个笑话的Element(为什么不是最后一个,因为最后一个可能被底部导航挡住了)。
然后执行一系列的操作,首先new一个TouchAction对象,构造函数的参数是之前创建的WebDriver,然后按住最后一个笑话元素,等待1秒后,移动到第一个的位置,再释放按压,最后别忘了执行perform()。这样就完成了一个滑动操作了。

press()和moveTo()函数有好几种 overload形式。

press:
press(WebElement element),按压element中心位置
press(int x, int y),按压坐标(x,y)处
press(WebElement element, int x, int y),按压element偏移(x,y)的位置

moveTo也有相似的3种形式,但要注意,moveTo中的坐标(x,y)都是相对位置。
moveTo(WebElement element),移动到element的左上角
moveTo(int x, int y),从press的位置移动偏移量(x,y)
moveTo(WebElement element, int x, int y),移动到element偏移(x,y)的位置

MultiTouchAction实现多点触控

对于多点触控,如捏小或者放大,则还需要MultiTouchAction来实现。
MultiTouchAction有两个方法,add(TouchAction action)和perform()。实现的就是将多个TouchAction添加进来,在执行perform()后同时执行这些操作,实现多点触控操作。

以放大(zoom)操作为例,zoom其实可以理解成两个同时进行的反向swipe操作,swipe的方向为从element的中心下外。根据这个原理,可以通过将两个TouchAction添加到MultiTouchAction中来实现放大操作。为了更好的看到效果,我们在一个画图的app来看看效果,代码如下:


@Test public void test() {
        sleep(5000);
        WebElement drawBoard = driver.findElementById("org.vv.drawing.board:id/ll_drawing");

zoom(drawBoard);

    }
private void zoom(WebElement element) {
        int centerX = element.getLocation().getX()+element.getSize().getWidth()/2;
        int centerY = element.getLocation().getY()+element.getSize().getHeight()/2;
        TouchAction left = new TouchAction(driver).press(centerX-50,centerY)
                .waitAction(Duration.ofSeconds(2)).moveTo(- element.getSize().getWidth()/4,-element.getSize().getHeight()/4).release();
        TouchAction right = new TouchAction(driver).press(centerX+50, centerY)
                .waitAction(Duration.ofSeconds(2)).moveTo(element.getSize().getWidth()/4,element.getSize().getHeight()/4).release();
        new MultiTouchAction(driver).add(left).add(right).perform();
    }

创建两个TouchAction,一个从中间向左上角滑动,一个从中间向右下角滑动,添加到MultiTouchAction中,同时操作,就是放大操作了。
效果图:
Appium最新的Java client库废弃了swipe等函数后,用TouchAction实现各种手势操作_第3张图片

你可能感兴趣的:(Android)