Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作

摘要:
driver.swipe实例3:模拟手指从,滑动到的位置,持续5秒。想要使用TouchAction,必须要创建TouchAction对象,通过对象调用想要执行的手势,通过perform()执行动作。需要导入的模块:fromappium.webdriver.common.touch_actionimportTouchAction2.1轻敲操作模拟手指对某个元素或坐标按下并快速抬起。#coding:utf-8fromappiumimportwebdriverfromtimeimportsleepfromappium.webdriver.common.touch_actionimportTouchAction#初始化desired_caps={}#使用哪种移动平台desired_caps['platformName']='Android'#Android版本desired_caps['platformVersion']='5.1.1'#使用adbdevices-l查询,当有多台设备时,需要声明desired_caps['deviceName']='127.0.0.1:62001'#包名desired_caps['appPackage']='com.android.settings'#界面名desired_caps['appActivity']='.Settings'#启动服务driver=webdriver.Remoteel=driver.find_element_by_xpathTouchAction.tap.perform()sleep#退出driverdriver.quit()2.2按下和抬起操作模拟手指一直按下,模拟手指抬起。
1. 滑动和拖拽

我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了。

1.1 swipe滑动事件

从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动。

方法:

driver.swipe(start_x, start_y, end_x, end_y, duration=None):参数分别是起点坐标的x,y和终点坐标的x,y,以及滑动时间,滑动事件的单位是ms。

实例1:

模拟手指从(100,2000),滑动到(100,1000)的位置。

driver.swipe(100, 2000, 100, 1000)

实例2:

模拟手指从(100, 2000),滑动到(100, 100)的位置。

driver.swipe(100, 2000, 100, 100)

实例3:

模拟手指从(100, 2000),滑动到(100, 100)的位置,持续5秒。

driver.swipe(100, 2000, 100, 100, 5000)

距离相同时,持续时间越长,惯性越小。

持续时间相同时,手指滑动的距离越大,实际滑动的距离也就越大。

1.2 scroll滑动事件

从一个元素滑动到另一个元素,直到页面自动停止。

方法:

driver.scroll(origin_el, destination_el):参数分别是滑动开始的元素和滑动结束的元素。

实例:

从“存储”滑动到“更多”。

save_button = driver.find_element_by_xpath("//*[@text='存储']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.scroll(save_button, more_button)

不能设置持续时间,惯性很大。

1.3 drag_and_drop拖拽事件

从一个元素滑动到另一个元素,第二个元素代替第一个元素原本屏幕上的位置。

方法:

driver.drag_and_drop(origin_el, destination_el):参数分别是滑动开始的元素和滑动结束的元素。

将“存储”拖拽到“更多”。

save_button = driver.find_element_by_xpath("//*[@text='存储']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.drag_and_drop(save_button, more_button)

不能设置持续时间,没有惯性

1.4 滑动和拖拽的选择

滑动和拖拽无非就是考虑是否具有“惯性”,以及传递的参数是“元素”还是“坐标”。

可以分为四种情况:

有 “惯性” ,传入 “元素”:scroll。

无 “惯性” ,传入 “元素”:drag_and_drop。

有 “惯性” ,传入 “坐标”:swipe,并且设置较短的duration时间。

无 “惯性” ,传入 “坐标”:swipe,并且设置较长的duration时间。

2. 高级手势

高级手势TouchAction可以实现一些针对手势的操作,比如滑动、长按、拖动等。我们可以将这些基本手势组合成一个相对复杂的手势。比如,我们解锁手机或者一些应用软件都有手势解锁的这种方式。

想要使用TouchAction,必须要创建TouchAction对象,通过对象调用想要执行的手势,通过perform()执行动作。

需要导入的模块:

from appium.webdriver.common.touch_action import TouchAction

2.1 轻敲操作

模拟手指对某个元素或坐标按下并快速抬起。比如,固定点击(100, 100)的位置。

方法:

TouchAction(driver).tap(element=None, x=None, y=None).perform():参数可以是元素,也可以是x,y坐标。

实例:

打开《设置》,轻敲“WLAN”。

#coding:utf-8
from appium importwebdriver
from time importsleep
from appium.webdriver.common.touch_action importTouchAction

#初始化
desired_caps ={}
#使用哪种移动平台
desired_caps['platformName'] = 'Android'
#Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings'

#启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
TouchAction(driver).tap(el).perform()

sleep(5)

#退出driver
driver.quit()

2.2 按下和抬起操作

模拟手指一直按下,模拟手指抬起。可以用来组合成轻敲或长按操作。

方法:

TouchAction(driver).press(el=None, x=None, y=None).perform():模拟手指按下,参数和轻敲操作一样。

方法:

TouchAction(driver).release().perform():模拟手指对元素或坐标的抬起操作。

实例1:

使用坐标的形式按下 WLAN(650, 650),2 秒后,按下(650, 650)的位置。

#coding:utf-8
from appium importwebdriver
from time importsleep
from appium.webdriver.common.touch_action importTouchAction

#初始化
desired_caps ={}
#使用哪种移动平台
desired_caps['platformName'] = 'Android'
#Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings'

#启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

TouchAction(driver).press(x=650, y=650).perform()
sleep(2)
TouchAction(driver).press(x=650, y=650).perform()

sleep(5)

#退出driver
driver.quit()

实例2:

使用坐标的形式按下 WLAN (650, 650),2 秒后,按下(650, 650)的位置,并抬起。

#coding:utf-8
from appium importwebdriver
from time importsleep
from appium.webdriver.common.touch_action importTouchAction

#初始化
desired_caps ={}
#使用哪种移动平台
desired_caps['platformName'] = 'Android'
#Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings'

#启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

TouchAction(driver).press(x=650, y=650).perform()
sleep(2)
TouchAction(driver).press(x=650, y=650).release().perform()

sleep(5)

#退出driver
driver.quit()

2.3 等待操作

模拟手指等待,比如按下后等待5秒之后再抬起。

方法:

TouchAction(driver).wait(ms=0).perform():参数是暂停的毫秒数。

实例:

使用坐标的形式点击 WLAN(650, 650),2 秒后,按下(650, 650)的位置,暂停2秒,并抬起。

#coding:utf-8
from appium importwebdriver
from time importsleep
from appium.webdriver.common.touch_action importTouchAction

#初始化
desired_caps ={}
#使用哪种移动平台
desired_caps['platformName'] = 'Android'
#Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings'

#启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

TouchAction(driver).tap(x=650, y=650).perform()
sleep(2)
TouchAction(driver).press(x=650, y=650).wait(2000).release().perform()

sleep(5)

#退出driver
driver.quit()

2.4 长按操作

模拟手指移动操作,比如,手势解锁需要先按下,再移动。

方法:

TouchAction(driver).move_to(el=None, x=None, y=None).perform():参数同上。

实例:

在手势解锁中,画一个如下图的案例。

手势解锁的包名和界面名:

com.android.settings/.ChooseLockPattern

#coding:utf-8
from appium importwebdriver
from time importsleep
from appium.webdriver.common.touch_action importTouchAction

#初始化
desired_caps ={}
#使用哪种移动平台
desired_caps['platformName'] = 'Android'
#Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.ChooseLockPattern'

#启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

TouchAction(driver).press(x=150, y=525).move_to(x=450, y=525).move_to(x=750,
y=525).move_to(x=750, y=825).move_to(x=450, y=825).move_to(x=150,
y=825).move_to(x=450, y=1125).release().perform()

sleep(5)

#退出driver
driver.quit()
3. 手机操作

3.1 获取手机分辨率

自动化测试可能会需要根据当前设备的屏幕分辨率来计算一些点击或者滑动的坐标。

方法:

driver.get_window_size()

实例:

输出当前设备的屏幕分辨率。

print(driver.get_window_size())

Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作第1张

3.2 手机截图

有些自动化的操作可能没有反应,但并不报错。此时我们就可以将操作过后的关键情况,截图留存。后 期也可以根据图片发现问题。

方法:

get_screenshot_as_file(filename):参数是将截图保存为指定路径下、指定格式的图片。

实例:

打开《设置》界面,截图当前页面保存到当前目录,命名为screen.png。(也可以修改为绝对路径,将图片保存在目标文件夹中。)

driver.get_screenshot_as_file("screen.png")

Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作第2张

Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作第3张

3.3 获取和设置手机网络

视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放。作为测试人员,我们可能需要用自动化的形式来判断是否有对应的提示。即,用流量的时候应该有提示,使用WIFI的时候应该没有提示。

3.3.1 获取手机网络

方法:

driver.network_connection

实例:

获取当前网络类型,并打印到控制台。

print(driver.network_connection)

Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作第4张

打印了一个6,这是什么意思呢,我们去查看下driver.network_connection的源码。

Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作第5张

可以看到6代表的意思是所有网络全部打开,即手机流量和WIFI都是开启状态的。

3.3.2 设置手机网络

方法:

driver.set_network_connection(connectionType):参数为网络类型。

实例:

设置当前设备为飞行模式。

driver.set_network_connection(1)

Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作第6张

又将网络设置为全部打开

driver.set_network_connection(6)

Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作第7张

3.4 发送键到设备

模拟按 “返回键” “home键” 等等操作,比如,很多应用有按两次返回键退出应用的功能,如果这个功能 需要我们做自动化,那么一定会用到这个方法。

方法:

driver.press_keycode(keycode, metastate=None):第一个参数是发送给设备的关键代码,第二个是关键代码的元信息,一般是默认值。

按键对应的编码,大家可以看我找到的一个CSDN大佬总结的:https://blog.csdn.net/feizhixuan46789/article/details/16801429

实例:

点击三次音量加,再点击返回,再点击两次音量减。(为了让效果明显,我设置了暂停)

driver.press_keycode(24)
sleep(1)
driver.press_keycode(24)
sleep(1)
driver.press_keycode(24)
sleep(1)
driver.press_keycode(4)
sleep(1)
driver.press_keycode(25)
sleep(1)
driver.press_keycode(25)

3.5 操作手机通知栏

测试即时通信类软件的时候,如果A给B发送一条消息,B的通知栏肯定会显示对应的消息。我们想通过通知栏来判断B是否收到消息,一定要先操作手机的通知栏。

方法:

driver.open_notifications():打开手机通知栏。

appium官方并没有为我们提供关闭通知的api,那么现实生活中怎么关闭,就怎样操作就行,比如,手指从下往上滑动,或者,按返回键。

实例:

打开通知栏,两秒后,关闭通知栏。

driver.open_notifications()
sleep(2)
driver.press_keycode(4)

免责声明:文章转载自《Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇R6010 -abort() has been called错误分析及其解决方法Oracle中merge into的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

七 APPIUM Android 定位方式

1.定位元素应用元素   1.1通过id定位元素 Android里面定位的id一般为resrouce-id: 代码可以这样写: WebElement element = driver.findElement(By.id("com.tencent.mm:id/do")); 或者: driver.findElementById("com.tencent.mm...

UI自动化测试篇 :Selenium2(Webdriver)&TestNG自动化测试环境搭建

      最开始学习UI自动化,用的工具是QTP10,用起来确实比较容易上手,自学了没多久,大家都说QTP过时了。这么好用的的工具怎么一下子就过时了呢?因为它的“笨重”,因为它作为商业软件带来的巨大使用成本,还是其选用的vbs语言,一起捆绑的ie浏览器……,这些都不算主要原因吧,主要还是WebDriver这个挑战者的异军突起,可以说webdriver没有...

Selenium自动化之鼠标双击操作

鼠标双击操作 from selenium.webdriver import ActionChains action_chains = ActionChains(self.driver) action_chains.double_click(inputBox).perform() import unittest import time from seleni...

移动端自动化==>Appium定位方式总结

1、ID Android Android的resource-id对应ID定位方式,可以通过index来获取需要的元素(从0开始查找dom树中的同名resource-id属性)。使用appium-desktop来获取元素时,id和resource-id是相同的,如果只有resource-id,可能存在重复现象,如果提示有id的定位方式,则可以只接获取,代表唯...

Selenium-Switch--切换浏览器tab/iframe/alart

Switch 我们在UI自动化测试时,总会出现新建一个tab页面、弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了。需要用到Selenium单独提供的模块switch_to模块 引用路径 # 第一种方式可以通过直接导入SwitchTo模块来进行操作 from selenium.webd...

手把手教你uiautomator_android自动化测试第一个示范

手把手教你uiautomator_android自动化测试第一个示例 android的自动化测试方案,弄了好久了。 Google在sdk4.0以后提供了一个自动化解决方案uiautomator: 优点:可以跨应用了;这可是亲生的; 缺点:必须sdk4.0以上版本;要想实现的好,最好有开发配合;java项目编译为jar后需要push到手机才能运行,也就是说必...