APPium自动化常用指令
常用连接配置
desired_caps = {
'platformName': 'Android', # 被检测手机系统 安卓 or 苹果
'platformVersion': '5.1.1', # 手机安卓版本
# 'deviceName': '127.0.0.1:62001', # 设备名称。如果是真机,在'设置->关于手机->设备名称'里查看
'deviceName': 'emulator-5554',
'appPackage': 'com.tencent.mobileqq', # 启动APP Package名称
'appActivity': '.activity.SplashActivity', # 启动Activity的名称
'noReset': True, # 不重置APP
'newCommandTimeout': 6000, # 加长操作时间,默认一分钟后自动关闭
# 以上必填,以下选填
'unicodeKeyboard': True, # 使用unicode输入法,输入中文时需要使用,填True,看模拟器输入法,有些需要安装,有些不需要
'resetKeyboard': True, # 执行完程序回复原来输入法
# 'automationName': 'UiAutomator2', # 获取toast信息弹出框需添加,但需要先配置UiAutomator2
# 'app': r'D:\apk\bili.apk', # 测试apk包的路径,如果有了app就不需要APP Package和Activity,反理同之
}
连接Appium Server,初始化自动化环境
from appium import webdriver
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
隐式等待和显式等待
隐式等待
当发现元素没有找到的时候, 并不立即返回找不到元素的错误。而是周期性(每隔半秒钟)重新寻找该元素,直到该元素被找到,或者超出指定最大等待时长,这时才 抛出异常(如果是 find_elements
之类的方法, 则是返回空列表)。
Selenium 的 Webdriver 对象 有个方法叫 implicitly_wait
该方法接受一个参数,用来指定 最大等待时长。
# 设置缺省等待时间
driver.implicitly_wait(10)
显式等待
顾名思义,显式等待就是运行代码后设置好固定的等待时间,然后再继续运行,常用的为 time 模块的 sleep 方法
该方法接受一个参数,用来指定 最大等待时长。
import time
time.sleep(1)
界面元素查看工具
做 Selenium Web 自动化的时候,要找到元素,我们是通过浏览器的开发者工具栏来查看元素的特性,根据这些特性(属性和位置),来定位元素
Appium 要自动化手机应用,同样需要工具查看界面元素的特征。
常用的查看工具是: Android Sdk包中的 uiautomateviewer 和 Appium
定位元素
Appium是基于Selenium的,所以 和 Selenium 代码 定位元素的 基本规则相同:
- find_element_by_XXX 方法,返回符合条件的第一个元素,找不到抛出异常
- find_elements_by_XXX 方法,返回符合条件的所有元素的列表,找不到返回空列表
- 通过 WebDriver 对象调用这样的方法,查找范围是整个界面
- 通过 WebElement 对象调用这样的方法,查找范围是该节点的子节点
根据ID
在 Selenium Web 自动化教程里,如果能根据 ID 选择定位元素,最好根据ID,因为通常来说ID是唯一的,所以根据 ID 选择 效率高。
在安卓应用自动化的时候,同样可以根据 ID 查找。
但是这个ID ,是安卓应用元素的 resource-id 属性
使用如下代码
driver.find_element_by_id('')
根据CLASS NAME
安卓界面元素的 class 属性 其实就是根据元素的类型,类似 web 里面的 tagname, 所以通常不是唯一的。
通常,我们根据 class 属性来选择元素, 是要选择多个而不是一个。
当然,如果你确定要查找的界面元素的类型在当前界面中只有一个,就可以根据class来唯一选择。
使用如下代码
driver.find_elements_by_class_name('android.widget.TextView')
根据ACCESSIBILITY ID
元素的 content-desc 属性是用来描述该元素的作用的。
如果要查询的界面元素有 content-desc 属性,我们可以通过它来定位选择元素。
使用如下代码
driver.find_element_by_accessibility_id('')
Xpath
Appium 也支持通过 Xpath 选择元素。
但是其可靠性和性能不如 Selenium Web 自动化。因为 Web 自动化对 Xpath 的支持是由浏览器实现的,而 Appium Xpath 的支持是 Appium Server 实现的。
毕竟,浏览器产品的成熟度比 Appium 要高很多。
当然,Xpath是标准语法,所以这里表达式的语法规则和以前学习的Selenium里面Xpath的语法是一样的,比如
driver.find_element_by_xpath('')
注意:
selenium 自动化中,xpath 表达式中每个节点名是 html 的 tagname。
但是在 appium 中,xpath 表达式每个节点名是元素的 class 属性值。
比如:要选择所有的文本节点,就使用如下代码
driver.find_element_by_xpath('//android.widget.TextView')
Appium键盘操作
appium扩展提供了pressKeyCode()方法。该方法Android特有。
常用键盘操作键:
KEYCODE_HOME 按键Home
KEYCODE_MENU 菜单键
KEYCODE_BACK 返回键
KEYCODE_ENTER 回车键
KEYCODE_ESCAPE ESC键
KEYCODE_CTRL_LEFT Control+Left
KEYCODE_CTRL_RIGHT Control+Right
比如:
from appium.webdriver.extensions.android.nativekey import AndroidKey
driver.pressKeyCode(AndroidKey.enter)