一、Android模拟器
1.常见Android开发模拟器对比
- Google官方AVD:支持Windows/Linux操作系统,支持QEMU虚拟机,运行速度慢,仅支持ADB方式安装APK,支持的机型多,但调试复杂
- genymotion:支持Windows/Max/Linux操作系统,支持VirtualBox虚拟机,运行速度一般,支持ADB/拖拽方式安装APK,支持的机型少,调试难度一般
- 夜神模拟器:仅支持windows操作系统,支持VirtualBox虚拟机,运行速度快,支持ADB/拖拽方式安装APK,支持的机型少,但调试简单
2.夜神安卓模拟器的安装及介绍
夜神安卓模拟器,是全新一代安卓模拟器,与传统安装模拟器相比,基于安卓5.1.1或者7.1.2两个版本,兼容x86/AMD,在性能、稳定性、兼容性方面存在巨大优势。
下载地址:https://www.yeshen.com/
可通过夜神多开器里添加新的模拟器(安卓5和7两种可选择)
3.安装app的方式有3种:
- 应用中心下载安装,
- 手动下载好apk包,拖拽
- 手动下载好apk包,通过adb命令安装
- 以adb命令安装为例:
- 首先打开一个模拟器
- 将apk包放在adb.exe所在目录,并在该目录下打开cmd,输入adb devices -l查看设备
- adb install apk包名 即可在模拟器上安装app
4.查看模拟器连接设备
- 可通过adb devices进行查看
- 如果先启动了模拟器,而未启动adb服务器,则通过adb devices无法查看到夜神模拟器的连接端口
- 可以先通过任务管理器查找夜神模拟器(noxvmhandle frontend)的PID
- 然后在cmd终端中输入命令: netstat -ano | findstr 'PID'进行查找,第1台开启的为62001,第2台62025,第3台62026
- 通过adb connect ip:port进行连接后,就可以通过adb devices查看所连接的设备了
二、fiddler抓包工具的简单使用:
- 工具栏
- save----可以保存所有的session,比如文件名填test,则会自动保存为test.saz格式
- import ----可以导入其它格式的session,比如wireshark
- export----可以将session导出为其它格式
- 请求前以及响应后断点调试:
- 可以通过命令行,也可以通过图形界面中的(Rules--Automatic Breakpoints--Before Requests或After Response)来设置,但是图形界面设置会拦截所有请求和响应,不推荐,下面以命令行设置为例:
- 请求前:
- bpu 域名,比如bpu https://www.baidu.com/ 会在请求前拦截https://www.baidu.com/这个域名,其他域名的请求不受影响
- bpu 取消拦截
- 举例:命令行输入bpu https://www.baidu.com/,然后访问https://www.baidu.com/,会在这个会话暂停,我们修改请求url和主机Host到www.qq.com,然后点击绿色的run completi,查看浏览器返回的是腾讯新闻首页
- 响应后:
- bpafter 域名
- bpa 取消响应包拦截
- 设置网页重定向:
- 比如修改百度首页中间的那张图片
- 在右侧打开AutoResponder,将图片url写入匹配规则中,或者从左侧session会话中直接拖动进去,然后选中enable rules选项,在下面的下拉选项中选择find a file,就可以自定义响应的图片了,然后save,浏览器清除一下缓存,再次请求百度,中间的图片就会切换掉
- 移动端安装证书以及fiddler设置:
- 1、打开夜神模拟器,点击设置,手机与网络中开启桥接模式,需要安装驱动
- 2、设置中--WLAN--长按wiredssid--修改网络--高级选项中设置代理为手动,然后填入电脑的ip和fiddler的端口号,保存设置
- 3、fiddler中设置Tools--fiddler options--HTTPs--from remote clients only,同时connections中勾选上允许远程连接这个选项。
- 4、浏览器中输入http://fidller的ip和端口,安装证书后,重新打开浏览器,就可以正常访问网页,并且fiddler会抓取到数据包
三、mitmproxy抓包工具的使用
除了和正常的代理一样转发请求,保障客户端和服务端的通信,它还可以载入自定义python脚本。
- 安装:(基于python环境)
- pip3 install mitmproxy
- 查看版本号:mitmdump --version
- 3个组件
- mitmproxy:仅支持linux操作系统
- 终端输入mitmproxy启动,默认监听8080端口,可以通过mitmproxy -p 端口号 指定端口号启动
- 通过键盘上下键选择抓包数据流,回车进入
- tab键切换request和response以及detail
- 按esc,再按q返回到抓包流界面
- 输入z清除所有显示数据包
- 抓包界面底部有一个命令行框,可以输入过滤信息:
- 输入f,会弹出命令提示,然后输入过滤规则
- 过滤规则:
- !(~c 200):过滤出所有状态码不是200的请求
- 再次输入f,然后将过滤规则=后面的部分清除,敲回车,又能显示所有数据包
- ~d baidu.com:会显示所有域名和baidu.com相关的数据包
- ~m post & ~u baidu:显示url中包含baidu的post请求数据包,~m表示方法,~u表示url
- 设置断点拦截
- 数据包列表页面输入字母i,会弹出命令行提示
- 设置断点规则,和过滤规则一样
- ~u baidu.com & ~m get:会拦截url中包含baidu.com的get请求,通过移动端访问baidu,com,终端页面上会显示标红的数据包
- 切换到该数据包,敲回车,会停留在request界面,比如修改请求的url
- 输入e,会弹出一个选择框,比如选择request-headers回车,进入headers界面,比如删除Host,按d键,然后按q键退出,接着按e键进行url的修改,下面会弹出命令输入框,输入https://xw.qq.com,回车,至此我们修改了请求url以及删除了Host,然后按q返回到数据包列表界面,按a进行重新的访问,返回移动端设备,我们发现浏览器url虽然显示的是baidu.com,但是内容却是腾讯新闻,所以该请求已经被我们进行了拦截和修改
- 接着我们修改response
- z键清空页面内容,移动端接着访问baidu,com,linux终端上切换到该数据包敲回车,然后tab键到response,然后按e弹出选择框,选择response-body,然后在弹出的vim编辑器中输入返回的内容,:wq保存退出,然后输入q回退到请求数据包列表,然后输入a继续访问,查看移动设备,浏览器上显示的是我们修改后的内容
- 退出:先输入q,然后输入y
- mitmweb
- 命令行终端直接输入mitmweb启动,会弹出一个网页,显示图形抓包界面,更加方便的查看抓包数据,默认监听8080端口
- mitmdump
- cmd命令行输入mitmdump 启动组件,mitmdump -p 端口号 指定端口启动
- mitmdump -m 文件名 启动抓包工具,并且可以将抓取到的所有数据包写入到指定文件中,该文件在C:\Users\Administrator下
- 与python交互
- 比如 mitmdump -s test.py启动代理服务器,并加载了test.py这个脚本
- test.py文本有特定格式
# coding:utf-8
from mitmproxy import ctx #导入日志模块
#必须是以下格式,函数名request,请求参数必须是flow
def request(flow):
#终端会有不通过的颜色显示
ctx.log.info(str(flow.request.headers)) #白色显示
ctx.log.warn(str(flow.request.headers)) #黄绿色显示
ctx.log.error(str(flow.request.headers)) #红色显示
ctx.log.error(flow.request.url) #如http://httpbin.org/get
ctx.logm.error(flow.request.host) #httpbin.org
ctx.log.error(flow.request.method) #GET
ctx.log.error(flow.request.path) #/get
#response方法中可以获取flow.request中的内容,但request方法中不可以获取flow.response中的内容
def response(flow):
ctx.log.error(flow.request.url) #获取请求url
ctx.log.error(str(flow.response.status_code)) #响应状态码
ctx.log.error(flow.response.text) #响应内容
- 使用代理:
- mitmdump -s python脚本 -p 端口号 --mode=upstream:http://代理ip:port --upstream-auth=用户名:密码
- 也可以通过:flow.server_conn.via = ServerSpec(("http",(ip, port)))
- 静默模式:
- 指定【-q】参数
- 示例+启动命令:
from mitmproxy import http
from mitmproxy.net.server_spec import ServerSpec
def request(flow: http.HTTPFlow):
# 设置ip代理
ip = "117.94.112.33"
port = 60833
address = (ip, port)
flow.server_conn.via = ServerSpec(("http", address))
def response(flow: http.HTTPFlow):
if flow.request.path == "/x/passport-login/oauth2/access_token":
print(flow.response.content)
# mitmdump -s test.py -q -q参数:静默模式启动
# mitmdump -p 8080 -s test.py --set block_global=false --set upstream_cert=false --set connection_strategy=lazy -q
- 然后打开安卓模拟器,访问页面
- 浏览器设置代理:
- 通过Chrome浏览器的switch omega插件新建一个代理情景模式,监听8080端口
- 新打开一个页面,地址栏输入mitm.it,下载安装对应操作平台的证书,密钥栏不需要填写,然后点击将所有的证书都放入下列存储,将证书存储位置选择为受信任的根证书颁发机构
- 移动端设置代理及安装证书
- 夜神模拟器中:设置--WLAN--长按wiredssid--修改网络--高级选项中设置代理为手动,然后填入电脑的ip和mitmproxy的端口号,保存设置
- 在mitmproxy服务器启动的情况下,打开浏览器输入网址mitm.it,选择android版本进行证书的下载及安装,连接不同操作系统中的代理服务器,需要再次安装对应平台的证书
- 第一次安装证书的话,需要设置模拟器锁屏的密码
四、docker的简单使用
- docker和传统虚拟机的对比总结:
- docker容器:启动秒级,硬盘使用一般为MB,性能接近原生,单机支持上千个容器
- 虚拟机:启动分钟级,硬盘使用一般为GB,性能弱于原生,系统支持量一般几十个
- docker容器的优点:
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- docker的安装
- docker for windows ---需要win10专业版以上
- docker toolbox 可以在任何windows版本使用,但是官方已经不支持下载了,所以从网上找别的下载地址,比如:https://dl.pconline.com.cn/download/2347658.html
- 下载安装好以后,打开Docker Quickstart Terminal,经过漫长的等待,然后输入docker version就可以查看版本号以确定是否安装成功
- docker命令
- 按照惯例,先运行下docker run hello-world,会从git hub上pull过来
- docker images 查看当前所有的镜像
- docker ps -a 查看当前所有的容器以及运行状态
- docker run -it ubuntu bash ----- -it表示进入一个交互的ubuntu系统,第一次运行,会从远程下载,退出ubuntu使用命令exit,之后可以再次通过docker run -it ubuntu bash进入ubuntu的交互系统
- docker rmi hello-world --- 删除镜像名,会报错,需要先删除容器id
- docker rm 容器的id,比如:docker rm c75c96b67cce,然后执行:docker rmi hello-world 删除这个镜像
五、Android开发工具环境安装
- 准备工作:
- 安装Java开发环境JDK
- 选择jdk-8u181版本进行安装,创建一个java文件夹,然后在该文件夹内部创建jdk和jre文件夹用作安装目录
- 设置系统环境变量:
- Path末尾添上:%java_home%\bin;%java_home%\jre\bin
- 新建变量:
- JAVA_HOME:D:\Google\chrome\Java\jdk
- ClassPath:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
- 验证java环境变量是否安装和配置成功
- cmd命令行输入java 或者javac或者java -version看是否都能显示一堆有关信息
- 安装Android SDK
- 选择r24.4.1这个版本
- 修改系统环境变量Path
- 末尾添加:;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;
- 新建系统环境变量
- ANDROID_HOME: D:\Google\chrome\Android SDK
- adb工具的使用
adb是一个通用命令行工具,允许与模拟器或者android真机进行通信,如安装和调试应用
adb工具在Android SDK\platform-tools下,因为已经配置过环境变量,可以在cmd命令行直接通过adb命令打开
- 启动adb服务器:
- adb start-server 然后会绑定tcp:5037端口
- 使用adb命令行工具时,需要移动客户端打开开发者模式,并允许usb调试,以夜神模拟器为例:
- 打开设置---关于平板电脑--连续点击版本号,然后返回到设置里,点击开发者选项,然后打开usb调试,然后就可以通过adb命令在模拟器里安装应用和调试应用
- adb使用:
- adb version查看版本号
- adb devices查看当前连接的android设备,如果出现错误,就需要进行夜神模拟器中adb工具版本的升级。
- 可以同步Android SDK中的adb到夜神模拟器中(将adb.exe以及两个dll文件复制到夜神模拟器安装目录下替换自带的adb,记得先备份,然后将nox_adb.exe改名备份,然后将adb.exe复制一份,改名nox_adb.exe,这样就完成了夜神模拟器中adb工具版本的升级)
- adb devices如果不显示,可以adb connect 指定设备名称 进行连接
- adb -s 指定设备名称 shell 进入手机底层操作系统
- 修改连接模式(由USB模式转为tcpip):
- adb -s 127.0.0.1:62001 tcpip 6666
- 安装应用:
- adb -s 指定设备名称 install apk文件名 安装app应用,可以通过拖动apk包到cmd命令行的方式获取完整路径及文件名
- 卸载应用:(需要知道包名)
- 首先进入手机操作系统:adb -s 指定设备名称 shell,然后cd /data/app,就能查看安装的第三方应用,-数字前面的部分就是包名,注意和文件名有所区分,然后退出 exit
- 接着adb -s 指定设备名称 uninstall 包名 进行卸载
- 如何查看系统的安装包名?
- adb shell pm list package
- PC端和模拟器之间文件传输:
- adb push PC端文件路径(可通过拖拽到命令行的方式) 模拟器上的文件位置(比如/sdcard)
- adb pull 模拟器上的文件路径 pc端存储位置
- adb shell screencap 截图存储路径 -----通过adb命令来操作模拟器进行截屏,比如 adb shell screencap /sdcard/test.png
- uiautomator工具的使用
- 什么是uiautomator?
- 就是用来做UI测试的,就是普通的手工测试,点击控件元素,看输出结果是否符合预期
- 该工具存在于两个地方:
- Android SDK工具包内
- appium内的inspector中
- 它包含两个组件:
- uiautomatorviewer:一个图形界面工具用来扫描和分析应用的UI控件,存放在tools目录下的批处理文件uiautomatorviewer.bat
- uiautomator:一个测试的Java库,包含了创建UI测试的各种API和执行自动化测试的引擎
- uiatutomatorviewer使用:
- 点击Android SDK tools目录下的批处理文件uiautomatorviewer.bat
- 将第一个弹出的黑框最小化
- 然后我们打开一台模拟器,并打开开发者模式,进行usb调试
- 我们通过模拟器打开一个app,然后点击UI Automator Viewer图形工具左上角第二个绿色按钮(Device Screenshot)获取app中的页面,然后点击页面中的元素,就可以获取元素的一些信息
- 升级uiatutomatorviewer
- 从网上下载升级版的uiatutomatorviewer.jar,替换掉tools\lib下面的uiatutomatorviewer.jar即可,接下来就可以使用xpath了
六、Appium移动端自动化测试工具的使用
- 下载安装appium服务端:https://github.com/appium/appium-desktop/releases/tag/v1.21.0
- 客户端通过pip下载: pip3 install Appium-Python-Client
- appium服务端使用
- 打开appium服务端:默认Host: 0.0.0.0,Port:4723,点击start server开启服务器
- 关闭服务器:点击右上角那个暂停按钮进行关闭
- Advanced按钮点进去,可以进行一些高级设置,一般不做修改或很少修改
- Presets按钮可以进行一些预设
- Inspector组件的使用:
- 开启服务器后,右上角那个放大镜,点击后进入inspector界面,主要使用Automatic Server,通过Desired Capablities来配置Appium会话,告诉Appium服务器想要进行自动化的平台和应用程序。Desired Capablities中是一些键值的设置:
- Android独有的(主要介绍的):
- appPackage:运行的安卓应用的包名
- appActivity:包中所要启动的安卓activity
- appWaitActivity:用于等待启动的安卓activity名称
- IOS独有(主要的):
- bundleID:被测应用的bundle ID,用于在真实设备中启动测试
- udid:设备的唯一编号
- 配置Desired Capablities,通过+添加一个新的键值,中间的那个是类型
- 以考研帮app为例:
- platformName:Android
- platformVersion:7.1.2
- deviceName:127.0.0.1:62001 可通过adb devices命令获取
- appPackage:com.tal.kaoyan
- appActivity:com.tal.kaoyan.ui.activity.SplashActivity
- noReset:true #当前session该app设置不会被重置
- 以抖音app为例:
- platformName:Android
- platformVersion:7.1.2
- deviceName:127.0.0.1:62001
- appPackage:com.ss.android.ugc.aweme
- appActivity:com.ss.android.ugc.aweme.splash.SplashActivity
- noReset:true
- unicodekeyboard:true #可以输入中文
- resetkeyboard:true
- 两种方式获取appPackage和appActivity:
- 1、通过aapt工具来获取:
- 可以通过aapt工具来获取,该工具在Android SDK\build-tools.0.3目录下,也可以将路径添加到环境变量Path中
- aapt dump badging apk的文件名(可以拖动apk文件到命令行) 然后敲回车,可以在后面添上| find 'launchable-activity' 通过管道进行查找定位
- appPackage就是开始的Package
- 下面的launchable-activity就是appActivity
- 2、adb
- adb shell 进入安卓操作系统
- 然后输入命令:logcat | grep cmp= 然后敲回车,然后空几行,之后我们打开模拟器,点击应用,通过命令行就能获取到app包名和activity
- 配置好以后,我们可以点击右下角的save as,输入保存的名字,然后通过界面中Saved Capability Sets可以查看保存过的capability sets,然后点击右下角的start session,会发现安卓模拟器中会打开这个app,同时Appium inspector界面中也已经打开了这个app,通过左上角的select elements按钮可以定位和选取页面上的元素,然后可以对选取的元素进行相应操作,比如右边的tap点击,sendkeys输入文本,clear清空文本,如果页面不能正常显示,可以尝试点击上面的刷新按钮
- 录制功能:
- 点击start session以后,点击上面的start recording(眼睛那个按钮),可以生成每一步操作的代码,一般作为辅助功能,在进行自动化操作的时候使用,平时用得更多的还是uiautomatorviewer