python启动手机相机


获取设备名称

通过adb命令”adb devices“获取设备信息

def getuuid():
    # shell命令内容
    cmd = "adb devices"
    # 创建一个shell命令的线程
    with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) as p1:
        p1.wait()   # 等待子进程终止
        data = p1.stdout.read().decode('utf-8') # 进程的输出内容
        datas = data.strip("List of devices attached").split("\r\n")    # strip去掉开头的字符,split分隔成列表
        arr = []    # 创建一个空列表用于存放设备的名称
        for s in datas:
            if s is not None and s.strip().endswith('device'):  # 列表中不为空的字符串
                arr.append(s.split("\t")[0])    # 字符串内容分隔后,去第一个值
        if len(arr) == 0:   # 获取设备名称失败
            print('no devices')
            exit(-1)
        return arr  # 返回获得的设备名称,列表类型

定义端口号  

可能是多太设备同时进行测试 所以我们可以创建一个数量相同于设备列表的列表

def port():
    port = []
    for s in range(len(uuid)):
        l = 4723 + s * 2  # 4723是appium默认的端口号
        port.append(l)
    return port

杀死node服务

为了防止我们在多次运行过程中出问题,我们在每次启动的时候都关闭一下之前的进程

node是appium的运行环境,杀死这个程序就可以保证appium程序关闭了

def kill_server():  # 结束node服务
    server_list = os.popen('tasklist | find "node.exe"').readlines()    # 获取当前的node是否在运行中
    if len(server_list) > 0:
        os.system("taskkill -F -PID node.exe")  # 运行状态就停止node

启动appium服务方法

def start_appium_server(j): # 启动appium服务,并设置每个设备的端口号和对应的设备名
    os.system("appium -a 127.0.0.1 -p {} -U {} --session-override".format(port[j], uuid[j]))

尝试着启动吧。线程这个库我会另外写一个文档,我被这个东西困了两天,哭了

if __name__ == '__main__':
    uuid = getuuid()    # 获取设备号成列表
    port = port()   # 设置端口号成列表
    kill_server()   # 杀死node进程
    for j in range(len(uuid)):  # 运行所有接入的的设备对应端口
        th = threading.Thread(target=start_appium_server, args=(0, ))   # 调用的方法别加括号啊,加了就成了主线程。不会往下运行了
        th.start()  # 启用线程
    time.sleep(10)

  运行结果如下:

 这个线程是一直启动着的,所以需要我们手动结束代码。

启用相机

设置一个方法来存放我们的参数

def cap(uuid):
    # 设置传入方法的参数
    capabilities = {
        'newCommandTimeout': '5000',  # 等待新命令的最长时间,超时后退出。默认是60s
        'platformName': 'Android',  # 手机类型,ios或android
        'udid': uuid,  # 设备名称
        'deviceName': 'device',  # 好像没啥用
        'platformVersion': '10',  # 系统版本
        'appPackage': 'com.huawei.camera',  # 运行程序包名
        'appActivity': 'com.huawei.camera',  # 运行程序名称com.huawei.camera
        'noReset': 'true',  # 是否清除session信息,不要重置App,如果为False的话,执行完脚本后,app的数据会清空
        'automationName': 'UiAutomator2'  # Appium使用automationName框架为uiautomator2识别元素
    }
    return capabilities

 打开相机吧!

    driver = webdriver.Remote('http://127.0.0.1:{}/wd/hub'.format(port),cap(uuid))  # 打开相机
    time.sleep(10)
    driver.quit()   # 退出相机

  我们的手机设备就会自动打开相机了,不过启动时间有点慢,我觉得应该是启动服务时间太多 并不是我们的代码问题,运行结果如下:

好了,以上就是启动app了。