python+uitomator2之IndexError:list index out of range问题(ATX无法自动启动)

python+uitomator2之IndexError:list index out of range问题

问题产生背景

本人是崭新小白一枚,非计算机、编程专业,纯属个人爱好,如果提问层次太浅请谅解。
-----------------------------分割线---------------------------
因为一些原因,自己做了一个python+uiautormator2+Android的自动化脚本,每天定时启动,干一些重复的事情,前阵子电脑重做了系统后,发现uiautomator2的ATX总是不能自动启动,每次都需要手动开启,在没有值守时,脚本总是不能自动运行。无奈作为小白大胆的打开了uiautormator2源码,查看了错误出处,虽然目前解决的问题(不知道解决方法对不对),但还是不明所以,所以发个帖子求教一下。


Python版本:3.6.8
adb版本:Android Debug Bridge version 1.0.41
Version 29.0.5-5949299
uiautomator2版本:2.5.3(以前用的那个版本也没注意)
android版本:mumu模拟器 android 6.0


错误代码

[I 200123 13:45:36 init:132] uiautomator2 version: 2.5.3
[D 200123 13:45:36 __init__:764] restart-uiautomator since "atx-agent restarted"
[D 200123 13:45:36 __init__:818] Device: Android, 127.0.0.1:7555
[D 200123 13:45:37 __init__:824] stop app: com.github.uiautomator
[D 200123 13:45:37 __init__:828] kill process(ps): uiautomator
Traceback (most recent call last):
  File "F:\Object\PythonObject\UI\ui2-2\test.py", line 3, in <module>
    d = u2.connect()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\uiautomator2\__init__.py", line 124, in connect
    return connect_usb(addr)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\uiautomator2\__init__.py", line 168, in connect_usb
    d._init_atx_agent()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\uiautomator2\__init__.py", line 347, in _init_atx_agent
    self.reset_uiautomator("atx-agent restarted")
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\uiautomator2\__init__.py", line 768, in reset_uiautomator
    ok = self._force_reset_uiautomator_v2()  # uiautomator 2.0
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\uiautomator2\__init__.py", line 829, in _force_reset_uiautomator_v2
    self._kill_process_by_name("uiautomator")
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\uiautomator2\__init__.py", line 683, in _kill_process_by_name
    for p in self._iter_process():
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\uiautomator2\__init__.py", line 1209, in _iter_process
    if fields[0] == "USER":
IndexError: list index out of range
[Finished in 1.4s]

报错的源码

在uiautormator2模块__init__.py里的1194行 _iter_process函数这里报错了。

 def _iter_process(self):
        """
        List processes by cmd:ps

        Returns:
            list of Process(pid, name)
        """
        headers, pids = [], {}
        Header = None
        Process = namedtuple("Process", ["user", "pid", "name"])
        for line in self.shell("ps; ps -A").output.splitlines():
        	# 在这里加了print试了一下
        	print('===line===:%s' % line)
            # USER PID ..... NAME
            fields = line.strip().split()
            if fields[0] == "USER":
                continue
            if not fields[1].isdigit():
                continue
            user, pid, name = fields[0], int(fields[1]), fields[-1]
            if pid in pids:
                continue
            pids[pid] = True
            yield Process(user, pid, name)

输出一下看看

在错误代码加入了print发现,line存在一个空的列表
在这里插入图片描述
所以 if fields[0] == “USER”: 这里报错了,于是在源码上加了一个判断:

def _iter_process(self):
        """
        List processes by cmd:ps

        Returns:
            list of Process(pid, name)
        """
        headers, pids = [], {}
        Header = None
        Process = namedtuple("Process", ["user", "pid", "name"])
        for line in self.shell("ps; ps -A").output.splitlines():
            # USER PID ..... NAME
            fields = line.strip().split()
            # =======这里做个判断========
            if not fields:
                continue
            # ==========================
            if fields[0] == "USER":
                continue
            if not fields[1].isdigit():
                continue
            user, pid, name = fields[0], int(fields[1]), fields[-1]
            if pid in pids:
                continue
            pids[pid] = True
            yield Process(user, pid, name)

嗯,关闭ATX,运行,成功了!这么简单就解决了?不明觉厉了。
虽然成功运行了,但不知道会不会存在未知的BUG,引发了我思考:

1、开发人员在开发时没有预想到会有这个bug,得背锅。
2、我自己的电脑配置上有问题,反复查看了电脑,系统变量,模块安装都是按照以前在网上同一个教程一步一步配置的,除了uiautomator2的版本不能确定。
最终还是认为应该是自己电脑配置上有问题,开发人员那么牛pi,应该不会犯这种错误。

为什么会存在一个空的列表?

在此请高人指点迷津。在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值