测试工作中我们经常需要对App的页面(或手机屏幕)进行滑动、长按、拖动等手势操作,AppiumDriver提供了一个模拟手势操作的辅助类TouchAction,可以通过这个类对手机屏幕进行手势操作模拟。
具体用法参见链接:
chromedriver下载地址与webview自动化关键代码 - appium - 测试人社区。
1.导入TouchAction
导入TouchAction的演示代码如下(Python版和Java版)。
Python版
from appium.webdriver.commoon.touch_action import TouchAction
Java版本
import io.appium.java_client.TouchAction
2.常用的手势操作方法
TouchAction提供的常用的模拟手势的操作方法如下:
press按下;
release释放;
move_to/moveTo移动;
tap点击;
long_-press/longPress 长按;
wait等待;
cancel取消;
perform执行。
(1)press(按下)
TouchAction提供的press()方法可以实现模拟对元素或者页面上某个坐标点的按下操作。通常会结合release()方法实现对某个元素的点击(包括按下和抬起来两个动作)模拟操作。
当对某个控件执行点击操作时,就可以以使用press()方法,用法如下(Python版和Java版)。
Python版本
press(WebElement el)
在坐标为(x,y)的点执行点击操作,press()的用法如下(Python版和Java版)。
press(int x,int y)
Java版本
在坐标为(x,y)的点执行点击操作,press()用法如下(Python版和Java版)。
press(int x,int y)
(2)release 释放
测试工作中模拟释放操作可以结合press()和long_press()一起使用。release代表press()和long_press()方法结束后的动作事件。在某个被测的控件上执行释放操作的代码如下(Python版和Java版)。
Python版本
release(webElement el)
也可以在上一个操作结束之后执行release,不添加任何参数,代码如下。
release()
Java版本
release()
(3)移动
以控件为目标,测试模拟从一个点移动到一个目标点上,代码如下(Python版和Java版)。
Python版本
move_to(WebElement el)
以(x,y)点为目标,测试模拟从一个点移动到目标点,代码如下。
move_to(WebElement el,int x,int y)
Java版本
以(x,y)点为目标,测试模拟从一个点移动到目标点,代码如下。
moveTo(WebElement el,int x,int y)
(4)tap(点击)
测试模拟在某个控件的中心点上点击一下,代码如下(Python版和Java版)。
Python版本
tap(WebElement el)
以控件el的左上角为基准,沿着x轴向右移动x单位,沿着y轴向下移动y单位。在该点上点击,代码如下:
tap(WebElement el ,int x , int y)
以(x,y)坐标点为目标模拟点击操作,代码如下:
tap(int x,int y)
Java版本
对页面上某个点实现点击模拟操作,代码如下:
tap(int x,int y)
(5)长按
测试那个模拟长按某一控件的操作,代码如下(Python版和Java版)。
Python版本
long_press(WebElement el)
测试中模拟以(x,y)点为目标长按操作,代码如下:
long_press(WebElement el,int x_len,int y_len)
Java版本
只模拟在坐标点长按操作,代码如下:
longPress(int x,int y)
(6)等待
测试中模拟等待,单位为毫秒。可以在模拟操作事件的过程中,短暂地停留几秒再继续操作。代码如下(Python版和Java版)。
Python版本
wait (long timeout)
Java版本
wait (long timeout)
(7)cancel取消
测试中模拟取消执行事件链中的事件,代码如下(Python版和Java版)。
Python版本
cancel()
Java版本
cancel
(8)执行perform
测试模拟执行事件链中的时间,一般在测试脚本最后会调用perform方法,用以顺序执行事件链中的动作。代码如下(Python版和Java版)。
Python版本
preform()
Java版本
perform()
3.案例
测试用的App下载地址如下:
'https://GitHub网站/appium/appium/tree/master/sample-code/apps'
操作步骤:
1)打开测试应用;
2)从元素 “ Views” 滑动到 “Accessibility” 元素。
演示代码如下(Python版和Java版)。
(1)Python演示代码
#!/usr/bin/env python # -*-coding:utf-8 -*- #测试文件 test_touchaction.py from appium import webdriver from appium.webdriver.common.touch_action import TouchAction class TestTouchAction(): def setup(self): capa['platformName'] = 'Android' caps['platformVersion'] = '6.0' caps['deviceName'] = 'io.appium.android.apis' caps['appActivity'] = 'io.appium.android.apis.ApiDemos' self.driver = webdriver.Remote(\ "http://127.0.0.1:4723/wd/hub",caps) self.driver.implicitly_wait(5) def reardown(self): self.driver.quit() def test_touchaction_unlock(self): #点击 View ell = self.driver.find_element_by_accessibility_id( "Views") #点击 Accessibliity el2 = self.driver.find_element_by_accessibilty_id( "Accessibility") # TouchAction 滑动操作 action = TouchAction(self.driver) action.press(ell).wait(100).move_to\ (el2).wait(100).release().perform()
(2)Java演示代码
public class TouchActionTest( static AppiumDriver driver; @BeforeAll public static void beforeAll() throws MalformedURLException{ DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability("deviceName","emulator--5554"); caps.setCapability("platformName","Android"); caps.setCapability("appPackage","io.appium.android.apis"); caps.setCapability("appActivity","io.appium.android.apis.\ ApiDemos"); URL appiumServer = new URL("http://127.0.0.1:4723/wb/hub"); driver = new AndroidDriver(appiumServer,caps); driver.manage().tiemouts().implicityWait 10,/ TimeUnit.SECONDS); } @Test void test(){ //创建TouchAction对象 TouchAction action = new TouchAction<>(driver); //TouchAction滑动操作 action.press(PointOption.point((int)(width * 0.5),\ (int) (height * 0.8 ))).waitAction(WaitOptions.\ waitOptions(Duration.ofSecond(2))).moveTo(\ PointOption.point(int) (width * 0.5),\ (int) (height * 0.2))).release().perform(); } )
以上两段测试代码实现了相同的操作,创建了一个TouchAction对象,调用里面的press()方法实现了对元素的点击;使用wait()方法在时间之间添加等待;使用move_to()/moveTo()方法完成手势的移动操作;然后调用release()方法完成手势操作的抬起;最后调用perform()方法对添加到TouchAction中的时间链顺序执行。