Appium Appium Python 自动获取 Android 设备 id 和包名等信息

Never_More · 2016年11月30日 · 最后由 空心菜 回复于 2018年04月15日 · 4400 次阅读

背景

刚学会使用 Appium,觉得很好用,上手也比较容易,但每次换设备换 APP 测试时要在脚本修改很多东西,觉得很麻烦,就想自动获取可以通过指令获得的信息,使用该起来更方便。

最终效果是每次只需要修改测试的包的路径和包名就可以自动删除旧的安装包,并获得 Android 设备 id 和包名等 Appium 需要的信息。

适用于:Mac + Appium(指令启动) + Python + Android

使用到了 aapt,该工具在 SDK/tools 目录下,如果你没有设置环境变量,那需要进入该目录下才能运行 aapt 命令,如果设置了环境变量则可以在任何目录下运行 aapt 命令了。配置 aapt 环境变量的方法:

在当前用户目录下新建.bash_profile 文件,执行以下命令:

vi .bash_profile

设置图片宽度高度

然后保存,输入命令 :wq

最后使命令生效,执行命令 source .bash_profile

代码

# -*- coding: utf-8 -*-

from appium import webdriver

# 使用正则表达式筛选设备 id
import re

# 使用time.sleep(xx)函数进行等待
import time

# 使用 os 模块调用命令
import os

# 测试的包的路径和包名
appLocation = " /Users/Downloads/app.apk "

# 读取设备 id
readDeviceId = list(os.popen('adb devices').readlines())

# 正则表达式匹配出 id 信息
deviceId = re.findall(r'^\w*\b', readDeviceId[1])[0]

# 读取设备系统版本号
deviceAndroidVersion = list(os.popen('adb shell getprop ro.build.version.release').readlines())
deviceVersion = re.findall(r'^\w*\b', deviceAndroidVersion[0])[0]

# 读取 APK 的 package 信息
appPackageAdb = list(os.popen('aapt dump badging ' + appLocation ).readlines())
appPackage = re.findall(r'\'com\w*.*?\'', appPackageAdb[0])[0]

# 删除以前的安装包
os.system('adb uninstall ' + appPackage)


desired_caps = {
    'platformName': 'Android',
    'platformVersion': deviceVersion,
    'deviceName': deviceId,
    'appPackage': appPackage,
    'appWaitPackage': appPackage,
    'app': appLocation,
    'appActivity': appPackage + ".PageSplash",
}

command_executor = "http://localhost:4723/wd/hub"
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 19 条回复 时间 点赞

不错,收藏了

不错,能正确抓取到 devices id,只不过 aapt 这个命令路径有点变态,需要自己手动加一下

赞一个

#2 楼 @app_test 忘了这个了,需要配置一下 aapt 的环境变量

已收藏

楼主,我隐约记得指定设备好像是用 “udid”?

#6 楼 @shixue33 uuid 是 iOS 的,iOS 之前看到个方法获得设备 uuid,找不到链接了,大概方法如下:

import commands

uuid = commands.getoutput('idevice_id -l')

wd = webdriver.Remote(
    command_executor='http://127.0.0.1:4723/wd/hub',
    desired_capabilities ={
        'platformName' : 'iOS', 
        'platformVersion' :' 9.3 ',
        'deviceName' : 'iPhone 5s',
        'app':'xxxxxxxxxx',
        'udid': uuid
    })

#7 楼 @Never_More 好像安卓的也是 udid 指定

#7 楼 @Never_More 恩恩,我以前也遇见过指定 Android 的 devicesName 的问题,发现是无效的。后来用 udid 来解决的,楼主可以参考下这个帖子下边的回复https://testerhome.com/topics/2880

#9 楼 @shixue33 为什么不跟我嗯嗯

#8 楼 @mads
#9 楼 @shixue33
我一直没有 uuid,没遇上过问题,就不知道,还以为只有 iOS 需要 uuid

#12 楼 @Never_More ( ⊙ o ⊙ ),你试一下这样。连两台机器,你去指定位于 devices list 中的第二台机器

#13 楼 @shixue33 因为还没到多设备的地步就一直没有多设备同时连接运行过,有时间尝试一下

platformVersion、deviceName 这两个属性在 appium1.4 上跑安卓的时候随便设的。。udid 才是去指定设备的

#15 楼 @neyo 试了一下,好像是这样😂 ,这就很尴尬了啊

#16 楼 @Never_More 😉 没事,帖子还是写的蛮好的!

666 的不行!很喜欢!

问一下,你们能获取到 appPackage?我这边报错。
appPackage = re.findall(r'\'com\w*.*?\'', appPackageAdb[0])[0]
IndexError: list index out of range

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