【获取手机的udid】
首先使用python中的模块pymobiledevice3,
import pymobiledevice3
在该模块中可以继续引用,例如,usbmux,
import pymobiledevice3.usbmux
使用pymobiledevice3.usbmux.list_devices()方法可以获取数据:
[MuxDevice(devid=66, serial='00008020-001828440A69002E', connection_type='USB'), MuxDevice(devid=65, serial='00008020-001828440A69002E', connection_type='Network'), MuxDevice(devid=57, serial='f89d929e8c45a81c0fe2d22f80c1a36e227e90ef', connection_type='Network'), MuxDevice(devid=49, serial='f89d929e8c45a81c0fe2d22f80c1a36e227e90ef', connection_type='USB')]
手机多的话不知道哪个对应哪个手机对应哪个udid,因为返回的数据里面没有手机名字字段,不太方便。
然后使用libimobiledevice,libimobiledevice 是一个 C 库,通常需要通过绑定库来与 Python 进行交互。由于目前并没有官方的 Python 绑定库,所以使用 subprocess 来调用 libimobiledevice:
def get_device_udid_through_libimobiledevice():
try:
result = subprocess.run('ideviceinfo -k DeviceName && ideviceinfo -k UniqueDeviceID', shell=True, stdout=subprocess.PIPE, text=True)
if result.returncode == 0:
return result.stdout
except Exception as e:
print(f"出错了{e}")
return None
得到的结果是:
iPhone123
f89d12348c45a8156782d22f80c1a36e12349012
目前看满足需求,但当我连接两个手机时,问题来了,只显示或者说只获得了最后连接到电脑的手机的信息,尝试多次都是这样。
之后尝试使用subprocess调用pymobiledevice3:
def get_device_udid_through_pymobiledevice3(device_name, connect_type):
"""
:param device_name: 设备名称,例如,iPhonexxx
:param connect_type:连接类型,例如,USB
:return:获取对应设备的udid
"""
try:
result = subprocess.run(['pymobiledevice3', 'usbmux', 'list'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
devices = json.loads(result.stdout)
device_udid = None
for device in devices:
if device['DeviceName'] == device_name and device['ConnectionType'] == connect_type:
device_udid = device['UniqueDeviceID']
break
return device_udid
except Exception as e:
print(f"出错了:{e}")
return None
分别指定不同设备的名字都可以返回对应设备的udid,符合要求。
【总结】
如果只跑一个手机的自动化,需要获取udid,可以使用libimobiledevice,执行速度快,可以很快返回结果;如果跑多个手机的自动化,需要获取udid,建议使用pymobiledevice3,可以满足需求,缺点是速度较慢,返回结果需要几秒钟。