欢迎光临
我们一直在努力

涨薪技术|搞定Appium工作中常见应用操作

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(r"F:\\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,
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, 5000)

2.2 scroll滑动事件

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

方法:​​​​​​​

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

实例:

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

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 TouchAction

3.1 轻敲操作

模拟手指对某个元素或坐标按下并快速抬起。比如,固定点击(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'] = '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(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'] = '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(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'] = '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(x=650, y=650).perform()
    sleep(2)
    TouchAction(driver).press(x=650,
    y=650).release().perform()
    sleep(5)
    #退出driver
    driver.quit()

    3.3 等待操作

    模拟手指等待,比如按下后等待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'] = '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(x=650, y=650).perform()
    sleep(2)
    TouchAction(driver).press(x=650,
    y=650).wait(2000).release().perform()
    sleep(5)
    #退出driver
    driver.quit()

    3.4 长按操作

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

    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'] = '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(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()

      4手机操作

      4.1 获取手机分辨率

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

      driver.get_window_size()

      实例:

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

      print(driver.get_window_size())

      4.2 手机截图

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

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

      实例:

      打开《设置》界面,截图当前页面保存到当前目录,命名为screen.png

      driver.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, metastate=None) :第一个参数是发
      送给设备的关键代码,第二个是关键代码的元信息,一般是默认值

      实例:

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

      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)

      赞(0)
      未经允许不得转载:171主机测评 » 涨薪技术|搞定Appium工作中常见应用操作
      分享到: 更多 (0)

      评论 抢沙发

      • 昵称 (必填)
      • 邮箱 (必填)
      • 网址