Linux 解决自动化测试设备掉线:Python 方案

codeskyblue · 发布于 2017年07月02日 · 最后由 yoegg 回复于 2017年07月25日 · 1595 次阅读
本帖已被设为精华帖!

起源

看了原文 解决设备掉线问题:软件方案激动不已。
以前每次都要跑过去插拔手机,现在在键盘上敲一个命令就搞定了。

那篇文章还有一个问题没有解决,就是如何根据设备的Serial去重置设备?
因为对Python比较熟悉,查找了下libusb相关的库,顺利找到一个看样子很鲁棒的库 https://walac.github.io/pyusb/

使用方法

Linux需要运行在Root权限下

# 列出所有设备
$ python adbusb.py list
bf755cab    Android
3f980000.usb    DWC OTG Controller
# 重置设备bf755cab的USB连接
$ python adbusb.py reset bf755cab

# 只填写前缀也可以
$ python adbusb.py reset bf

安装

$ pip install --pre pyusb
$ pip install fire # 命令行解析,用于下面的脚本

Mac系统还需要安装brew install libusb, Linux貌似自己就支持,反正我没装什么别的依赖

代码是针对python2写的,如需兼容py3,需要自行修改

将下面的文件保存成 adbusb.py

#!/usr/bin/env python
# coding: utf-8
#

import usb
import fire


class AdbUSB(object):
    def list(self):
        for d in usb.core.find(find_all=True):
            if d.serial_number:
                print '%s\t%s' %(d.serial_number, d.product)

    def reset(self, serial):
        devices = {}
        for d in usb.core.find(find_all=True):
            if d.serial_number:
                devices[d.serial_number] = d

        ok_serials = []
        for sn in devices.keys():
            if sn.startswith(str(serial)):
                ok_serials.append(sn)

        if len(ok_serials) == 1:
            serial = ok_serials[0]
            d = devices.get(serial)
            try:
                d.reset()
            except usb.core.USBError:
                pass
        elif len(ok_serials) == 0:
            print 'No device serial number is', serial
        else:
            print 'Too many device matched', serial


if __name__ == '__main__':
    fire.Fire(AdbUSB)
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 9 条回复
104 seveniruby 将本帖设为了精华贴 07月03日 05:51
14017

python3.0老提示 core.fire这个有问题
File "E:\Python36\lib\site-packages\fire\core.py", line 120, in Fire
component_trace = _Fire(component, args, context, name)
File "E:\Python36\lib\site-packages\fire\core.py", line 358, in _Fire
component, remaining_args)
File "E:\Python36\lib\site-packages\fire\core.py", line 561, in _CallCallable
result = fn(*varargs, **kwargs)

9746
14017727269680 回复

可以自己用argpaser改写下就好了

9746

楼主是在os x下测试的?刚在ubuntu上测试了下,报以下错误:
Traceback (most recent call last):
File "adb_usb.py", line 40, in
fire.Fire(AdbUSB)
File "/home/tester/.local/lib/python2.7/site-packages/fire/core.py", line 120, in Fire
component_trace = _Fire(component, args, context, name)
File "/home/tester/.local/lib/python2.7/site-packages/fire/core.py", line 358, in _Fire
component, remaining_args)
File "/home/tester/.local/lib/python2.7/site-packages/fire/core.py", line 561, in _CallCallable
result = fn(*varargs, **kwargs)
File "adb_usb.py", line 12, in list
if d.serial_number:
File "/home/tester/.local/lib/python2.7/site-packages/usb/core.py", line 830, in serial_number
self._serial_number = util.get_string(self, self.iSerialNumber)
File "/home/tester/.local/lib/python2.7/site-packages/usb/util.py", line 314, in get_string
raise ValueError("The device has no langid")
ValueError: The device has no langid

6853
9746yoegg 回复

用root就不会报错了

7楼 已删除
504

什么原理?

6853
504dengwei729 回复

该怎么解释呢

Bdc231

手机长时间连接后,device找不到设备了。怎么处理呢?

9746
6853codeskyblue 回复

ioctl

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册