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

随着Appium java-client库的更新,旧的手势函数如swipe已被废弃,现需使用TouchAction和MultiTouchAction实现手势操作。本文以滑动和多点触控为例,解释如何利用这两个类进行自动化测试。首先,通过press()、longPress()、moveTo()和release()组合实现滑动操作,接着介绍如何使用MultiTouchAction进行多点触控,例如实现缩放效果。

前言

更新了最新的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
这里写图片描述
http://appium.io/slate/en/master/?java#no-more-execute_script-quot-mobile-xxx-quot
这里写图片描述

TouchAction实现滑动操作

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

List<AndroidElement> 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中,同时操作,就是放大操作了。
效果图:
这里写图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值