咱们在作自动化测试的时候,有些按钮是须要滑动几回屏幕后才会出现,此时,咱们须要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了。android
从一个坐标位置滑动到另外一个坐标位置,只能是两个点之间的滑动。web
方法:api
driver.swipe(start_x, start_y, end_x, end_y, duration=None):参数分别是起点坐标的x,y和终点坐标的x,y,以及滑动时间,滑动事件的单位是ms。网络
实例1:app
模拟手指从(100,2000),滑动到(100,1000)的位置。测试
driver.swipe(100, 2000, 100, 1000)
实例2:ui
模拟手指从(100, 2000),滑动到(100, 100)的位置。编码
driver.swipe(100, 2000, 100, 100)
实例3:spa
模拟手指从(100, 2000),滑动到(100, 100)的位置,持续5秒。.net
driver.swipe(100, 2000, 100, 100, 5000)
距离相同时,持续时间越长,惯性越小。
持续时间相同时,手指滑动的距离越大,实际滑动的距离也就越大。
从一个元素滑动到另外一个元素,直到页面自动中止。
方法:
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)
不能设置持续时间,惯性很大。
从一个元素滑动到另外一个元素,第二个元素代替第一个元素本来屏幕上的位置。
方法:
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)
不能设置持续时间,没有惯性
滑动和拖拽无非就是考虑是否具备“惯性”,以及传递的参数是“元素”仍是“坐标”。
能够分为四种状况:
有 “惯性” ,传入 “元素”:scroll。
无 “惯性” ,传入 “元素”:drag_and_drop。
有 “惯性” ,传入 “坐标”:swipe,而且设置较短的duration时间。
无 “惯性” ,传入 “坐标”:swipe,而且设置较长的duration时间。
高级手势TouchAction能够实现一些针对手势的操做,好比滑动、长按、拖动等。咱们能够将这些基本手势组合成一个相对复杂的手势。好比,咱们解锁手机或者一些应用软件都有手势解锁的这种方式。
想要使用TouchAction,必需要建立TouchAction对象,经过对象调用想要执行的手势,经过perform()执行动做。
须要导入的模块:
from appium.webdriver.common.touch_action import TouchAction
模拟手指对某个元素或坐标按下并快速抬起。好比,固定点击(100, 100)的位置。
方法:
TouchAction(driver).tap(element=None, x=None, y=None).perform():参数能够是元素,也能够是x,y坐标。
实例:
打开《设置》,轻敲“WLAN”。
# coding:utf-8 from appium import webdriver from time import sleep from appium.webdriver.common.touch_action import TouchAction # 初始化 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()
模拟手指一直按下,模拟手指抬起。能够用来组合成轻敲或长按操做。
方法:
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 import webdriver from time import sleep from appium.webdriver.common.touch_action import TouchAction # 初始化 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 import webdriver from time import sleep from appium.webdriver.common.touch_action import TouchAction # 初始化 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()
模拟手指等待,好比按下后等待5秒以后再抬起。
方法:
TouchAction(driver).wait(ms=0).perform():参数是暂停的毫秒数。
实例:
使用坐标的形式点击 WLAN(650, 650),2 秒后,按下(650, 650)的位置,暂停2秒,并抬起。
# coding:utf-8 from appium import webdriver from time import sleep from appium.webdriver.common.touch_action import TouchAction # 初始化 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()
模拟手指移动操做,好比,手势解锁须要先按下,再移动。
方法:
TouchAction(driver).move_to(el=None, x=None, y=None).perform():参数同上。
实例:
在手势解锁中,画一个以下图的案例。
手势解锁的包名和界面名:
com.android.settings/.ChooseLockPattern
# coding:utf-8 from appium import webdriver from time import sleep from appium.webdriver.common.touch_action import TouchAction # 初始化 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()
自动化测试可能会须要根据当前设备的屏幕分辨率来计算一些点击或者滑动的坐标。
方法:
driver.get_window_size()
实例:
输出当前设备的屏幕分辨率。
print(driver.get_window_size())
有些自动化的操做可能没有反应,但并不报错。此时咱们就能够将操做事后的关键状况,截图留存。后 期也能够根据图片发现问题。
方法:
get_screenshot_as_file(filename):参数是将截图保存为指定路径下、指定格式的图片。
实例:
打开《设置》界面,截图当前页面保存到当前目录,命名为screen.png。(也能够修改成绝对路径,将图片保存在目标文件夹中。)
driver.get_screenshot_as_file("screen.png")
视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放。做为测试人员,咱们可能须要用自动化的形式来判断是否有对应的提示。即,用流量的时候应该有提示,使用WIFI的时候应该没有提示。
方法:
driver.network_connection
实例:
获取当前网络类型,并打印到控制台。
print(driver.network_connection)
打印了一个6,这是什么意思呢,咱们去查看下driver.network_connection的源码。
能够看到6表明的意思是全部网络所有打开,即手机流量和WIFI都是开启状态的。
方法:
driver.set_network_connection(connectionType):参数为网络类型。
实例:
设置当前设备为飞行模式。
driver.set_network_connection(1)
又将网络设置为所有打开
driver.set_network_connection(6)
模拟按 “返回键” “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)
测试即时通讯类软件的时候,若是A给B发送一条消息,B的通知栏确定会显示对应的消息。咱们想经过通知栏来判断B是否收到消息,必定要先操做手机的通知栏。
方法:
driver.open_notifications():打开手机通知栏。
appium官方并无为咱们提供关闭通知的api,那么现实生活中怎么关闭,就怎样操做就行,好比,手指从下往上滑动,或者,按返回键。
实例:
打开通知栏,两秒后,关闭通知栏。
driver.open_notifications() sleep(2) driver.press_keycode(4)