一. Appium 基础操作 API
前置参数讲解
# 导模块
from appium import webdriver
# 创建一个字典,包装相应的启动参数
desired_caps = dict()
# 需要连接的手机的平台(不限制大小写)
desired_caps['platformName'] = 'Android'
# 需要连接的手机的版本号(比如 5.2.1 的版本可以填写 5.2.1 或 5.2 或 5 ,以此类推)
desired_caps['platformVersion'] = '5.1'
# 需要连接的手机的设备号(andoird平台下,可以随便写,但是不能不写)
desired_caps['deviceName'] = '192.168.56.101:5555'
# 需要启动的程序的包名
desired_caps['appPackage'] = 'com.android.settings'
# 需要启动的程序的界面名
desired_caps['appActivity'] = '.Settings'
# 连接appium服务器
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 退出
driver.quit()
1.1 在脚本内启动其他 app
格式:
# 脚本内启动其他app
# 参数:
# appPackage:要打开的程序的包名
# appActivity:要打开的程序的界面名
driver.start_activity(appPackage, appActivity)
示例:
import time
from appium import webdriver
desired_caps = dict()
# 手机参数
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# 应用参数
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
# 获取driver
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
time.sleep(3)
driver.start_activity('com.android.mms', '.ui.ConversationList')# 退出driver
time.sleep(20)
driver.quit()
1.2 获取 app 的包名和界面名
格式
# 获取包名
driver.current_package
# 获取界面名
driver.current_activity
示例
import time
from appium import webdriver
desired_caps = dict()
# 手机参数
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# 应用参数
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
# 获取driver
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
time.sleep(3)
print(driver.current_package)
print(driver.current_activity)
driver.quit()
1.3 关闭 app 和 驱动对象
格式
# 关闭当前操作的app,不会关闭驱动对象
driver.close_app()
# 关闭驱动对象,同时关闭所有关联的app
driver.quit()
示例
from appium import webdriver
desired_caps = dict()
# 手机参数
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# 应用参数
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
# 获取driver
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
# 关闭应用
driver.close_app()
# 退出driver
driver.quit()
结果:
使用 quit() 后会报错,使用close_app() 不会报错
小结:
close_app() 不会关闭驱动对象,只会关闭应用
quit() 会关闭驱动对象
1.4 安装和卸载以及是否安装 app
方法名
# 安装app
# 参数:
# app_path:apk路径
driver.install_app(app_path)
# 卸载app
# 参数:
# app_id:应用程序包名
driver.remove_app(app_id)
判断app是否已经安装
# 参数:
# app_id:应用程序包名
# 返回值:
# 布尔类型,True为安装,False为没有安装
driver.is_app_installed(app_id)
示例
import time
from appium import webdriver
desired_caps = dict()
# 手机参数
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# 应用参数
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
# 获取driver
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
if driver.is_app_installed('cn.goapk.market'):
driver.remove_app('cn.goapk.market')
else:
driver.install_app(r'C:\Users\xuxu\Desktop\win\anzhishichang.apk')
driver.quit()
1.5 将应用置于后台
格式
# app放置到后台一定时间后再回到前台,模拟热启动
# 参数:
# seconds:后台停留多少秒
driver.background_app(seconds)
示例
import time
from appium import webdriver
desired_caps = dict()
# 手机参数
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# 应用参数
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
# 获取driver
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
time.sleep(3)
driver.background_app(5)
time.sleep(5)
driver.quit()
二、 UIAutomatorViewer工具
简介
定位元素的时候必须根据元素的相关特征来进行定位,而 UIAutomatorViewer 就是用来获取元素特征的
示例
- 打开 uiautomatorviewer
- 打开 android 模拟器
- 启动《设置》应用程序
- 点击 Device Screenshot 按钮
- 点击 ”放大镜“ 按钮
- 查看 Node Detail 中的 ”resource-id“ 信息
注意点:
- 自动打开的命令行窗口不要关
如果关了,整个工具也会关闭 - 打开uiautomatorviewer闪退
解决方案:jdk版本问题造成的,jdk为1.9时可能会出现这个问题,请换成1.8的版本 - 点击第二个按钮报错
解决方案:
adb kill-server
adb start-server
三、元素定位操作 API
元素定位步骤
- 打开 uiautomatorviewer 工具
- 打开模拟器或真机
- 通过 uiautomatorviewer 工具获取想要进行操作的元素的 Node Detail 信息
- 通过元素定位 API 进行定位
- 对元素进行相关操作
3.1 定位一个元素
方法名
# 通过id定位一个元素
# 参数:
# id_value:元素的resource-id属性值
# 返回值:
# 定位到的单个元素
driver.find_element_by_id(id_value)
# 通过class_name定位一个元素
# 参数:
# class_value:元素的class属性值
# 返回值:
# 定位到的单个元素
driver.find_element_by_class_name(class_value)
# 通过xpath定位一个元素
# 参数:
# xpath_value:定位元素的xpath表达式
# 返回值:
# 定位到的单个元素
driver.find_element_by_xpath(xpath_value)
示例
import time
from appium import webdriver
desired_caps = dict()
# 手机参数
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# 应用参数
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
# 获取driver
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
#通过 id 的形式,定位 ”放大镜“ 按钮,并点击
driver.find_element_by_id("com.android.settings:id/search").click()
#通过 class 的形式,定位 ”输入框“,输入 ”hello“
driver.find_element_by_class_name("android.widget.EditText").send_keys("xuxu")
#通过 xpath 的形式,定位 ”返回“ 按钮,并点击
driver.find_element_by_xpath("//*[@content-desc='收起']").click()
driver.quit()
注意点
如果很多元素的 “特征” 相同,使用 find_element_by_xxx 的方法会找到第一个
3.2 定位一组元素
应用场景
和定位一个元素相同,但如果想要批量的获取某个相同特征的元素,使用定位一组元素的方式更加方便
方法名
# 通过id定位一组元素
# 参数:
# id_value:元素的resource-id属性值
# 返回值:
# 列表,定位到的所有符合调价你的元素
driver.find_elements_by_id(id_value)
# 通过class_name定位一组元素
# 参数:
# class_value:元素的class属性值
# 返回值:
# 列表,定位到的所有符合调价你的元素
driver.find_elements_by_class_name(class_value)
# 通过xpath定位一组元素
# 参数:
# xpath_value:定位元素的xpath表达式
# 返回值:
# 列表,定位到的所有符合调价你的元素
driver.find_elements_by_xpath(xpath_value)
import time
from appium import webdriver
desired_caps = dict()
# 手机参数
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# 应用参数
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
# 获取driver
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
#通过 id 的形式,获取所有 resource-id 为 ”com.android.settings:id/title“ 的元素,并打印其文字内容
#titles = driver.find_elements_by_id("com.android.settings:id/title")
# for title in titles:
# print(title.text)
#通过 class_name 的形式,获取所有class 为 ”android.widget.TextView“ 的元素,并打印其文字内容
# testviews = driver.find_elements_by_class_name("android.widget.TextView")
# for i in testviews:
# print(i.text)
#通过 xpath 的形式,获取所有包含 ”设“ 的元素,并打印其文字内容
eles = driver.find_elements_by_xpath("//*[contains(@text,'设')]")
print(len(eles))
for i in eles:
print(i.text)
driver.quit()
四、元素等待
可能由于一些原因,我们想找的元素并没有立刻出来,此时如果直接定位可能会报错,比如以下原因:
- 由于网络速度原因
- 服务器处理请求原因
- 电脑配置原因
4.1隐式等待
概念
针对所有定位元素的超时时间设置为同一个值的时候
方法参数详解
# 参数:
# timeout:超时的时长,单位:秒
implicitly_wait(timeout)
示例
在 5 秒钟内,在《设置》程序中的 ”返回“ 按钮,如果找到则点击。如果找不到则观察对应错误信息。
import time
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# ------- 隐式等待
# driver.implicitly_wait(10)
#
# print("---准备找返回进行点击")
# driver.find_element_by_xpath("//*[@content-desc='收起']").click()
# print("---点完了")
driver.quit()
4.2显示等待
概念
针对所有定位元素的超时时间设置为不同的值的时候
步骤:
- 导包
- 创建 WebDriverWait 对象
- 调用 WebDriverWait 对象的 until 方法
方法参数解释:
# 参数:
# driver:驱动对象
# timeout:超时的时长,单位:秒
# poll_frequency:检测间隔时间,默认为0.5秒
# 返回值:
# WebDriverWait对象
WebDriverWait(driver, timeout, poll_frequency=0.5)
# 参数:
# method:lambda查找元素表达式
# 返回值:
# 定位到的元素,如果没有定位到会抛出TimeoutException异常
wait.until(method)
示例:
import time
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# print("---准备找返回进行点击")
wait = WebDriverWait(driver,5)
back_button = wait.until(lambda x:x.find_element_by_xpath("//*[@content-desc='收起']"))
back_button.click()
# print("---点完了")
driver.quit()
注意:
隐式等待和显式等待的选择
1.作用域:
显式等待为单个元素有效,隐式为全局元素
2.方法:
显式等待方法封装在 WebDriverWait 类中,而隐式等待则直接通过 driver 实例化对象调用
3.关于 sleep 的形式?
sleep 是固定死一个时间,不是不行,是不推荐。
元素等待可以让元素出来的第一时间进行操作。sleep 可能造成不必要的浪费
五、元素操作
5.1 点击元素
方法名:
# 对element按钮进行点击操作
element.click()
示例:
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
driver.find_element_by_id("com.android.settings:id/search").click()
time.sleep(5)
driver.quit()
5.2 输入和清空输入框内容
方法名
# 对element输入框进行输入操作
# 参数:
# value:输入的内容
element.send_keys(value)
# 对element输入框进行输入操作
element.clear()
示例:
- 打开《设置》
- 点击 ”放大镜“
- 输入 ”hello“
- 暂停 2 秒
- 清空所有文本内容
- 暂停 5 秒
- 输入 ”你好“
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
driver.find_element_by_id("com.android.settings:id/search").click()
driver.find_element_by_id("android:id/search_src_text").send_keys("hellow")
time.sleep(2)
driver.find_element_by_id("android:id/search_src_text").clear()
time.sleep(2)
driver.find_element_by_id("android:id/search_src_text").send_keys("你好")
time.sleep(2)
driver.quit()
注意:
默认输入中文无效,但不会报错,需要在 ”前置代码“ 中增加两个参数
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
5.3 获取元素的文本内容
属性名
# 获取element控件的文本内容
# 返回值:
# 控件的文本内容
element.text
示例:
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
els = driver.find_elements_by_id("com.android.settings:id/title")
for i in els:
print(i.text)
driver.quit()
5.4 获取元素的位置和大小
属性名
# 获取element的位置
# 返回值:
# 字典,x为元素的x坐标,y为元素的y坐标
element.location
# 获取element的大小
# 返回值:
# 字典,width为宽度,height为告诉
element.size
示例:
- 打开《设置》
- 获取 ”放大镜“ 的位置和大小
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
sub_button = driver.find_element_by_id("com.android.settings:id/search")
print(sub_button.location)
print(sub_button.size)
driver.quit()
5.5 获取元素的属性值
方法名
# 对element进行点击操作
# 参数:
# value:要获取的属性名
# 返回值:
# 根据属性名得到的属性值
element.get_attribute(value) # value:元素的属性
示例:
1. 打开《设置》
2. 获取所有 resource-id 为 ”com.android.settings:id/title“ 的元素
3. 使用 get_attribute 获取这些元素的 enabled、text、content-desc、resource-id、class 的属性值
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
els = driver.find_elements_by_id("com.android.settings:id/title")
for i in els:
print(i.get_attribute("enabled"))
print(i.get_attribute("text"))
print(i.get_attribute("resourceId"))
print(i.get_attribute("className"))
print(i.get_attribute("className"))
driver.quit()
注意:
value=‘text’ 返回text的属性值
value=‘name’ 返回content-desc / text属性值
value=‘className’ 返回 class属性值,只有 API=>18 才能支持
value=‘resourceId’ 返回 resource-id属性值,只有 API=>18 才能支持
六、滑动和拖拽事件
6.1 swipe 滑动事件
概念:
从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
方法名:
# 从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
# 参数:
# start_x: 起点X轴坐标
# start_y: 起点Y轴坐标
# end_x: 终点X轴坐标
# end_y: 终点Y轴坐标
# duration: 滑动这个操作一共持续的时间长度,单位:ms
driver.swipe(start_x, start_y, end_x, end_y, duration=None)
示例:
模拟手指从(100, 2000),滑动到(100, 1000)的位置
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
driver.swipe(100,2000,100,1000)
driver.quit()
示例2:
模拟手指从(100, 2000),滑动到(100, 100)的位置,持续5秒
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
driver.swipe(100, 2000, 100, 100, 5000)
driver.quit()
小结:
距离相同时,持续时间越长,惯性越小
持续时间相同时,手指滑动的距离越大,实际滑动的距离也就越大
6.2 scroll 滑动事件
概念:
从一个元素滑动到另一个元素,直到页面自动停止。
方法名:
# 从一个元素滑动到另一个元素,直到页面自动停止
# 参数:
# origin_el: 滑动开始的元素
# destination_el: 滑动结束的元素
driver.scroll(origin_el, destination_el)
示例:
从 “存储” 滑动到 “更多”
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
save_button = driver.find_element_by_xpath("//*[@text='存储']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.scroll(save_button,more_button)
driver.quit()
6.3 drag_and_drop 拖拽事件
概念
从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置。
方法名
# 从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置
# 参数:
# origin_el: 滑动开始的元素
# destination_el: 滑动结束的元素
driver.drag_and_drop(origin_el, destination_el)
示例:
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
save_button = driver.find_element_by_xpath("//*[@text='存储']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.drag_and_drop(save_button,more_button)
driver.quit()
小姐:
不能设置持续时间,没有惯性
6.4.滑动和拖拽的选择
滑动和拖拽无非就是考虑是否有 “惯性” ,以及传递的参数是 “元素” 还是 “坐标”。
可以分成以下四种情况
有 “惯性” ,传入 “元素”用scroll
无 “惯性” ,传入 “元素”用drag_and_drop
有 “惯性” ,传入 “坐标”用swipe,并且设置较短的 duration 时间
无 “惯性” ,传入 “坐标”用swipe,并且设置较长的 duration 时间
七、高级手势TouchAction
使用步骤
- 创建 TouchAction 对象
- 通过对象调用想执行的手势
- 通过 perform() 执行动作
注意点
所有手势都要通过执行perform()函数才会运行。
7.1 轻敲操作【掌握】
应用场景:
模拟手指对某个元素或坐标按下并快速抬起。比如,固定点击(100, 100)的位置
方法名:
# 模拟手指对元素或坐标的轻敲操作
# 参数:
# element:元素
# x:x坐标
# y:y坐标
#count是次数,点击一次两次
TouchAction(driver).tap(element=None, x=None, y=None,count=1).perform()
示例:
- 打开《设置》
- 轻敲 “WLAN”
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
wlabtn = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
touch_action = TouchAction(driver)
touch_action=touch_action.tap(wlabtn)
touch_action.perform()
#坐标形式
#TouchAction(driver).tap(x=650,y=650).perform()
driver.quit()
7.2 按下和抬起操作【掌握】
应用场景:
模拟手指一直按下,模拟手指抬起。可以用来组合成轻敲或长按的操作
方法名:
# 模拟手指对元素或坐标的按下操作
# 参数:
# el:元素
# x:x坐标
# y:y坐标
TouchAction(driver).press(el=None, x=None, y=None).perform()
# 模拟手指对元素或坐标的抬起操作
TouchAction(driver).release().perform()
示例:
使用坐标的形式按下 WLAN (650, 650),2 秒后,按下(650, 650)的位置,并抬起
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
TouchAction(driver).press(x=650,y=650).perform()
time.sleep(2)
TouchAction(driver).press(x=650,y=650).release().perform()
7.3 等待操作【掌握】
应用场景:
模拟手指等待,比如按下后等待 5 秒之后再抬起。
方法名:
# 模拟手指暂定操作
# 参数:
# ms:暂停的毫秒数
TouchAction(driver).wait(ms=0).perform()
示例:
使用坐标的形式点击 WLAN (650, 650),2 秒后,按下(650, 650)的位置,暂停 2 秒,并抬起
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
TouchAction(driver).tap(x=650,y=650).perform()
time.sleep(2)
TouchAction(driver).press(x=650,y=650).wait(2000).release().perform()
7.4 长按操作【掌握】
应用场景:
模拟手指对元素或坐标的长按操作。比如,长按某个按钮弹出菜单。
方法名:
# 模拟手指对元素或坐标的长按操作
# 参数:
# el:元素
# x:x坐标
# y:y坐标
# duration:长按时间,毫秒
TouchAction(driver).long_press(el=None, x=None, y=None, duration=1000).perform()
示例:
使用坐标的形式点击 WLAN (650, 650),2 秒后,长按(650, 650)的位置持续 2 秒
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
TouchAction(driver).tap(x=650,y=650).perform()
time.sleep(2)
TouchAction(driver).long_press(x=650,y=650,duration=2000).perform()
7.5 移动操作【掌握】
应用场景:
模拟手指移动操作,比如,手势解锁需要先按下,再移动。
方法名
# 模拟手指对元素或坐标的移动操作
# 参数:
# el:元素
# x:x坐标
# y:y坐标
TouchAction(driver).move_to(el=None, x=None, y=None).perform()
示例
在手势解锁中,画一个如下图的案例
包名界面名为 com.android.settings/.ChooseLockPattern
传
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.ChooseLockPattern'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
TouchAction(driver).press(x=237,y=850).move_to(x=718,y=853).move_to(x=1198,y=846).release().perform()
八、手机操作API
8.1 获取手机分辨率【掌握】
应用场景:
自动化测试可能会需要根据当前设备的屏幕分辨率来计算一些点击或者滑动的坐标
方法名:
# 获取手机分辨率
driver.get_window_size()
示例:
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
print(driver.get_window_size())
driver.quit()
8.2 手机截图【掌握】
方法名:
# 获取手机分辨率
# 参数:
# filename:指定路径下,指定格式的图片
get_screenshot_as_file(filename)
示例:
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
print(driver.get_window_size())
driver.get_screenshot_as_file("./111.png")
driver.quit()
8.3 获取和设置手机网络【掌握】
应用场景:
视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放。作为测试人员,我们可能需要用自动化的形式来判断是否有对应的提示。即,用流量的时候应该有提示,不用流量的时候应该没有提示。
示例:
# 获取手机网络
driver.network_connection
# 设置手机网络
# 参数:
# connectionType:网络类型
driver.set_network_connection(connectionType)
示例
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
#获取网络
print(driver.network_connection)
#设置网络
driver.set_network_connection(4)
driver.quit()
8.4 发送键到设备【掌握】
应用场景:
模拟按 “返回键” “home键” 等等操作,比如,很多应用有按两次返回键退出应用的功能,如果这个功能需要我们做自动化,那么一定会用到这个方法
方法名:
# 发送键到设备
# 参数:
# keycode:发送给设备的关键代码
# metastate:关于被发送的关键代码的元信息,一般为默认值
driver.press_keycode(keycode, metastate=None)
示例
点击三次音量加,再点击返回,再点击两次音量减。
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
driver.press_keycode(24)
time.sleep(2)
driver.press_keycode(24)
time.sleep(2)
driver.press_keycode(24)
time.sleep(2)
driver.press_keycode(4)
time.sleep(2)
driver.press_keycode(25)
time.sleep(2)
driver.press_keycode(25)
driver.quit()
8.5 操作手机通知栏【掌握】
应用场景:
测试即时通信类软件的时候,如果 A 给 B 发送一条消息,B 的通知栏肯定会显示对应的消息。我们想通过通知栏来判断 B 是否收到消息,一定要先操作手机的通知栏
方法名:
# 打开手机通知栏
driver.open_notifications()
示例:
import time
from appium import webdriver
desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.open_notifications()
time.sleep(3)
driver.press_keycode(4)
driver.quit()