【转帖】Appium 滑动问题研究

本文详细介绍了Appium中手势滑动的相关方法,包括swipe、flick和scroll等操作的具体应用。通过实例展示了在iOS7.x环境下针对不同类型的引导图进行滑动操作的有效策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无意中瞥到的,总结的不错,举一反三讲解了appium的手势滑动相关的方法,值得我们以后发帖学习!!!
原文地址:http://qa.blog.163.com/blog/static/190147002201452031611789/

一、Appium中,经常会遇到滑动操作,但往往用各种手势操作后还是滑动不了,今天主要讲下如何正确使用appium的手势操作。系统环境为最新的iOS 7.1+ Xcode 5.1
首先讲下滑动操作的几个基本方法。
1.swipe操作,主要用于缓慢拖动,代码示例

JavascriptExecutor js = (JavascriptExecutor) driver;
HashMap<String, Double> swipeObject = new HashMap<String, Double>();
swipeObject.put("startX", startX);
swipeObject.put("startY", startY);
swipeObject.put("endX", endX);
swipebject.put("endY", endY);
swipeObject.put("duration", duration);
swipeObject.put("element", Double.valueOf(((RemoteWebElement) element).getId()));
js.executeScript("mobile: swipe", swipeObject);

①X,Y可为coordinator,也可以是percent,duration单位为秒
②可以指定的element,也可以不指定
③appium mac端有swipe的按钮可以试下

2.flick操作,类似swipe,但没有duration,用于快速滑动,如ViewController的切换,代码示例

JavascriptExecutor js = (JavascriptExecutor) driver;
HashMap<String, Double> flickObject = new HashMap<String, Double>();
flickObject.put("startX", 0.8);
flickObject.put("startY", 0.5);
flickObject.put("endX", 0.2);
flickObject.put("endY", 0.5);
flickObject.put("element", Double.valueOf(((RemoteWebElement) element).getId()));
js.executeScript("mobile: flick", flickObject););

3.scroll操作,专为iOS 7.x而生,官方的解释如下

An unfortunate bug exists in the iOS 7.x Simulator where ScrollViews don't recognize gestures initiated by UIAutomation (which Appium uses under the hood for iOS). To work around this, we have provided access to a different function, scroll, which in many cases allows you to do what you wanted to do with a ScrollView, namely, scroll it!

简而言之,iOS 7的系统ScrollView无法识别手势操作,使用scroll方法可完美替代,代码见例子

二、接下来以三个不同app的引导图为例,分别为看游戏,云阅读和云音乐,演示下不同方法实现的滑动操作
1.看游戏,引导图以ScrollView引导,只需要使用srcoll方法即可

JavascriptExecutor js = (JavascriptExecutor) driver;
HashMap<String, String> scrollObject = new HashMap<String, String>();
scrollObject.put("direction", "right");
js.executeScript("mobile: scroll", scrollObject

2.云音乐,引导图以ScrollView引导,分别为4张image

Inspector中显示如下:

如上所示,如果使用swipe或flick方法是不可以滑动引导图的,而用Scroll的方向模式也不行,这里采用如下方法

JavascriptExecutor js = (JavascriptExecutor) driver;
WebElement  element = driver.findElementByXPath("4张image的xpath路径");
HashMap<String, String> scrollObject = new HashMap<String, String>();
scrollObject.put("element", ((RemoteWebElement) element).getId());
js.executeScript("mobile: scroll", scrollObject);

3.云阅读,云阅读的引导图并不是存在于ScrollView中,而是专门有一个UIAElement存放,那就只需要用swipe拖动这个UIAElement就好了,如图所示。

代码见swipe方法。

### 如何在 Appium 中实现滑动手势 #### 使用 Java 实现滑动手势 对于Java语言,在Appium中执行滑动操作可以通过`TouchAction`类完成。此方法适用于解决常见的滑动问题,尤其是在iOS 7.1及以上版本环境中[^2]。 ```java import io.appium.java_client.MobileElement; import io.appium.java_client.TouchAction; import org.openqa.selenium.By; // 假设driver已经初始化好 MobileElement element = (MobileElement) driver.findElement(By.id("someId")); new TouchAction(driver).press(element).moveTo(xOffset, yOffset).release().perform(); ``` 上述代码展示了如何创建一个简单的滑动动作,其中`element`是要开始触摸的元素位置,而`xOffset`和`yOffset`定义了手指移动的距离。 #### Python中的滑动手势实现 当采用Python作为开发语言时,可以利用`touch_action`模块来进行更复杂的交互行为,如下所示[^3]: ```python from appium import webdriver from time import sleep desired_caps = { 'platformName': 'Android', 'deviceName': 'emulator-5554', 'appPackage': 'com.example.package', 'appActivity': '.MainActivity' } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) sleep(2) # 定义起始坐标和结束坐标 start_x = 300 start_y = 800 end_x = 300 end_y = 300 # 执行滑动操作 driver.swipe(start_x, start_y, end_x, end_y, duration=500) ``` 这段脚本首先设置了设备连接参数并启动了一个新的会话;接着等待两秒让应用程序加载完毕;最后通过指定起点和终点坐标来模拟一次向上的滑屏动作,持续时间为500毫秒。 #### 特殊情况下的滑动处理 针对一些特殊情况,比如存在定时弹窗干扰的情况下,可以在尝试进行滑动之前先捕获可能出现的异常状况,并对其进行适当处理[^4]。 ```python try: # 正常流程:定位目标元素准备滑动 target_element = driver.find_element_by_id("targetID") except NoSuchElementException as e: # 如果找到目标,则检查是否有弹窗覆盖视线 alert_if_present = driver.switch_to.alert if alert_if_present is not None: alert_if_present.accept() # 或者 dismiss() # 尝试再次寻找目标元素 target_element = driver.find_element_by_id("targetID") # 继续执行正常的滑动逻辑... ``` 这种方法能够有效提高自动化测试过程中应对突发情况的能力,确保即使有意外因素也会影响到后续的操作准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值