1、Desired Capabilities
appium 在启动 session 时,需要提供 Desired Capabilities。Desired Capabilities 本质上是字典对象,由客户端生成并发送给服务器(appium Desktop),告诉服务器 App 运行的环境。
from appium import webdriver # 定义 Android 运行环境 desired_caps = { 'deviceName': 'Android Emulator', 'automationName': 'appium', 'platformName': 'Android', 'platformVersion': '7.0', 'appPackage': 'com.android.calculator2', 'appActivity': '.Calculator', 'noReset': True, } driver = webdriver.Remote(command_executor='http://localhost:4723/wd/hub',desired_capabilities=desired_caps) …
1. deviceName:启动的设备、真机或模拟器,如 iPhone Simulator、Android Emulator、Galaxy S4 等。
2. automationName:使用的自动化引擎,如 appium(默认)或 Selendroid(兼容 AndroidAPI 17 以下)。
3. platformName:使用的移动平台,如 iOS 或 Android。
4. platformVersion:指定平台的系统版本,如 Android 平台,版本为 7.0。
5. appPackage:被测试 App 的 Package 名,如 com.example.android.myApp、com.android.settings 等。
6. appActivity:被测试 App 的 Activity 名,如 Calculator、MainActivity、.Settings 等。
7. noReset:在会话前重置应用状态。当设置为 True 时,会跳过安装指引;默认为false。
appium 在启动 App 时必须要设置 appPackage 和 appActivity 两个参数。
方式一:通过 adb 工具抓取日志进行分析。
(1)运行“adb logcat>D:/log.txt”命令,将 adb 抓取的日志写入 D:/log.txt 文件。
(2)在 Android 模拟器或设备中打开要测试的 App,并做一些操作。
(3)按快捷键 Ctrl+c 结束日志的捕捉。
(4)打开 D:/log.txt 文件,搜索“Displayed”关键字,查找 App 的 Package 和 Activity。
方式二:通过 aapt 查看信息。
aapt 即 Android Asset Packaging Tool,在 SDK 的 build-tools 目录下。该工具既可以查看、创建、更新 zip 格式的文档附件(zip、jar、apk),也可以将资源文件编译成二进制文件。
2、控件定位
可以借助 Android SDK 自带的 UI Automator Viewer 工具对 Android 设备式模拟器中的控件进行定位。该工具位于…/tools/bin/目录下的 uiautomatorviewer.bat 文件中可以双击启动,也可以在 Windows 命令提示符下输入“uiautomatorviewer”命令启动。
1. id 定位
id 定位是使用控件的 resource-id 进行定位的。
driver.find_element_by_id()
2. Class Name 定位
Class Name 定位是使用控件的 class 属性进行定位的。
driver.find_elements_by_class_name()
3. XPath 定位
根据 WebDriver 上的 XPath 使用经验,查找层级标签名是错误的,正确的方式是获取控件的 class 属性,来代替标签名。
driver.find_element_by_xpath("//android.view.ViewGroup/android.widget.Button")
4. Accessibility id 定位
该方法属于 appium 扩展的定位方法,它采用一个字符串表示附加到给定元素的可访问id 或标签,例如,iOS 中的可访问标识符,或 Android 中的内容描述等。核心是找到控件的 contentDescription 属性。
driver.find_element_by_accessibility_id("plus")
5. Android uiautomator 定位
该方法属于 appium 的扩展定位方法,并且只支持 Android 平台。一个元素的任意属性都可以通过 Android uiautomator 方法来进行定位,使用方法如下。
# text 属性 driver.find_element_by_android_uiautomator('new UiSelector().text("clr")') # content-desc 属性 driver.find_element_by_android_uiautomator('new UiSelector().description("equals")') # id 属性 driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.android.calculator2:id/digit_1")') # class 属性 driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button")')
6. 其他定位
(1)在 appium 的 Native App 中没有使用的方法如下。
driver.find_element_by_name() driver.find_element_by_tag_name() driver.find_element_by_link_text() driver.find_element_by_partial_link_text() driver.find_element_by_css_selector()
(2)在 appium 中没有详细介绍的定位方法如下。
前三个定位方法是针对 iOS 平台控件的,后 4 个方法目前并不常用。
driver.find_element_by_ios_uiautomation() driver.find_element_by_ios_predicate() driver.find_element_by_ios_class_chain() driver.find_element_by_android_viewtag() find_element_by_android_data_matcher() driver.find_element_by_image() driver.find_element_by_custom()
3、appium 的常用 API
1. 应用操作
(1)安装应用
install_app()
安装应用到设备中,需要指定 apk 包的路径。
driver.install_app("D://android//apk//ContactManager.apk")
(2)卸载应用
remove_app()
从设备中卸载某个指定的应用,需要指定 App 包名。
driver.remove_app('com.example.android.apis')
(3)关闭应用
close_app()
(4)启动应用
launch_app()
(5)检查应用是否已经安装
is_app_installed()
检查应用是否已经安装,需要指定应用的包名。返回结果为 True 或 False。
result = driver.is_app_installed('com.example.android.apis') print(result)
(6)将应用置于后台
将当前应用置于后台,需要指定将应用置于后台的时间,默认时间单位为秒。
background_app()
(7)应用重置
类似于清除应用缓存。
reset()
2. 上下文操作
在计算机技术中,对进程而言,上下文就是进程执行时的环境,具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件和内存信息等。
(1)获取当前所有可用上下文
driver.contexts
(2)获取当前上下文。
driver.current_context
(3)切换上下文。
switch_to.context()
3. 键盘操作
(1)输入字符串
send_keys()
(2)模拟按键。
keyevent()
4. 触摸操作
(1)单击控件
对一个控件或坐标点(x,y)执行单击操作。tap()方法中有一个 count 参数,用于设置控件的单击次数,默认为 1 次。
tap(self, element=None, x=None, y=None, count=1)
(2)长按控件
长按一个控件或坐标点(x,y)。long_press()方法中有一个 duration 参数,用来控制按压的时间。duration 以毫秒为单位,其用法与 tap()方法相同。
long_press(self, el=None, x=None, y=None, duration=1000)
(3)移动
将光标移动到新的元素或坐标点(x,y)
move_to(self, el=None, x=None, y=None)
(4)暂停
暂停脚本的执行。ms 参数表示时间,单位为毫秒。
wait(self, ms=0)
appium 不仅可以执行一个动作,还可以同时执行多个动作,形成动作链,以模拟多指动作。appium 是通过构建一个 MultiAction 对象来实现执行多个动作的,该对象包含多个单独的 TouchAction 对象,每个“手指”对应一个。
from appium.webdriver.common.multi_action import MultiAction from appium.webdriver.common.touch_action import TouchAction … # 执行动作链 els = driver.find_elements_by_class_name('listView') a1 = TouchAction() a1.press(els[0])/ .move_to(x=10, y=0)/ .move_to(x=10, y=-75)/ .move_to(x=10, y=-600)/ .release() a2 = TouchAction() a2.press(els[1]) / .move_to(x=10, y=10)/ .move_to(x=10, y=-300)/ .move_to(x=10, y=-600)/ .release() ma = MultiAction(driver, els[0]) ma.add(a1, a2) ma.perform()
5. 特有操作
(1)熄屏
单击电源键熄灭屏幕。seconds 参数表示时间,单位为秒,默认为 None。
lock(self, seconds=None)
(2)获取当前 package
获取当前 App 的包名(package),仅支持 Android。
package = driver.current_package print(package)
(3)获取当前 activity
获取当前 App 的 activity,仅支持 Android。
activity = driver.current_activity print(activity)
(4)收起虚拟键盘
driver.hide_keyboard() # 收起虚拟键盘
(5)获取屏幕宽高
当需要通过坐标(x,y)对屏幕进行操作时,就需要获取屏幕的宽高。
windows = driver.get_window_size() print(windows["width"]) print(windows["height"])
(6)拉取文件
从真机或模拟器中拉取文件。path 参数指定文件的路径。
pull_file(self, path)
(7)推送文件
push_file(self, path, base64data)
path 参数指定 PC 中的文件路径,base64data 参数指定写入文件的内容的编码为 base64。
data = "some data for the file" path = "/data/local/tmp/file.txt" driver.push_file(path, data.encode('base64'))
原创文章,作者:wure,如若转载,请注明出处:https://blog.ytso.com/tech/273331.html