测试成长记录:python调adb无法获取设备信息bug记录
背景介绍:
一直在负责公司Android自动化的编写工作,采用的是uiautomator2,需要获取设备id来连接设备,就是 adb devices
问题描述:
之前一直用 subprocess.check_output(['adb','devices']) 来获取返回值,再用正则匹配id出来,但突然有一天 ubprocess.check_output(['adb','devices']) 的返回值变成了空。
而在cmd运行 adb devices 却是正常的,而且 subprocess.check_output(['adb','help'])等命令执行又是正常的,只有执行获取设备信息方面的命令拿不到返回值


问题分析:
这让我很是头大,第一次遇到这个问题,我先后尝试过重装python、adb、AndroidSDK,但都没有用,请教过很多人也都说没遇到过,后来又去testhom 和 Stack Overflow去发帖求助,也没找到答案
我试着去查看python 的subprocess.py 的源码,大概情况是这样子:
subprocess.check_output() 里面调用的是 一个run() 方法
def check_output(*popenargs, timeout=None, **kwargs):
#省略~~~~~~
return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
**kwargs).stdout
而run()方法最终调用的是 Popen()
def run(*popenargs,
input=None, capture_output=False, timeout=None,
check=False, **kwargs):
.......
........
with Popen(*popenargs, **kwargs) as process:
try:
stdout, stderr = process.communicate(input, timeout=timeout)
except TimeoutExpired as exc:
process.kill()
在debug过程中发现在 popen这一步就已经失败了,随后又进入Popen()查看,发现最终是 死在了 Start the process 这里(subprocess 模块,1200行那块)

看情况是创建process时失败了,随后猜想可能是被系统拦截了,或者没有权限~~
最终结果:
我找到adb.exeg 给它加上了所有的权限,运行仍就失败~不起作用
后来看到里面有个兼容性的选项,我试着打了√再去运行,~~神奇的事情发生了,竟然就可以了emmmmm
总结:
至今出现这个问题的原因仍就没搞明白,不知道为什么会出现这个问题,由于能力有限,再往深也查不下去了;但这里肯定是有问题的,因为最初搭建环境的时候adb并没有勾选
兼容模式,执行subprocess.check_output()是可以获取到结果的,但后面突然就拿不到了~~如果有大神知道原因的话可以一起交流一下,我也很想弄明白这到底是什么问题
测试成长记录:python调adb无法获取设备信息bug记录的更多相关文章
- appium自动化测试框架——封装获取设备信息类
在上一节中,我们已经解决了如何在python中执行cmd,并获取执行结果.下面就小小实战一下,获取设备信息. 一.思路 1.windows上获取设备信息的方法 输入dos命令“adb devices” ...
- Android 获取设备信息 异常
/**获取设备信息 * @param c * @return */ public static void setDeviceInfo(Context c,RequestParams params){ ...
- React Native(五)——获取设备信息react-native-device-info
心酸史: 自从接触rn开始后,越来越多的引入第三方组件而开始的配置文件,让自己一再头疼: 明明是按照官方文档一步一步的配置,为什么别人可以做到的自己却屡屡出错,真是哭笑不得--从微信分享react-n ...
- 微信小程序 --- 获取设备信息
获取设备信息: wx.getSystemInfo model:手机型号 pixelRatio:设备像素比 windowWidth:窗口宽度 windowHeight:窗口高度 language:语言 ...
- PhoneGap获取设备信息
一. 获取设备信息的方法列表(如果没有或者检测不出来就显示undefined) 1.device.name 设备名称(一些国产机检测不出来) 2.device.model ...
- 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载五(使用PhoneGap获取设备信息)
除了能够将HTML页面打包成可以直接安装运行的APP外,PhoneGap的一个最大优势在于可以通过JavaScript调用设备来访问设备上的硬件信息,从而实现一些原本只有依靠原生SDK才能够达到的目的 ...
- 微信小程序把玩(三十八)获取设备信息 API
原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...
- python 面向对象编程、获取对象信息
面向对象与面向过程 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0 ...
- JavaWeb学习记录(八)——servlet获取配置信息
jdbc.properties内容如下: jdbcUrl=jdbc\:mysql\://localhost\:3306/animaluser=rootpass=root servlet获取资源信息代码 ...
随机推荐
- 2019 Multi-University Training Contest 1 Path(最短路+最小割)
题意:给你n个点 m条边 现在你能够堵住一些路 问怎样能让花费最少且让1~n走的路比最短路的长度要长 思路:先跑一边最短路 建一个最短路图 然后我们跑一边最大流求一下最小割即可 #include &l ...
- CodeForces 630Q Pyramids(数学公式)
IT City administration has no rest because of the fame of the Pyramids in Egypt. There is a project ...
- Codeforces Round #673 (Div. 2) B. Two Arrays (贪心)
题意:给你一组数\(a\)和一个数\(T\),将这组数分为两组\(c\)和\(d\),定义\(f(x)\)为数组\(x\)中任意两个不同元素的和为\(T\)的个数,问为了使\(min(f(c)+f(d ...
- Codeforces Round #655 (Div. 2) A. Omkar and Completion (构造)
题意:构造一个长度为\(n\)的序列,要求所有元素总和不大于\(1000\),并且任意两项的和不等于另外一项. 题解:全构造\(1\)就好了. 代码: int t; int n; int main() ...
- 实战交付一套dubbo微服务到k8s集群(2)之Jenkins部署
Jenkins官网:https://www.jenkins.io/zh/ Jenkins 2.190.3 镜像地址:docker pull jenkins/jenkins:2.190.3 1.下载Je ...
- 编译安装MySQL 5.5.33
环境要求: 主机名 IP地址 需要软件及版本 系统版本 mysql.mfyxw.com 192.168.80.135 Mysql5.5.33 5.5.33 1.设定主机名 hostnamectl se ...
- sizeof和strlen在string类中的使用
字符串的sizeof和strlen 考虑下面的问题: char a[] = "abcdef"; char b[20] = "abcdef"; string s ...
- sscanf的最基础用法(非原创)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int main(){ 6 ch ...
- 计蒜客 第四场 C 商汤科技的行人检测(中等)平面几何好题
商汤科技近日推出的 SenseVideo 能够对视频监控中的对象进行识别与分析,包括行人检测等.在行人检测问题中,最重要的就是对行人移动的检测.由于往往是在视频监控数据中检测行人,我们将图像上的行人抽 ...
- Fetch API & cancel duplicate API & cache API
Fetch API & cancel duplicate API & cache API const usersCache = new Map<string, User>( ...