Appium 初始化配置信息(Desired Capabilities)

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

 from appium import webdriver
# 存放连接手机app初始化的一些信息
desc = {}
# 手机唯一标识:通过(adb devices命令查看)
desc['deviceName'] = 'emulator-5554'
# 手机上操作系统版本
desc['platformVersion'] = '5.1.1'
# 测试手机的系统
desc['platformName'] = 'Android'
# 包名
desc['appPackage'] = 'com.tencent.mobileqq'
# 入口
desc['appActivity'] = 'com.tencent.mobileqq.activity.SplashActivity'
# appium的输入法,支持中文
desc["unicodeKeyboard"] = "True"
# 程序结束之后重置输入法
desc["resetKeyboard"] = "True"
# 不初始化app(不会清除app的数据包括缓存数据)
desc["noReset"] = "True"
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desc)

也可以这么写

 from appium import webdriver
# 存放连接手机app初始化的一些信息
desc = {'deviceName':'emulator-5554', # 手机唯一标识:通过(adb devices命令查看)
'platformVersion':'5.1.1', # 手机上操作系统版本
'platformName':'Android', # 测试手机的系统
'appPackage':'com.tencent.mobileqq', # 包名
'appActivity':'com.tencent.mobileqq.activity.SplashActivity', # 入口
'unicodeKeyboard':'True', # appium的输入法,支持中文
'resetKeyboard':'True', # 程序结束之后重置输入法
'noReset':'True'} # 不初始化app(不会清除app的数据包括缓存数据)
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desc)

定位Android的appPackage与appActivity的方法

方法一:

在cmd下输入命令:aapt dump badging +apk全路径获取appPackage与appActivity,如下图:

方法二:

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

斜杠左边为appPackage,斜杠右边为appActivity。(logcat的日志较多,要找点击时第一个Start proc的日志。)但是,这种查看日志的方式比较不方便,日志一多起来,不太好找。所以建议使用方法一来确定appPackage和appActivity。

操作APP

 # 返回是否安装了对应包名的App True 或者 False
driver.is_app_installed('com.tencent.mobileqq') # 关闭初始化信息中的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.tencent.mobileqq') # 获取当前打开的app的入口名
driver.current_activity # 启动某一个包的,某一个入口
# 参数接受appPackage,appActivity
# 可以省略多个步骤直接到达某个入口,即指定测试的位置,可以通过driver.current_activity获取
driver.start_activity('com.tencent.mobileqq','.activity.RegisterPhoneNumActivity')
# 还可以关闭初始化app后打开另外一个app
driver.close_app()
driver.start_activity('com.android.browser', '.BrowserActivity') # 每隔0.5秒判断一次当前的app名称是否是activityName,5秒后超时
# WebDriverWait
driver.wait_activity('activityName', 5, 0.5) # 将启动的app退出到后台,多少秒后在切回app
driver.background_app('m') # 清除应用数据缓存,相当于卸载重装
driver.reset()

 滑动、拖拽及多点触控操作

 from appium import webdriver
# 存放连接手机app初始化的一些信息
desc = {}
# 手机唯一标识:通过(adb devices命令查看)
desc['deviceName'] = 'emulator-5554'
# 手机上操作系统版本
desc['platformVersion'] = '5.1.1'
# 测试手机的系统
desc['platformName'] = 'Android'
# 包名:通过(aapt dump badging apk全路径)获取
# package: name='com.tencent.mobileqq'
desc['appPackage'] = 'com.android.settings'
# 入口:通过(aapt dump badging apk全路径)获取
# launchable-activity: name='com.tencent.mobileqq.activity.SplashActivity'
desc['appActivity'] = '.Settings'
# appium的输入法,支持中文
desc["unicodeKeyboard"] = "True"
# 程序结束之后重置输入法
desc["resetKeyboard"] = "True"
# 不初始化app(不会清除app的数据包括缓存数据)
desc["noReset"] = "True"
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desc) # 滚动处理
# 底层通过action操作,origin_el为目标元素,destination_el为起始元素
# 通过模拟手势可以看出 从下面的元素移动到上面的元素
# action.press(origin_el).move_to(destination_el).release().perform()
# driver.scroll(origin_el, destination_el)
origin_el = driver.find_element_by_xpath("//android.widget.TextView[@text='蓝牙']")
destination_el = driver.find_element_by_xpath("//android.widget.TextView[@text='提示音和通知']")
driver.scroll(origin_el,destination_el) # 通过坐标实现滑屏操作
# 从手机的左上角开始,横坐标为x轴,纵坐标为y
# 分辨率不同,坐标不相同,所以需要根据屏幕的大小做比例运算
# driver.swipe(start_x,start_y,end_x,end_y,duration=None)
size = driver.get_window_size() # 获取手机大小即分辨率,返回的是一个字典
# {'width': 1080, 'height': 1920}
height = size.get('height')
width = size.get('width')
# 以左上角为基准,x轴往下,y轴往右
# 通过百分比的方式定位起始位置和结束位置
# 起始位置
start_x = width * 0.5
start_y = height * 0.99
# 结束位置
end_x = width * 0.5
end_y = height * 0.2
# 滑动滚动条
driver.swipe(start_x,start_y,end_x,end_y,500) # 拖拽
# origin_el源元素,destination_el目标元素
# 通过long_press实现
# action.long_press(origin_el).move_to(destination_el).release().perform()
driver.drag_and_drop(origin_el,destination_el) # 多点触控 模拟手指点击
# tap模拟按住坐标多少秒,[(x,y)] 多个坐标则写多个元祖。第二个参数为按住多长时间。单位为毫秒(ms)
driver.tap([(100,20),(100,60),(100,100)],500)

NATIVE_APP 与 WEBVIEW 上下文操作

 from appium import webdriver
import time
# 存放连接手机app初始化的一些信息
desc = {}
# 手机唯一标识:通过(adb devices命令查看)
desc['deviceName'] = 'emulator-5554'
# 手机上Android版本
desc['platformVersion'] = '5.1.1'
# 测试手机的系统
desc['platformName'] = 'Android'
# 包名:通过(adb logcat | findstr /i start)获取
# Start proc 24263:com.android.browser/u0a11 for activity com.android.browser/.BrowserActivity
desc['appPackage'] = 'com.android.browser'
# 入口:通过(adb logcat | findstr /i start)获取
# Start proc 24263:com.android.browser/u0a11 for activity com.android.browser/.BrowserActivity
desc['appActivity'] = '.BrowserActivity'
# appium的输入法,支持中文
desc["unicodeKeyboard"] = "True"
# 程序结束之后重置输入法
desc["resetKeyboard"] = "True"
# 不初始化app(不会清除app的数据包括缓存数据)
desc["noReset"] = "True"
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desc) # 定位url输入框
element = driver.find_element_by_id('com.android.browser:id/url')
# 输入新网址
driver.set_value(element,'http://ui.imdsx.cn/uitester/')
time.sleep(2)
# keycode:Android按键码,66代表回车键
driver.press_keycode(66)
time.sleep(2) # 获取app的所有类型,有WEBVIEW的则以list的形式展示两个
print(driver.contexts)
# 获取当前session中的app类型
print(driver.current_context) # 切换前为原生app:NATIVE_APP
# 从原生app切换到H5
driver.switch_to.context(driver.contexts[1])
# 定位id为i1的元素
driver.find_element_by_css_selector('#i1').send_keys('大师兄')
# 获取切换后的app类型
print(driver.current_context) # 切换后为H5app:WEBVIEW_com.android.browser
# 再从H5切换回原生app
driver.switch_to.context(driver.contexts[0])

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. web端自动化——selenium3用法详解

    selenium中文学习文档链接:https://selenium-python-zh.readthedocs.io/en/latest/getting-started.html selenium3+ ...

  3. centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解

    centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...

  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. ConditionalOnProperty的使用

    时间  2018-02-23 标签 ConditionalOnPropert SpringBoot 栏目 Spring 原文   http://blog.csdn.net/u010002184/art ...

  2. 负载均衡实现,一个域名对应多个IP地址【转载】

    使用负载均衡实现,传统和常规做法,其他方式需要特殊处理.(dns轮询,或者自己做解析)1.一个域名设定多个dns服务或者服务器进行解析,同一个域名的每个解析都指向不同的ip地址,这样应答快的dns优先 ...

  3. PHP中替换换行符的几种方法

    PHP中替换换行的几种方法 参考脚本之家的文章:<PHP中替换换行符的几种方法小结>. 代码: 方法一: $replace_str = str_replace(array("\r ...

  4. git初始化命令行指引

    Git 全局设置 git config --global user.name "陈耿聪" git config --global user.email "swain@di ...

  5. 【HDU4003】Find Metal Mineral

    题目大意:给定一棵 N 个节点的有根树,边有边权,在根结点处有 K 个人,这些人会遍历树上的所有边,求如何遍历才能使得所有人走过路径的边权和最小. 题解: 引理:对于一棵子树来说,若存在 M>0 ...

  6. event对象中offsetX,clientX,pageX,screenX的区别

    1.offsetXoffset意为偏移量,是事件对象距左上角为参考原点的距离.以元素盒子模型的内容区域的左上角为参考点.不包括border.2.clientX事件对象相对于浏览器窗口可视区域的X,Y坐 ...

  7. websocket和通信

    最近默默的在学websocket,推荐的当然是阮一峰的博客了,其中也学到了不少  可以去看看咯 http://www.ruanyifeng.com/blog/2017/05/websocket.htm ...

  8. golang初识 和 变量,常量,iota

    目录 一.go语言与python 1. go语言 2. python 二.变量相关 1. go语言的基本语法 2. 标识符和关键字 3. 变量声明 (1)声明变量时未指定初始值 (2)声明变量时指定初 ...

  9. 微信公众号发送告警Python脚本

    调用该脚本,可以向微信公众号发生告警. #!/bin/env python #coding:utf-8 #Author: Hogan #Descript : 微信公众号发送告警脚本 import ur ...

  10. 为什么second是秒也是第二?

    起源 早期在西方,一小时分为 60 分钟.后来,科学发达了.文明进步了,人们认为一分钟太粗放了.必须划分得更细致,于是就把一分钟划分成 60 等分.由于是对时间的第二次划分,就将新的 60 等分的“单 ...