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,应该不会犯这种错误。