
Appium 是一个开源、跨平台的自动化测试工具用于测试原生和轻量移动应用支持 iOS, Android 和 FirefoxOS 平台。此工具在测试工作中也较长用到接下来给大家介绍日常中的操作。1应用操作1.1获取应用的包名和界面名当我们从一个应用跳转到另外一个应用的时候想输出其包名、界面名或者想在报告中展现对应信息 我们就可以调用这个属性来进行获取。# 打印当前包名 print(driver.current_package) # 打印当前界面名 print(driver.current_activity)1.2 安装和卸载以及检查应用是否安装安装应用driver.install_app(app_path) 安装应用到设备需要apk包的路径卸载应用driver.remove_app(app_id) 从设备中删除一个应用检查应用是否安装driver.is_app_installed(app_id) 检查应用是否已经安装。需要传入 应用包的名字。返回结果为True或False案例# 如果计算器已经安装就会卸载计算器。如果计算器没有安装就会安装计算 器。 if driver.is_app_installed(com.youba.calculate): driver.remove_app(com.youba.calculate) else: driver.install_app(rF:\APP_packages\apks\calc.apk) #退出driver driver.quit()1.3 在脚本内启动其他应用我们经常遇到需要从一个应用跳转到另外一个应用 就像我们使用饿了吗的时候需要跳转到支付宝来进行支付一样。我们想要实现这种功能就要使用下面的方法了。driver.start_activity(appPackage, appActivity) 分别传入要打 开的应用的包名和界面名。实例打开《设置》等待三秒后跳转到《通讯录》sleep(3) #跳转到短信 driver.start_activity(com.android.contacts, .activities.PeopleActivity) sleep(5) #退出driver driver.quit()1.4 关闭应用driver.quit() 。但是这种关闭呢是关闭驱动对象同时关闭所有关联的 应用关闭后我们是无法使用脚本操作应用的。 如果我们只想关闭当前操作的应用不关闭驱动对象我们就可以使用 driver.close_app() 方法。 若要终止某个指定的应用可以使用driver.terminate_app(app_id) 需要传入app_id参数。1.5 重置应用driver.reset() #重置应用相当于“恢复出厂默认值”的效果这个方法不需要传入参数1.6 将应用置于后台driver.background_app(seconds) app放置到后台一定时间后再回到前 台模拟热启动。这个方法需要传入一个时间表示在后台停留多少秒实例打开《设置》进入后台五秒再回到前台time.sleep(3) driver.background_app(5) time.sleep(3) # 退出driver driver.quit()2滑动和拖拽2.1 swipe滑动事件从一个坐标位置滑动到另一个坐标位置只能是两个点之间的滑动。driver.swipe(start_x, start_y, end_x, end_y, durationNone) 参数分别是起点坐标的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, 5000)2.2 scroll滑动事件从一个元素滑动到另一个元素直到页面自动停止。方法driver.scroll(origin_el, destination_el, durationNone) 参 数分别是滑动开始的元素和滑动结束的元素实例从“存储”滑动到“更多”save_button driver.find_element_by_xpath(//*[text存 储]) more_button driver.find_element_by_xpath(//*[text更 多]) driver.scroll(save_button, more_button,5000)2.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)2.4 滑动和拖拽的选择滑动和拖拽无非就是考虑是否具有“惯性”以及传递的参数是“元素”还是“坐 标”。 可以分为三种情况 无 “惯性” 传入 “元素”drag_and_drop。 有 “惯性” 传入 “坐标”swipe并且设置较短的duration时间。 有 “惯性” 传入 “元素”scroll并且设置较短的duration时间。3高级手势高级手势TouchAction可以实现一些针对手势的操作比如滑动、长按、拖动等。我们可以将这些基本手势组合成一个相对复杂的手势。比如我们解锁手机或者一些应用软件都有手势解锁的这种方式。想要使用TouchAction必须要创建TouchAction对象通过对象调用想要执行的手势通过perform()执行动作。需要导入的模块from appium.webdriver.common.touch_action import TouchAction3.1 轻敲操作模拟手指对某个元素或坐标按下并快速抬起。比如固定点击100, 100的位置。方法TouchAction(driver).tap(elementNone, xNone, yNone).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] 7.1.2 #使用adb devices -l 查询,当有多台设备时需要声明 desired_caps[deviceName] 127.0.0.1:21503 #包名 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()3.2 按下和抬起操作模拟手指一直按下模拟手指抬起。可以用来组合成轻敲或长按操作。方法TouchAction(driver).press(elNone, xNone,yNone).perform() 模拟手指按下参数和轻敲操作一样TouchAction(driver).release().perform() 模拟手指对元素或坐标的抬起操作实例1使用坐标的形式按下 WLAN650, 6502 秒后按下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] 7.1.2 #使用adb devices -l 查询,当有多台设备时需要声明 desired_caps[deviceName] 127.0.0.1:21503 #包名 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(x650, y650).perform() sleep(2) TouchAction(driver).press(x650, y650).perform() sleep(5) #退出driver driver.quit()实例2使用坐标的形式按下 WLAN 650, 6502 秒后按下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] 7.1.2 #使用adb devices -l 查询,当有多台设备时需要声明 desired_caps[deviceName] 127.0.0.1:21503 #包名 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(x650, y650).perform() sleep(2) TouchAction(driver).press(x650, y650).release().perform() sleep(5) #退出driver driver.quit()3.3 等待操作模拟手指等待比如按下后等待5秒之后再抬起,方法TouchAction(driver).wait(ms0).perform() 参数是暂停的毫秒数实例使用坐标的形式点击 WLAN650, 6502 秒后按下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] 7.1.2 #使用adb devices -l 查询,当有多台设备时需要声明 desired_caps[deviceName] 127.0.0.1:21503 #包名 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(x650, y650).perform() sleep(2) TouchAction(driver).press(x650, y650).wait(2000).release().perform() sleep(5) #退出driver driver.quit()3.4 长按操作模拟手指移动操作比如手势解锁需要先按下再移动,方法TouchAction(driver).move_to(elNone, xNone,yNone).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] 7.1.2 #使用adb devices -l 查询,当有多台设备时需要声明 desired_caps[deviceName] 127.0.0.1:21503 #包名 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(x150, y525).move_to(x450, y525).move_to(x750, y525).move_to(x750, y825).move_to(x450, y825).move_to(x150, y825).move_to(x450, y1125).release().perform() sleep(5) #退出driver driver.quit()4手机操作4.1 获取手机分辨率自动化测试可能会需要根据当前设备的屏幕分辨率来计算一些点击或者滑动的坐标,方法:driver.get_window_size()实例输出当前设备的屏幕分辨率print(driver.get_window_size())4.2 手机截图有些自动化的操作可能没有反应但并不报错。此时我们就可以将操作过后的关键情况截图留存后期也可以根据图片发现问题。方法get_screenshot_as_file(filename) 参数是将截图保存为指定路径下、指定格式的图片实例打开《设置》界面截图当前页面保存到当前目录命名为screen.pngdriver.get_screenshot_as_file(screen.png)4.3 获取和设置手机网络视频应用在使用流量看视频的时候大部分都会提示用户正在是否继续播放。作为测试人员我们可能需要用自动化的形式来判断是否有对应的提示。即用流量的时候应该有提示使用WIFI的时候应该没有提示。4.3.1 获取手机网络driver.network_connection实例获取当前网络类型并打印到控制台print(driver.network_connection)4.3.2 设置手机网络driver.set_network_connection(connectionType) 参数为网络类型实例设置当前设备为飞行模式driver.set_network_connection(1)又将网络设置为全部打开driver.set_network_connection(6)4.4 发送键到设备模拟按 “返回键” “home键” 等等操作比如很多应用有按两次返回键退出应用的功能如果这个功能 需要我们做自动化那么一定会用到这个方法。driver.press_keycode(keycode, metastateNone) 第一个参数是发 送给设备的关键代码第二个是关键代码的元信息一般是默认值实例点击三次音量加再点击返回再点击两次音量减。为了让效果明显我设置了暂停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)4.5 操作手机通知栏测试即时通信类软件的时候如果A给B发送一条消息B的通知栏肯定会显示对应的消息。我们想通过通知栏来判断B是否收到消息一定要先操作手机的通知栏。方法driver.open_notifications() 打开手机通知栏appium官方并没有为我们提供关闭通知的api那么现实生活中怎么关闭就怎样操作就行比如手指从下往上滑动或者按返回键。实例打开通知栏两秒后关闭通知栏driver.open_notifications() sleep(2) driver.press_keycode(4)