移动端自动化==>AppiumApi接口详解
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接口详解的更多相关文章
- 移动端自动化测试-AppiumApi接口详解
Appium 初始化配置信息(Desired Capabilities),Desired Capabilities实际上就是一个字典,它主要用于向Appium Server提供初始化配置参数,如:想要 ...
- web端自动化——selenium3用法详解
selenium中文学习文档链接:https://selenium-python-zh.readthedocs.io/en/latest/getting-started.html selenium3+ ...
- centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解
centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...
- 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. ...
随机推荐
- Java中Collection、Map常用实现类研究分析
接口/实现类 描述 key是否可为null 为null是否报错 key是否重复 key重复是否报错 key是否和添加一致 是否线程安全 List 一组元素的集合 ArrayList 基于数组存储,读取 ...
- 【串线篇】SpringBoot数据访问【数据源/mybatis/指定映射文件位置】
一.配置数据源 1.1.jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...
- ESP8266内置的定时器库--Ticker库
Ticker的功能非常简单,就是规定时间后调用函数 总体上,根据功能可以把方法分为两大类: 定时器管理方法: 定时器启用方法: detach() 停止定时器 active() 定时器是否 ...
- 【NOIP2014模拟8.17】Magical GCD
题目 对于一个由正整数组成的序列, Magical GCD 是指一个区间的长度乘以该区间内所有数字的最大公约数.给你一个序列,求出这个序列最大的 Magical GCD. 分析 根据暴力的思想, \( ...
- SQL结果统计 GROUP BY
在结果几种,使用GROUP BY进行相同项求和的时候SELECT的字段要与GROUP BY后面的一一对应. select M.TIME,M.PRODUCTMODEL,M.PROCESS_PRODUCT ...
- jquery empty选择器 语法
jquery empty选择器 语法 作用::empty 选择器选取空的元素.空元素指的是不包含子元素或文本的元素.直线电机滑台 语法:$(":empty") jquery emp ...
- 【Dart学习】-- Dart之消息循环机制[翻译]
概述 异步任务在Dart中随处可见,例如许多库的方法调用都会返回Future对象来实现异步处理,我们也可以注册Handler来响应一些事件,如:鼠标点击事件,I/O流结束和定时器到期. 这篇文章主要介 ...
- scrapy项目1:爬取某培训机构老师信息(spider类)
1.scrapy爬虫的流程,可简单该括为以下4步: 1).新建项目---->scrapy startproject 项目名称(例如:myspider) >>scrapy.cfg为项目 ...
- 【canvas学习笔记五】使用图片
在canvas里画图有两个步骤: 获得图片源. drawImage()画图. 图片源 canvas支持以下几种图片资源: HTMLImageElement 可以使用Image()方法构造的图片,也可以 ...
- asp.net ajax传递Json给aspx.cs后台 webmethod方法传递json
1.提取一个向后台写入数据的方法 ///向后台cs页面请求数据的方法 function myPost(url,data,func) { $.ajax({ type: "post", ...