自动化测试之appium API


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

(0)
上一篇 2022年7月10日 05:39
下一篇 2022年7月10日 05:43

相关推荐

发表回复

登录后才能评论