其他分享
首页 > 其他分享> > 自动化测试之appium API

自动化测试之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'))

 

标签:appium,driver,element,API,Android,自动化,android,find
来源: https://www.cnblogs.com/mtoy/p/16448030.html