https://developer.android.google.cn/studio/command-line/adb?hl=zh-cn#howadbworks
https://www.rstk.cn/news/18764.html?action=onClick
官网下载:https://www.oracle.com/cn/java/technologies/downloads/
配置路径:系统属性-高级-环境变量-系统变量
夜神、逍遥、雷电、MUMU……
https://www.cnblogs.com/nebie/p/9145627.html
https://www.androiddevtools.cn/#
进入SDK的解压目录下,双击“SDK Manager.exe”打开SDK管理器
在解压完成后,就可以开始配置环境变量了。方法和设置JAVA JDK的环境变量的方法类似。
新建系统变量:
创建ANDROID_HOME,值是你的刚刚SDK的解压目录,比如 E:\Android\android-sdk-windows
编辑系统变量中的Path:
将SDK的platform-tools和tool的路径添加到Path 变量内(这两个目录在你通过SDK Manager安装更新Android SDK Tools和Android SDK Platform-tools之后就会有了)
1 新建 %ANDROID_HOME%\platform-tools
2 新建 %ANDROID_HOME%\tools
用platform-tools文件夹中的adb.exe文件替换掉模拟器安装完成后的以adb.exe结尾的文件
android -h
准备:需要一个安卓手机+usb数据线
1、用数据线把电脑和手机连接起来。Usb插口尽量插在后面的usb口上。
2、如果手机上出现如下图片,点确认
如果没有出现,先进行第三步
3、打开手机设置,找到开发者选项
有些手机需要连续点击自己的版本号,才能出现这个选项,具体根据机型不同有一定变化,可自行百度
5、此时可选择拔掉数据线,重新插拔。看是否出现第二步。
如没有出现则进行重复以上步骤,或者检查数据线,或者检查usb插口。
7、如果此时想在airtest里面控制手机
先点击刷新adb。出现我们的设备信息后,点击connect。注意,正常的状态应该是device状态。
注意:在刷新adb的过程中,可能你的手机上还会出现调试提醒,记得点击同意。
如果一直找不到你的手机设备信息,可以选择重新插usb线。
在连接时可能会出现让你下载两个应用,正常同意安装即可。
一个是键盘插件,一个是框架插件。
Yosemite是输入法软件,如果导致手机无法正常打字,将该软件卸载掉即可,但是在自动化过程中,必须保留该软件。
市场上有大量的模拟器,可以模拟手机,有各种手机可选
appium连接模拟器进行自动化测试时,需要使用adb来连接模拟器,具体操作步骤:
1、打开模拟器
2、在cmd中输入:adb devices
此时出现的列表中找不到对应的安卓设备
3、 在cmd中输入:adb connect 127.0.0.1:7555(7555为模拟器对应的端口号,此处为网易MUMU模拟器)
4、再次输入:adb devices,列表中找到对应模拟器表面连接成功
airtest内置的有adb
1.首先,与手机类似,需要打开模拟器的 开发者选项-允许USB调试 。
部分模拟器可能需要找到 设置-关于手机-版本号 点击多次后才能打开开发者选项:
2.打开AirtestIDE设备窗内的 远程设备连接 ,
输入 adb connect 127.0.0.1:62001 后(该端口号与模拟器品牌相关),点击 连接 按钮
不同模拟器使用不同的端口号:
3.设备列表中可见 127.0.0.1:7555 设备,先点击Connect按钮旁的下拉菜单,勾选Javacap模式后,再点击 Conenct 按钮(如果没有勾选Javacap模式,会导致看到的手机画面是黑屏)。如果还是未能连接成功,可以补充勾选 其他选项再连。
1.连模拟器时,需要先勾选 use javacap 选项后再点击 connect 按钮连接,才能避免看到的屏幕是黑屏。
2.在部分版本的模拟器上,可能勾选了 use javacap 后依然连接失败,此时可以尝试再勾选 use adb orientation 选项后再重新连接即可。
3.部分品牌模拟器,可能出现无法正常点击的现象,可以尝试勾选 use ADBtouch 后再连接。
4.部分品牌模拟器,可能无法调用yosemite输入法,导致 text() 接口无法输入文字,可以先确认模拟器设置中,硬件-物理键盘 是否被勾选了,取消勾选后再重新尝试即可。如果依然无法输入,可以考虑换用poco来输入,或是直接使用adb指令输入英文内容
adb支持usb连接模式和tcpip连接模式,我们可以用tcpip模式通过wifi无线连接adb。
具体连接步骤如下:
1、确认本机PC没有任何adb设备连接,包括模拟器和usb连接
查看当前PC端连接有多少设备:
adb devices命令后,列表显示为空;
2、将远程android设备接入Wi-Fi,并查看其IP地址
查看android设备的IP地址,这里有三种方式查看Android设备IP。
(1). 设置-关于手机-状态信息-IP地址中查看
(2). 设置-WLAN-点击当前链接上的Wi-Fi查看IP
例如:设置—〉无线或网络—〉WLAN设置—〉查看当前连接Wi-Fi的IP地址(部分机型需要按menu键并选择“高级”选项—〉IP地址)
(3). 通过adb命令查看设备IP地址:adb shell netcfg
前提:(设备已经和PC建立了usb连接)
确保电脑和Android设备连接在同一个WIFI网络环境(同一个局域网下,进行通信)
3、本机command命令下执行ping android设备的IP
如果ping成功,说明可以连接
4,执行 adb connect
知道设备IP地址之后,就可以用adb connect命令通过IP和端口号连接adb。
5、执行 adb connect不成功,如下图显示:connect拒绝
用adb tcpip模式重启adb
adb tcpip 5555
连接成功,connected to 10.129.49.143:5555
adb connect ip连接成功以后可以执行原来usb连接时的所有命令
https://github.com/appium/appium-desktop/releases
高版本Appium(1.22.0及以上)的服务和元素查看器分离,还需要下载Appium Inspector。
启动Appium Server GUI后,搜索按钮鼠标悬停会显示inspectorMoved,低版本会直接显示Start Inspector Session
https://github.com/appium/appium-inspector/releases
填写appium:platformName,appium:platformVersion,appium:deviceName等信息。
之后点击save as…进行保存。如果adb连接了模拟器或者真机,也可以点击start session直接运行。
deviceName 连接设备名称
platformName 操作系统名称
platformVersion 操作系统版本
-------和软件相关内容-------:
appPackage 被测试的APP软件包
{
"appium:deviceName": "127.0.0.1:62001",
"platformName": "Android",
"appium:platformVersion": "7.1.2",
"appium:appPackage": "com.tencent.mobileqq",
"appium:appActivity": ".activity.SplashActivity",
"appium:onReset": true
}
python的自动化代码和appium-inspector不能同时执行
通过执行appium-inspector获取定位元素
1、打开模拟器,adb连接成功
2、打开appium-server–>startServer
3、执行代码
from appium import webdriver
from selenium.webdriver.common.by import By
import time
info = {
"appium:deviceName": "127.0.0.1:62025",
"platformName": "Android",
"appium:platformVersion": "7.1.2",
"appium:appPackage": "com.tencent.mobileqq",
"appium:appActivity": ".activity.SplashActivity",
"appium:onReset": True
}
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", info) # 127.0.0.1:本机地址,4723:appium的端口号,/wd/hub:RemotePath固定写法
driver.implicitly_wait(30) # 隐式等待,等待页面元素加载完成
driver.find_element(By.ID, "com.tencent.mobileqq:id/dialogRightBtn").click()
driver.find_element(By.ID, "com.tencent.mobileqq:id/btn_login").click()
driver.find_element(By.XPATH, "//android.widget.EditText[@content-desc=\"请输入QQ号码或手机或邮箱\"]").send_keys("123456")
driver.find_element(By.ID, "com.tencent.mobileqq:id/password").send_keys("123123")
driver.find_element(By.ID, "com.tencent.mobileqq:id/login")
time.sleep(2)
driver.quit()
import subprocess
import os
from numpy import * # 用于取list的平均值
# 方法一:os.system()
# 返回值:返回对应状态码,且状态码只会有0(成功)、1、2。
# 其它说明:os.system()的返回值并不是执行程序的返回结果。而是一个16位的数,它的高位才是返回码。也就是说os.system()执行返回256即 0×0100,返回码应该是其高位0×01即1。所以要获取它的状态码的话,需要通过>>8移位获取。
# def adb_shell(cmd):
# exit_code = os.system(cmd)
# return exit_code>>8
# # # os.system(cmd)命令会直接把结果输出,所以在不对状态码进行分析处理的情况下,一般直接调用即可
# # os.system(cmd)
# # 方法二:os.popen()
# # 返回值:返回脚本命令输出的内容
# # 其它说明:os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被调用。而os.system不同,它只是调用,调用完后自身退出,执行成功直接返回个0。
# def adb_shell(cmd):
# result = os.popen(cmd).read()
# return result
# # 方法三:subprocess.Popen()
# # 返回值:Popen类的构造函数,返回结果为subprocess.Popen对象,脚本命令的执行结果可以通过stdout.read()获取。
# def adb_shell(cmd):
# # 执行cmd命令,如果成功,返回(0, 'xxx');如果失败,返回(1, 'xxx')
# res = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 使用管道
# result = res.stdout.read() # 获取输出结果
# res.wait() # 等待命令执行完成
# res.stdout.close() # 关闭标准输出
# return result
# # 方法四:subprocess.getstatusoutput()
# # 返回值:返回是一个元组,如果成功,返回(0, 'xxx');如果失败,返回(1, 'xxx')
def adb_shell(cmd):
result = subprocess.getstatusoutput(cmd)
return result
# 查看连接的Android设备
cmdDevice = 'adb devices'
returnDevices = adb_shell(cmdDevice)
# print(returnDevices)
# 获取当前打开的最上层软件的activity
cmdStartActivity = 'adb shell dumpsys activity top'
returnStartActivity = adb_shell(cmdStartActivity)[1]
# print(returnStartActivity.split()[3], ": ", returnStartActivity.split()[4])
startActivity = returnStartActivity.split()[4]
# print(startActivity)
# 查看软件启动时间 取平均时间 毫秒
# -S:在启动 activity 前,强行停止目标应用。
# -W:等待启动完成。
cmdStartTime = 'adb shell am start -S -W ' + startActivity
# print(cmdStartTime)
i = 0
startTime = []
while i < 3:
i = i + 1
returnStartTime = adb_shell(cmdStartTime)
# print(returnStartTime)
strStartTime = returnStartTime[1]
# print(type(strStartTime))
listStartTime = strStartTime.split('\n')
for j in listStartTime:
if 'TotalTime' in j:
# print(j)
totalTime = int(j.split('TotalTime: ')[1])
startTime.append(totalTime)
print(startTime)
avgStartTime = mean(startTime)
# startTime.insert(0, avgStartTime)
print('平均启动时间为:', avgStartTime)