Appium+python之APP自动化三(连接设备)
一、python连接模拟器
使用adb命令可直接连接设备(真机或模拟器),连接设备之后才能控制设备,执行自动化的相关操作,包括做app自动化中的:app的安装,卸载,模拟点击,输入,截图等等操作,此处用到的是python标准库中的os模块
计算机上主流的操作系统有Windows、Unix、Mac OS等,os模块为多操作系统的访问提供了相关功能的支持,涉及对文件相关操作功能的实现,系统访问path路径的操作,shell命令行操作,Linux扩展属性的操作,流程管理,CPU等硬件相关信息的获取,基于操作系统的真正的随机数的操作
import os
class AdbConnect:
def __init__(self, device_name):
self.device_name = device_name
def adb_connect(self): # 连接设备的方法
device = os.popen("adb devices")
device_list = device.read()
# 判断连接设备的名称是否在连接设备列表中
if self.device_name not in device_list:
self.connection_equipment() # 调用连接设备的方法
# print(self.query_device_list())
return self.query_device_list() # 查询连接设备和状态
else:
# print(self.query_device_list())
return self.query_device_list() # 查询连接设备和状态
def query_device_list(self):
device = os.popen("adb devices")
# popen与system可以执行指令,popen可以接受返回对象
device_list = device.read()
# 读取adb devices返回的结果
# print("连接设备列表:\n{}".format(device_list))
# 打印连接设备列表
con_attached_list = device_list[device_list.rfind(self.device_name):-2]
# 从连接设备列表截取连接设备的名称到连接状态这部分的字符串,连接设备列表的字符串最后两行是空所以取-2
dve_len = len(self.device_name)
# 计算连接设备的长度dve_len,根据此长度来确定截取连接状态的位置
dve_ps = con_attached_list.rfind(self.device_name)
# 取出连接设备在连接设备列表的起始位置dve_ps
con_attached = con_attached_list[dve_ps + dve_len + 1:dve_ps + dve_len + 7]
# 截取连接设备的连接状态,从起始位置dve_ps加上连接设备长度dve_len+1(设备名称到状态之间有空格所有+1)
# 从状态开始的位置往后截取6个字符:dve_ps + dve_len + 7,后面只需判断这部分截取的结果是否是device
if self.device_name in con_attached_list and con_attached == 'device':
# 判断连接设备的名称是否在连接设备列表,且状态是否为device
return "adb已连接上设备{}".format(self.device_name)
elif self.device_name in con_attached_list and con_attached != 'device':
return "连接设备的状态异常\n{}".format(con_attached_list)
elif self.device_name not in con_attached_list:
return "未连接该设备,请检查"
else:
return "未知错误"
def connection_equipment(self):
os.system("adb connect {}".format(self.device_name))
# 使用adb connect 连接设备
if __name__ == '__main__':
a = AdbConnect("127.0.0.1:62001")
a.adb_connect()
1. 导入os模块
import os
2. 初始化方法
def __init__(self, device_name):
self.device_name = device_name
初始化时,传入的device_name表示模拟器的名称
self.device_name = device_name
把接收的模拟器名称device_name赋值给了新的变量self.device_name,后面的所有方法中都可以直接调用self.device_name
3. 定义连接设备的方法
def adb_connect(self): # 连接设备的方法
device = os.popen("adb devices")
# popen与system可以执行指令,popen可以接受返回对象
device_list = device.read()
# 把返回的连接设备列表赋值给device_list
# 判断连接设备的名称是否在连接设备列表中
if self.device_name not in device_list:
self.connection_equipment() # 调用连接设备的方法
# print(self.query_device_list())
return self.query_device_list() # 查询连接设备和状态
else:
# print(self.query_device_list())
return self.query_device_list() # 查询连接设备和状态
1)popen和system方法都可以执行指令,popen可以接受返回对象,此处要查看连接设备的列表,把查询到的连接设备结果保存在变量device_list中
2)if判断设备名称是否在连接设备列表中,如果不在就调用连接设备的方法,再查询连接状态是否成功,如果在就直接查询连接设备和状态
4. 定义查询连接设备的列表(可根据连接设备名称查询连接设备的状态)
1)使用popen方法查询连接的设备
device = os.popen("adb devices")
# popen与system可以执行指令,popen可以接受返回对象
popen和system方法都可以执行指令,popen可以接受返回对象,此处要查看连接设备的列表
2)读取返回的连接设备列表
device_list = device.read()
# 读取adb devices返回的结果
用read()方法读取返回的连接设备列表,用来查看设备列表及连接设备状态
3)把连接设备的列表那部分提取出来
con_attached_list = device_list[device_list.rfind(dve_name):-2]
# 从连接设备列表截取连接设备的名称到连接状态这部分的字符串,连接设备列表的字符串最后一行是空所以从-2倒数第二个位置开始
连接的设备部分提取出来的意义用于后面检查连接设备的状态,用到字符串切片的方法,使用device_list.rfind(dve_name)表示在返回的连接设备列表中根据设备名称(模拟器名称)查找设备名称的起始位置,结束部分填写-2(adb devices返回的结果中最后一个字符是空,所以结束位置取到-2就行),得到的结果为下图的127.0.0.1:62001 device部分赋值给con_attached_list
4)获取连接设备在设备列表中的位置和设备名称的长度
dve_len = len(dve_name)
# 计算连接设备的长度dve_len,根据此长度来确定截取连接状态的位置
dve_ps = con_attached_list.rfind(dve_name)
# 取出连接设备在连接设备列表的起始位置dve_ps
① 获取连接设备名称的长度,后面在取此设备的连接状态从长度的后面位置开始取值,此处设备名称127.0.0.1:62001的长度是15;dve_len=15
② 获取连接设备的位置是因为如果连接了多台设备的情况下,起始位置就不是从0开始,为了确保数据正确性,此处设备名称127.0.0.1:62001在连接设备列表127.0.0.1:62001 device中起始位置为0;dve_ps=0
③ 有了连接设备的长度和起始位置,就可以算的出来查询当前设备连接状态在连接设备列表的字符串中的起始位置
5)根据上一步计算出来的设备名称长度和位置取出连接设备状态
con_attached = con_attached_list[dve_ps + dve_len + 1:dve_ps + dve_len + 7]
# 截取连接设备的连接状态,从起始位置dve_ps加上连接设备长度dve_len+1(设备名称到状态之间有空格所有+1)
# 从状态开始的位置往后截取6个字符:dve_ps + dve_len + 7,后面只需判断这部分截取的结果是否是device
① 取连接设备状态的起始位置=dve_ps + dve_len + 1
dve_ps=0,dve_len=15,+1是因为127.0.0.1:62001 device,这个device状态与连接设备的名称之间有一个空格的值
② 取连接设备状态的结束位置=dve_ps + dve_len + 7
+7是因为连接成功的状态device为6个长度,起始位置+1,结束位置就在起始位置的基础上+6,取6位的原因因为后面只需要判断取出来的6位是否为device这个状态就行
6)判断连接设备的列表是否有设备的名称以及状态为device
if self.device_name in con_attached_list and con_attached == 'device':
# 判断连接设备的名称是否在连接设备列表,且状态是否为device
return "adb已连接上设备{}".format(self.device_name)
elif self.device_name in con_attached_list and con_attached != 'device':
return "连接设备的状态异常\n{}".format(con_attached_list)
elif self.device_name not in con_attached_list:
return "未连接该设备,请检查"
else:
return "未知错误"
1)根据连接设备提交的设备名称字段判断连接设备列表中是否有该设备名称,且该设备的连接状态为device表示连接设备的状态为已连接
2)判断连接设备的名称在连接设备列表,但是状态不为device,则返回连接设备状态异常和整个连接设备的列表
3)判断设备名称是否在连接设备状态列表中,不在则返回未连接该设备,请检查
4)除了以上几种情况则返回未知错误
5. 定义连接设备的方法
def connection_equipment(self):
os.system("adb connect {}".format(self.device_name))
# 使用adb connect 连接设备
调用os的system方法执行指令,方法中写adb连接模拟器的命令adb connect 模拟器名:端口号
Appium+python之APP自动化全集
2、Appium+python之APP自动化二(app启动)