移动端自动化测试-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()
移动端自动化测试-AppiumApi接口详解的更多相关文章
- 移动端自动化==>AppiumApi接口详解
Appium 初始化配置信息(Desired Capabilities) Desired Capabilities实际上就是一个字典,它主要用于向Appium Server提供初始化配置参数,如:想要 ...
- 【python3+request】python3+requests接口自动化测试框架实例详解教程
转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...
- python+requests接口自动化测试框架实例详解
python+requests接口自动化测试框架实例详解 转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...
- socket接口详解
1. socket概述 socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在Unix一切 ...
- JDBC常用接口详解
JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ...
- Java6.0中Comparable接口与Comparator接口详解
Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...
- “全栈2019”Java第八十四章:接口中嵌套接口详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第八十三章:内部类与接口详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java接口 详解(二)
上一篇Java接口 详解(一)讲到了接口的基本概念.接口的使用和接口的实际应用(标准定义).我们接着来讲. 一.接口的应用—工厂设计模式(Factory) 我们先看一个范例: package com. ...
随机推荐
- FortiGate外网IPSec链路及运维专线链路到个别网段不通
1.现状: 如图,用户网段有192.168.50.0/24.192.168.51.0/24和192.168.52.0/24.192.168.53.0/24.在防火墙上有静态路由到运维专线的10.160 ...
- java基础 ------- 多重循环 and break与continue
----- 什么是多重循环 ---- 打印数列 public class ForEx { public static void main(String[] args){ for(int i = ...
- .NET, ASP.NET, ADO.NET, C# 区别
1. .NET 是一套框架 1.1 CLR (common language runtime) 公共语言运行时,-提供内在管理,代码安全性检测等功能 1.1.1 CLS (common langua ...
- cmd输入appium-doctor,运行时提示'node'不是内部或外部的命令
一.提示'node'不是内部或外部命令,先按照下面步骤操作: 1.设置APPIUM_HOME系统变量,值为当前appium安装目录,例如:D:\software_install\Appium 2.设置 ...
- linux学习第八天 (Linux就该这么学)
今天学了,mount 挂载,umount撤销挂载,.fdisk 命令 管理硬盘 交换分区swap,硬盘配额 xfs_quota命令 今天工作,手机看了,看的不全,回头看录播了.
- GUI学习之一——PyQt5初识
我们在第〇篇里先演示了GUI的功能,其实Python有多个库是支持GUI编程的,python官网列出了大量的说明,其中包括了原生的tkinter 还有许多第三方库 Pyqt PySide wxPyth ...
- [Algorithm]Algorithm章1 排序算法
1.冒泡排序-相邻交换 (1)算法描述 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也 ...
- 修改chrome浏览器默认css样式的方法
最近重新用起了ubuntu kylin,然后又碰到之前让我感到有些难受的一个小问题:用chrome浏览部分网页时,一部分粗体字十分难看,就像是宋体直接加粗那样. 之前就觉得这样看起来很难受,但是找到的 ...
- python模块:time
# encoding: utf-8 # module time # from (built-in) # by generator 1.145 """ This modul ...
- javascript(作业九)
1.javascript简介: JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端 ...