测试成长记录: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无法获取设备信息bug记录

 

测试成长记录:python调adb无法获取设备信息bug记录

 

问题分析:

    这让我很是头大,第一次遇到这个问题,我先后尝试过重装python、adb、AndroidSDK,但都没有用,请教过很多人也都说没遇到过,后来又去testhom 和  Stack Overflow去发帖求助,也没找到答案

我试着去查看python 的subprocess.py 的源码,大概情况是这样子:

 (testhome的发帖记录:https://testerhome.com/topics/27741)

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行那块)

 

测试成长记录:python调adb无法获取设备信息bug记录

 

 

  看情况是创建process时失败了,随后猜想可能是被系统拦截了,或者没有权限~~

 

最终结果:

       我找到adb.exe 给它加上了所有的权限,运行仍就失败~不起作用

  后来看到里面有个兼容性的选项,我试着打了√再去运行,~~神奇的事情发生了,竟然就可以了emmmmm

测试成长记录:python调adb无法获取设备信息bug记录

 

 

 

总结:

  至今出现这个问题的原因仍就没搞明白,不知道为什么会出现这个问题,由于能力有限,再往深也查不下去了;但这里肯定是有问题的,因为最初搭建环境的时候adb并没有勾选

兼容模式,执行subprocess.check_output()是可以获取到结果的,但后面突然就拿不到了~~如果有大神知道原因的话可以一起交流一下,我也很想弄明白这到底是什么问题

 

测试成长记录:python调adb无法获取设备信息bug记录

上一篇:jmeter 使用 JDBC Connection Configuration 連接數據庫時提示Cannot create PoolableConnectionFactory (Service Classes not found in oracle.net.ano package)


下一篇:【Oracle】查询某个表被哪些存储过程引用