移动端自动化测试-AppiumApi接口详解

Appium 初始化配置信息(Desired Capabilities),Desired Capabilities实际上就是一个字典,它主要用于向Appium Server提供初始化配置参数,如:想要测试的系统是Android还是IOS,测试哪款软件,软件的入口是哪里等。

这种服务关键字在网上很多,百度搜一下就有一大堆了。

定位Android的appPackage与appActivity-Windows操作系统方法

通过监控adb操作日志来找到appPackage与appActivity,CMD下输入adb logcat | findstr Start,强制停止被测试软件,再次打开,观察logcat。

斜杠之前为appPackage,斜杠之后为appActivity。从此想抓那个App,就抓那个App。(logcat的日志较多,要找点击时第一个Start proc的日志。)

这种查看日志的方式比较不方便,日志一多起来,眼睛一乱什么也找不到了。所以可以使用SDK中的aapt进行抓取

SDK中下载最新的build-tools,通过aapt dump badging xxx.apk命令来查appPackage与appActivity。

包名:

入口:

下列代码可以打开手机QQ:

from appium import webdriver

des = {
       ‘resetKeyboard‘: True,
       ‘platformVersion‘: ‘6.0.1‘,
       ‘noReset‘: True, # 不将app初始化
       ‘appActivity‘: ‘com.tencent.mobileqq.activity.SplashActivity‘,
       # ‘appActivity‘: ‘.BrowserActivity‘,
       ‘appPackage‘: ‘com.tencent.mobileqq‘,
       # ‘appPackage‘: ‘com.android.browser‘,
       ‘unicodeKeyboard‘: True,
       ‘deviceName‘: ‘1afd95f92‘,
       ‘platformName‘: ‘Android‘}
# print(des)
driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub‘, des)

获取元素系列

# Android对应content-desc IOS对应accessibility identifier
# content-desc是给残障人士定义的特殊字段
driver.find_element_by_accessibility_id(‘content-desc‘)

# ID定位于selenium不同,可能存在重复的问题。
# appium-desktop抓取元素时如果出现有id,则可以直接用。
# resource-id可能出现重复,需要具体看下有多少个。
driver.find_element_by_id(‘resource-id‘)

# 对应class字段,有可能存在多个相同class。
# 多个相同class,每次获取只取第一个遇到的元素。
driver.find_element_by_class_name(‘class‘)

# Xpath路径定位,与Web的Xpath定位在有一点点区别
# Native App的定位以class为基准,主要用到参数有text、resource-id、index
driver.find_element_by_xpath(‘//android.widget.EditText[@text="手机号"]‘)

# 这个在运行时,调用的是Android自带的UI框架UiAutomator的Api
# 介绍几个简单常用的,text、className、resource-id
# text
# 匹配全部text文字
driver.find_element_by_android_uiautomator(‘new UiSelector().text("手机号")‘)
# 包含text文字
driver.find_element_by_android_uiautomator(‘new UiSelector().textContains("机")‘)
# 以text什么开始
driver.find_element_by_android_uiautomator(‘new UiSelector().textStartsWith("手")‘)
# 正则匹配text
driver.find_element_by_android_uiautomator(‘new UiSelector().textMatches("^手.*")‘)

# className
driver.find_elements_by_android_uiautomator(‘new UiSelector().className("android.widget.TextView")‘)
# classNameMatches
driver.find_elements_by_android_uiautomator(‘new UiSelector().classNameMatches("^android.widget.*")‘)

# resource-id、resourceIdMatches
driver.find_element_by_android_uiautomator(‘new UiSelector().resourceId("com.syqy.wecash:id/et_content")‘)

# description
driver.find_element_by_android_uiautomator(‘new UiSelector().description("S 日历")‘)
# descriptionStartsWith
driver.find_element_by_android_uiautomator(‘new UiSelector().descriptionStartsWith("日历")‘)
# descriptionMatches
driver.find_element_by_android_uiautomator(‘new UiSelector().descriptionMatches(".*历$")‘)

# Native App 暂不能使用
driver.find_element_by_tag_name(‘‘)

# Native App 暂不能使用
driver.find_element_by_partial_link_text(‘‘)

# Native App 暂不能使用
driver.find_element_by_link_text(‘‘)

# Native App 暂不能使用
driver.find_element_by_css_selector(‘‘)

滑动操作与拖拽操作

# 滚动处理
# elementObj1 目标滚动元素,elementObj2 起始滚动元素
# 底层通过action操作,与web ui相反,origin_el为目标元素,destination_el为起始元素
# 通过模拟手势可以看出 从下面的元素移动到上面的元素
# action.press(origin_el).move_to(destination_el).release().perform()
# web elementObj1为要移动的元素 elementObj2为移动到某个元素
# action.click(elementObj1).move_to_element(elementObj2).release().perform()
driver.scroll(elementObj1, elementObj2)

#通过坐标实现滑屏操作
# 从手机的左上角开始,横坐标为x轴,纵坐标为y
# 分辨率不同,坐标不相同,所以需要根据屏幕的大小做比例运算
driver.swipe(start_x, start_y, end_x, end_y,duration=None)

# 拖拽
# elementObj1源元素,elementObj2目标元素
# 通过long_press实现
driver.drag_and_drop(elementObj1, elementObj2)

# 多点触控 模拟手指点击
# tap模拟按住坐标多少秒,[(x,y)] 多个坐标则写多个元祖。参数2为按住多少秒。ms(毫秒)为单位
driver.tap([(x, y)], 5000)

操作APP

# 返回是否安装了对应包名的App True 或者 False
driver.is_app_installed(‘com.syqy.wecash‘)

# 关闭初始化信息中的App
driver.close_app()

# 启动初始化信息中的App
driver.launch_app()

# 安装app 参数为软件的绝对路径
driver.install_app(r‘C:\Users\bjhouyafan\Desktop\tester\appUi\wecash.apk‘)

# 卸载app 参数接收appPackageName
driver.remove_app(‘com.syqy.wecash‘)

# 获取当前打开的app名
driver.current_activity

# 启动某一个包的,某一个入口
# 参数接受appPackage,appActivity
# 可以省略多个步骤直接到达指定测试的位置
driver.start_activity(‘com.android.browser‘,‘.BrowserActivity‘)

# 每隔0.5秒判断一次当前的app名称是否是activityName
# WebDriverWait
driver.wait_activity(‘activityName‘, 5, 0.5)

# 将启动的app退出到后台,多少秒后在切回app
driver.background_app(‘m‘)

# 清除应用数据缓存,相当于卸载重装
driver.reset() 

NATIVE_APP 与 WEBVIEW 上下文操作

# 返回当前session中的app类型
driver.current_context

# 返回当前app的类型
# WEBVIEW 或 WEBVIEW
# 底层实际调用current_context
driver.context

# 获取app所有的类型
# 有WEBVIEW的则以list的形式展示两个
driver.contexts

# app类型切换 参数接收app类型
# appium对selenium的switch_to的扩展
# 增加了MobileSwitchTo,继承了selenium的switch_to
driver.switch_to.context(‘context‘)

KeyCode操作

# 隐藏键盘
driver.hide_keyboard()

# 发送按键码,仅按一下,与press_keycode相同
# 可接收str或int的code码
driver.keyevent(3)

# 发送按键码,仅按一下,可接收str或int的code码
driver.press_keycode(24)

# 发送一个长按的按键码,接收参数必须是int的code码
driver.long_press_keycode(25) 

网络

# 返回当前手机的网络状态
driver.network_connection

# 导入
from appium.webdriver.connectiontype import ConnectionType

# WIFI
ConnectionType.WIFI_ONLY

# 数据流量
ConnectionType.DATA_ONLY

# 飞行模式
ConnectionType.AIRPLANE_MODE

# 无网络模式
ConnectionType.NO_CONNECTION

# 全部都打开
ConnectionType.ALL_NETWORK_ON

# 设置 网络
driver.set_network_connection(ConnectionType.AIRPLANE_MODE)

操作输入法

# 返回Android上可用的输入法
driver.available_ime_engines

# 返回当前输入法的包名
driver.active_ime_engine

# 是否启动了输入法 True or False
driver.is_ime_active()

# 切换输入法 参数接收available_ime_engines中任意一个输入法包名
driver.activate_ime_engine(driver.available_ime_engines[0])

# 关闭当前输入法
driver.deactivate_ime_engine() 

其他

# 锁定手机多少秒 仅IOS
driver.lock()

# 摇手机
driver.shake()

# 打开通知栏 仅Android
driver.open_notifications()

# 获取连接手机的当前时间
driver.device_time

# 开启或关闭手机定位服务
driver.toggle_location_services()

原文地址:https://www.cnblogs.com/feng0815/p/8481495.html

时间: 2024-08-06 02:55:12

移动端自动化测试-AppiumApi接口详解的相关文章

移动端自动化==>AppiumApi接口详解

Appium 初始化配置信息(Desired Capabilities) Desired Capabilities实际上就是一个字典,它主要用于向Appium Server提供初始化配置参数,如:想要测试的系统是Android还是IOS,测试哪款软件,软件的入口是哪里等. 1 from appium import webdriver 2 # 存放连接手机app初始化的一些信息 3 desc = {} 4 # 手机唯一标识:通过(adb devices命令查看) 5 desc['deviceNam

S?D?I?与?A?S?I 接口详解介绍

分量编码 在对彩色电视信号进行数字化处理和传输是,一种常用的方式是分别对其3个分量(Y,R-Y,B-Y)进行数字化编码.这就是分量分量编码,另外还有全信号编码,全信号编码是对彩色全电视信号直接进行编码形成数字视频信号.它的抽样频率一般采用fs=4fsc,这样对NTSC制和PAL制信号形成便于进行行间,场间,帧间的信号的正交抽样结构. 1. 抽样频率 当亮度信号Y的带宽为5.8MHz~6MHz,两个色差信号(R-Y)和(B-Y)的带宽均为2MHz是,可以获得满意的带宽. 2. 电视演播室分量编码国

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频

Java6.0中Comparable接口与Comparator接口详解

Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者都吃饱撑着没事做吗? 再谈Comparator接口之前,大家应该先了解一个叫“策略模式”的东东.一下是百度百科对策略模式的描写: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern

Android Environment类的接口详解

Android应用开发中,常使用Environment类去获取外部存储目录,在访问外部存储之前一定要先判断外部存储是否已经是可使用(已挂载&可使用)状态, 并且需要在AndroidManifest.xml文件中添加外部存储读和写的权限. Environment类中提供了几个静态常量用于标识外部存储的状态,这些状态都是String类型 MEDIA_BAD_REMOVAL 在没有挂载前存储媒体已经被移除. MEDIA_CHECKING 正在检查存储媒体. MEDIA_MOUNTED 存储媒体已经挂载

JDBC常用接口详解

JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 一.查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象. 二.程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦. 第二种方式:Class.forName("com.mysql.

嵌入式开发平台 迅为6818开发板接口详解

迅为八核iTOP-6818开发板接口详解: iTOP-4418接口图: iTOP-6818核心板: iTOP-6818开发板接口详解: 1.POWER电源接口 电源输入为5V/2A+,给核心板AXP228电源管理芯片提供5V电源,给底板供电. 2. SWITCH电源开关 轻触电源开关可以控制开发板电源通断. 3. 拨码开关 3位拨码开关控制4418启动模式. 4. 模数转换 A/D模数转换,调整滑动变阻器,模拟量可以通过转换口检测到. 5. JTAG接口 保留JTAG接口,有需要的用户可以进行扩

IDisposable接口详解

IDisposable接口详解 1. MSDN中关于这个接口的说明 [ComVisible(true)] public interface IDisposable {     // Methods     void Dispose(); } [ComVisible(true)]:指示该托管类型对 COM 是可见的.此接口的主要用途是释放非托管资源.当不再使用托管对象时,垃圾回收器会自动释放分配给该对象的内存.但无法预测进行垃圾回收的时间.另外,垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无

基础拾忆------接口详解

目录: 基础拾忆------接口详解 基础拾忆------泛型详解 前言 接口定义了所有类继承接口时应遵循的契约.接口定义了 "要什么" ,派生类定义了 "怎么给" . 引用CLR VIA C#(类和接口继承) 在Microsoft.Net Framwork中,有一个名为System.Object的类,它定义了4个公共实例方法:ToString, Equals, GetHashCode和GetType.该类是其他所有类的根或者说最终基类.换言之,所有类都继承了Obj