ADB使用总结(二):模拟用户手势实现自动化测试【多线程版】
前段时间写了如何用adb的调试命令+PowerShell实现自动化测试的例子(ADB使用总结(一):模拟用户手势实现自动化测试),没想到意外的小火了一把。很多小伙伴也私信我能不能多个手机一起运行,毕竟多线程运行才是真实场景。
这不正好前端时间家里领导换手机了,本着废物利用的原则,研究一下怎么把闲置的这台手机运行一个多机测试版。
目录
1. 准备
本人用了两台手机,一台OPPO,一台小米,没办法性价比在那里。
2. 设置手机
检查手机的调试模式是否开启。针对小米手机的检查和开启方法如下:
进入设置->更多设置

看是否有开发者选项,如下:

如果有那么恭喜你已经开启。
如果没有,那么按照下面的方法开启开发者模式:
进入 设置->我的设备->全部参数->(连续点击5次)MIUI版本



好了开启了开发者模式。进入开发者选项再做一点点设置即可。
进入设置->更多设置->开发者选项 打开USB调试和USB调试(安全设置)

如果不设置 USB调试(安全设置)在运行ADB命令的时候可能会出现下面的错误:

然后用USB线连接电脑,选仅充电就行了。第一次打开调试选项连接电脑的时候可能会弹出确认框,确认是否允许调试。点确认就行了。OK手机的准备工作就完成了。至于电脑端的设置可以参考我前一篇博文:ADB使用总结(一):模拟用户手势实现自动化测试
3. 修改之前命令
好了一切都设置好,把两个手机同时连上电脑,见证奇迹的时刻到了。先看一下连接的设备是否都好了,如下所示:
adb devices
List of devices attached
7d2a68900412 device
b0411dd1 device
如果有任何设备显示Unauthorized那就是连上电脑之后没有确认允许调试,把手机拔了重新接上电脑 ,弹出确认框时点确认就可以了。直到状态变成上面的样子,前面的编号是手机的ID,一会儿后面要用到。
然后把之前的命令稍稍改一下:
adb -s 7d2a68900412 input swipe 300 600 300 100
# -s 7d2a68900412 就是指定在那一台设备上运行命令。
# 再试试另外一台设备有没有正常的滑动
adb -s b0411dd1 input swipe 300 600 300 100
4. 两个手机同时运行
由于要支持多设备,所以增加一个方法获取所有Device:
function GetDevices {
$deviceList=@()
((adb devices)).Split(@('`r','`n'),[System.StringSplitOptions]::RemoveEmptyEntries) | %{
if ($_ -ne "List of devices attached" -and $_.EndsWith('device',[System.StringComparison]::OrdinalIgnoreCase)) {
$_ -match "^[\w\d]+" | Out-Null
$deviceList += $Matches.Values[0]
}
}
Write-Output $deviceList;
}
#调用该方法来获取所有的DeviceID,如果没有获取到可用的设备则抛错误
$device=GetDevices
if ($device -eq $null -or $device.count -eq 0) {
throw "没有找到任何已经连接的手机。请确保你的手机已经授权当前设备进行调试"
}
然后把正真测试过程变成多线程,每个线程负责一部手机:
$jobs=@()
$device | %{
$jobs += Start-Job -ScriptBlock {
param($DeviceId, $VideoCount)
$index=1
do {
adb.exe -s $DeviceId shell input swipe (Get-Random -Minimum 200 -Maximum 300) (Get-Random -Minimum 500 -Maximum 600) (Get-Random -Minimum 200 -Maximum 300) (Get-Random -Minimum 80 -Maximum 120)
$sleep=(Get-Random -Minimum 5 -Maximum 40)
if($VideoCount -gt 0)
{
if ($($VideoCount -1) -gt 0) {
Write-Host "[手机-$DeviceId] 运行第 $index 次,剩余 $($VideoCount -1) 次, 距离下次运行还有 $sleep 秒"
Start-Sleep -Seconds $sleep
}
else {
Write-Host "[手机-$DeviceId] 运行第 $index 次,剩余 $($VideoCount -1) 次"
}
}
$index++
} while (--$VideoCount -gt 0)
} -ArgumentList $_,$count
}
然后使用Receive-Job来接收所有的结果和等待结束
$jobs | Receive-Job -Wait -AutoRemoveJob
哈哈运行起来了

5. 总结(注意事项)
本示例仅供学习使用,请勿用于其它用途,否则后果自负。
PowerShell 系列文章
1. ADB使用总结(一):模拟用户手势实现自动化测试
2. Powershell:使用PSCustomObject,序列化执行结果
3. PowerShell: 为啥大神们的PowerShell窗口还有智能提示?因为他设置了这个
4. PowerShell: 远程管理除了知道Invoke-Command,还应该掌握Enter-PSSession这个命令
5. PowerShell: RDP管理服务器效率低下,使用invoke-command同时维护多台服务器不再难
6. PowerShell:用原生PowerShell就能解决访问web资源时的ADFS认证问题
7. PowerShell:不需要学Python,使用powershell也能处理Excel提高办公效率
8. PowerShell:作为一个PowerShell菜鸟,如何快速入门?掌握这些就够了