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接口详解的更多相关文章

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

    Appium 初始化配置信息(Desired Capabilities) Desired Capabilities实际上就是一个字典,它主要用于向Appium Server提供初始化配置参数,如:想要 ...

  2. 【python3+request】python3+requests接口自动化测试框架实例详解教程

    转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...

  3. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

  4. socket接口详解

    1. socket概述 socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket起源于UNIX,在Unix一切 ...

  5. JDBC常用接口详解

    JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ...

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

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  7. “全栈2019”Java第八十四章:接口中嵌套接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第八十三章:内部类与接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. Java接口 详解(二)

    上一篇Java接口 详解(一)讲到了接口的基本概念.接口的使用和接口的实际应用(标准定义).我们接着来讲. 一.接口的应用—工厂设计模式(Factory) 我们先看一个范例: package com. ...

随机推荐

  1. FortiGate防火墙对数据包处理流程

    1.流程图 2.防火墙对数据包处理过程的各步骤如下: 1)Interface(网卡接口) 网卡接口驱动负责接数收据包,并转交给下一过程. 2)DoS Sensor(DoS防御,默认关闭) 负责过滤SY ...

  2. [leetcode]26. Remove Duplicates from Sorted Array有序数组去重(单个元素只出现一次)

    Given a sorted array nums, remove the duplicates in-place such that each element appear only once an ...

  3. [leetcode]31. Next Permutation下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  4. [原]Docker部署SuperMap8.1.1

    摘要:本文主要实践在Docker上制作SuperMap(超图)V8.1.1镜像,文中将使用 docker commit 方式创新镜像(Dockerfile择机再做).本文中使用的宿主环境及镜像环境都是 ...

  5. 正则冷知识;分组捕获、replace()的用法...

    1.var reg=/./; var reg=/\./的区别?? 前者代表任意一个字符,后者代表这个字符串中得有一个.. 2.?的使用?? 如果单独的一个字符串后面带? , var reg=/\d?/ ...

  6. 在IIS7里配置 ISAPI,运行dll程序,总提示下载dll

    在IIS7里配置 ISAPI,运行dll程序,总提示下载dll,只需要把对应站点应用程序池里面的高级设置里的启用32位应用程序,设为“true"即可.

  7. 部署文档(centos7.x\nginx\mysql5.6\jdk1.8\ssl\jboot)

    部署文档(centos7.x\nginx\mysql5.6\jdk1.8\ssl\jboot) 1.基础环境********************************************** ...

  8. 子div撑不开父div

    方法一:推荐 设置父div的overflow:hidden; 方法二: 父div结束前增加一个空div style=”clear:both;” .clear { clear:both; } <d ...

  9. POJ - 3984 迷宫问题 dfs解法

    #include<stdio.h> #include<string.h> #include<stack> #include<algorithm> usi ...

  10. Do More With These Great Plugins for Windows Live Writer(old)

    This article is out of day,now we use open live wirter, but we don’t have so much works great plugin ...