Appium+python自动化-启动app

走远了吗. 提交于 2019-12-06 05:34:21

Appium+python自动化-启动app

 

环境已经搭建好了,接下来就是需要启动APP,如何启动app呢?首先要获取包名,然后获取launcherActivity。获取这两个关键东西的方法很多,这里就不一一多说,小伙伴们可以各显神通。小编这里主要给大家推荐一个sdk自带的实用工具aapt. 

 

    aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看apk包名和launcherActivity,当然还有更多的功能,有兴趣的可以查看相关资料。

 

一、下载aapt

    1.在android-sdk里面双击SDK-manager,下载buidl-tools

 

 

 

 

 

    2.勾选build-tools,随便选一个版本,我这里选的是24的版本

 

 

 

 

 

    3.下载完成后,在D:\androidsdk\android-sdk-windows\build-tools\24.0.0目录下找到aapt.exe,将这个路径设置环境变量,添加到path下

 

 

 

 

 

    4.打开cmd。输入aapt出现如下界面,说明环境OK了

 

 

 

二、获取apk包名

    1.将准备测试的APK放到D盘某个目录,如D:\test

 

2.打开cmd,输入指令aapt dump badging D:\test\xxx.apk(APK的全名,如手机淘宝.apk)

 

如果APK名字带有空格,则把路径用双引号括起来。

 

aapt d badging "d:\apktest\QQ 7.1.8.apk"

 

 

 

结果是

 

package: name='com.tencent.mobileqq' versionCode='718' versionName='7.1.8' platformBuildVersionName=''

 

install-location:'auto'

 

sdkVersion:'15'

 

targetSdkVersion:'9'

 

   3.以手机淘宝.apk为例,如下图

 

 

 

    4.这里就可以看到apk的包名:com.taobao.taobao

 

注:老司机可以直接把apk放在桌面上,输入指令后拖到cmd框

 

三、获取launcherActivity

    1.接着上一步操作,cmd屏幕拖到中间找到launcherActivity

 

    2.这里可以看到,淘宝的launcherActivity值为com.taobao.tao.welcome.Welcome

 

 

 

QQ的launchable

 

launchable-activity: name='com.tencent.mobileqq.activity.SplashActivity' label='QQ'

 

四、写脚本

    1platformName:这里是android的apk

 

    2.deviceName:手机设备名称,通过adb devices查看

 

    3.platformVersion:android系统的版本号。见问题解答里的版本对应API。注意要与APPNIUM里的兼容性版本号保持一致。

 

    4.appPackage:apk包名

 

    5.appActivity:apk的launcherActivity

 

 

 

   

 

五、运行appium

    1.启动appium,右上角点三角形按钮,变成正方形,就是启动状态。

 

 

 

    2.确认手机连上电脑

 

 

 

    3.在pycharm运行脚本,随后在手机上会弹出安装下面两个软件的提示,安装后,桌面上多两个图标。那么恭喜你启动成功!

 

 

 

 

 

4.接着会看到淘宝app已经启动啦,有木有小激动~~

 

 

 

运行前,注意事项

先清空appium里的日志内容,点击垃圾箱,重启一下她,点击右上角的方框,让其重启变三角,再变方框。

 

 

2/检查设备连接情况

 

 

3.检查设备里的设置里的系统版本号。

4.在DOS里执行如下两个命令,让其每次都要重新使用

C:\.....>adb uninstall io.appium.unlock

 

返回Success

 

C:\.....>adb uninstall io.appium.settings

 

返回Success

 

 

 

5.版本号一致检查

Android SDK里的版本号获取,APPNIUM里的安卓设置版本号,还有脚本里的平台版本号,需要都保持一致。

 

 

 

   

 

 

 

6.运行appium出错的话,请查看appium技巧与问题集锦文档。

六、最终代码如下

# coding=utf-8

 

from appium import webdriver

 

desired_caps = {

 

                'platformName': 'Android',

 

                'deviceName': '30d4e606',

 

                'platformVersion': '5.0',

 

                # apk包名

 

                'appPackage': 'com.taobao.taobao',

 

                # apk的launcherActivity

 

                'appActivity': 'com.taobao.tao.welcome.Welcome'

 

                }

 

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

 

这个地址是怎么来的呢?

 

 

 

 

 

这一篇主要学会使用aapt工具,然后启动app的一个流程,启动app后,下一步就是要定位元素了,定位元素android sdk里面用一个自带的uiautomatorviewer,appium里面也有一个Inspector,下篇会详细介绍。

 

 

 

QQ的启动,脚本如下

 

# coding=utf-8

 

from appium import webdriver

 

desired_caps = {

 

'platformName': 'Android',

 

'deviceName': 'C4Y5T16C08002942',

 

'platformVersion': '6.0',

 

# apk包名

 

'appPackage': 'com.tencent.mobileqq',

 

# apk的launcherActivity

 

'appActivity': 'com.tencent.mobileqq.activity.SplashActivity'

 

}

 

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

 

八、问题解答

1.Adb deviecs问答

通过DOS命令,执行查看连接手机情况,出现如下异常

 

C:\Users\xu.lei>adb devices

 

List of devices attached

 

adb server version (31) doesn't match this client (39); killing...

 

error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048)

 

 

 

This application has requested the Runtime to terminate it in an unusual way.

 

Please contact the application's support team for more information.

 

could not read ok from ADB Server

 

* failed to start daemon *

 

error: cannot connect to daemon

 

原因分析:

这个是socket 的端口被占用了,我这里是因为360手机助手占用了这个端口,所以其他的就不能够用了。

 

查看端口被谁占用的方法有两个

 

第1个方法是采用DOS命令,

 

netstat –nao

 

第2个方法是windows系统自带的"资源管理器"能查看端口使用情况,具体操作方法如下:

 

(1)如下图红色箭头标记,鼠标右键单击任务栏空白处,在弹出的右键菜单里选择"任务管理器":

 

 

 

(2)如下图红色圆圈标记,在"任务管理器"里,切换到"性能"选项卡,再点击"打开资源管理器":

 

 

 

(3)在"资源管理器"里,点击"网络",在"网络活动的进程"中勾选需要查询的进程,这时最下面一栏"侦听端口"就会显示这个进程(软件)所使用的端口了:

 

 

 

 

 

 

 

解决办法:

卸载了360的手机助手就可以了,

 

首先 打开360安全卫士,点击右下角的 "更多+"-》点击"我的工具"-》点击左下角的"编辑"-》点击"手机助手"上面的X号

 

 

 

这个时候可能会删除不了,那么就要删除手机助手的进程,如图里面的360Mobile。。这些,然后就可以删除了

 

然后再执行adb 命令就可以了

 

 

 

2. adb查看设备的时候,显示 List of devices attached

现象

C:\>adb devices

 

查看设备的时候,显示 List of devices attached

 

 

 

解决方法:

到设备管理器查看驱动是否安装成功。

查看这些驱动程序,有没有手机驱动或者说有个带黄色叹号的Android标识,如果出现这两种情况那问题就定位在手机驱动程序上了。

解决方案:1.可以安装豌豆荚,它会自动安装手机驱动2.可以自己在网上找一个手机驱动,进行安装—这个是最直接的方法,华为手机就是装了驱动,才显示出来的。3.手机上打开开发者调试模式,可以打开设置—关于—版本号,点击5次,即可打开开发者模式。

 

2、

 

5.运行命令行

 

adb kill-server

 

adb devices

 

即可查看到设备

 

C:\Users\XXXi>adb devices

 

List of devices attached

 

C4Y5T16C08002942 device

 

 

 

 

 

3.

Android 7.0系统的手机无法执行appium脚本的问题

Appium Appium 版本 1.4.16,Android 设备固件 7.x,执行脚本时,报错使用语言:python报错如下:

WebDriverException: Message: A new session could not be created. (Original error: Could not extract PIDs from ps output. PIDS: [], Procs: ["bad pid 'uiautomator'"])

 

这个是因为appium版本1.4.16 使用的 uiatumator1.0不支持的原因导致?如果不升级appium版本,是否有解决方案?

 

解决办法

uiautomator1.0应该是不支持7.0,不升版本就换用uiautomator2.0吧,或者用下面的改脚本的方法使用。

 

解决Android 7.0系统的手机无法执行appium脚本的问题,改问题的具体解决方法如下:

 

找到appium的安装目录下的adb.js文件,windows版本的目录如下:Appium\node_modules\appium\node_modules\appium-adb\lib

2、 打开adb.js,手动修改该文件下的内容,此方法我已经试验成功。

adb.js 中1035 行this.shell("ps '" + name + "'", function (err, stdout) {

对应执行的指令是ps 'uiautomator', Android7不支持这个指令格式,所以执行结果是bad pid 'uiautomator'

目前Appium未对此进行处理,所以需要修改此指令的执行方式

即将

this.shell("ps '" + name + "'", function (err, stdout) {

if (err) return cb(err);

替换成

this.shell_grep("ps", name, function (err, stdout) {

 

if (err) {

 

logger.debug("No matching processes found");

return cb(null, []);

 

}

 

并增加上面用到的shell_grep函数:

ADB.prototype.shell_grep = function (cmd, grep, cb) {

if (cmd.indexOf('"') === -1) {

cmd = '"' + cmd + '"';

}

var execCmd = 'shell ' + cmd + '| grep ' + grep;

this.exec(execCmd, cb);

 

};

 

 

 

 

 

 

 

网上还有如下的修改解决办法:以下我未试验。

ADB.prototype.getPIDsByName = function (name, cb) {

logger.debug("Getting all processes with '" + name + "'");

this.shell("ps '" + name + "'", function (err, stdout) {

if (err) return cb(err);

stdout = stdout.trim();

var procs = [];

var outlines = stdout.split("\n");

outlines.shift(); //在该处添加此行代码

3、重启appium

   

 

 

 

4.安卓版本号与API的对应关系

Android Platform Version与API Level的对应表

 

   

 

Platform Version

 

API Level

 

VERSION_CODE

 

Notes

 

Android 6.0

 

23

 

M

 

Platform Highlights

 

Android 5.1

 

22

 

LOLLIPOP_MR1

 

Platform Highlights

 

Android 5.0

 

21

 

LOLLIPOP

 

Android 4.4W

 

20

 

KITKAT_WATCH

 

KitKat for Wearables Only

 

Android 4.4

 

19

 

KITKAT

 

Platform Highlights

 

Android 4.3

 

18

 

JELLY_BEAN_MR2

 

Platform Highlights

 

Android 4.2, 4.2.2

 

17

 

JELLY_BEAN_MR1

 

Platform Highlights

 

Android 4.1, 4.1.1

 

16

 

JELLY_BEAN

 

Platform Highlights

 

Android 4.0.3, 4.0.4

 

15

 

ICE_CREAM_SANDWICH_MR1

 

Platform Highlights

 

Android 4.0, 4.0.1, 4.0.2

 

14

 

ICE_CREAM_SANDWICH

 

Android 3.2

 

13

 

HONEYCOMB_MR2

 

  

 

Android 3.1.x

 

12

 

HONEYCOMB_MR1

 

Platform Highlights

 

Android 3.0.x

 

11

 

HONEYCOMB

 

Platform Highlights

 

Android 2.3.4

Android 2.3.3

 

10

 

GINGERBREAD_MR1

 

Platform Highlights

 

Android 2.3.2 Android 2.3.1

Android 2.3

 

9

 

GINGERBREAD

 

Android 2.2.x

 

8

 

FROYO

 

Platform Highlights

 

Android 2.1.x

 

7

 

ECLAIR_MR1

 

Platform Highlights

 

Android 2.0.1

 

6

 

ECLAIR_0_1

 

Android 2.0

 

5

 

ECLAIR

 

Android 1.6

 

4

 

DONUT

 

Platform Highlights

 

Android 1.5

 

3

 

CUPCAKE

 

Platform Highlights

 

Android 1.1

 

2

 

BASE_1_1

 

  

 

Android 1.0

 

1

 

BASE

 

  

 

 

 

 

 

我们在项目开发过程中,常常需要查看API Level和sdk版本,来进行一些方法的调用,有时候还需知道对应发布的时间,可以来了解我们最低兼容到的版本是什么时候发布的。

 

在这里贴出来方便以后查看:

 

https://developer.android.com/guide/topics/manifest/uses-sdk-element.html

Android version history

Platform Version

 

API Level

 

VERSION_CODE

 

Issue Date

 

Android 1.0

 

1

 

发条机器人

 

2008-09

 

Android 1.1

 

2

 

Petit Four 花式小蛋糕

 

2009-02

 

Android 1.5

 

3

 

Cupcake 纸杯蛋糕

 

2009-04

 

Android 1.6

 

4

 

Donut 甜甜圈

 

2009-09

 

Android 2.0

 

5

 

Éclair 松饼

 

2009-10

 

Android 2.0.1

 

6

 

Éclair 松饼

 

2009-10

 

Android 2.1

 

7

 

Éclair 松饼

 

2009-10

 

Android 2.2-2.2.3

 

8

 

Froyo 冻酸奶

 

2010-05

 

Android 2.3-2.3.2

 

9

 

Gingerbread 姜饼

 

2010-12

 

Android 2.3.3-2.3.7

 

10

 

Gingerbread 姜饼

 

2010-12

 

Android 3.0

 

11

 

Honeycomb 蜂巢

 

2011-02

 

Android 3.1

 

12

 

Honeycomb 蜂巢

 

2011-02

 

Android 3.2

 

13

 

Honeycomb 蜂巢

 

2011-02

 

Android 4.0-4.0.2

 

14

 

Ice Cream Sandwich 冰激凌三明治

 

2011-10

 

Android 4.0.3-4.0.4

 

15

 

Ice Cream Sandwich 冰激凌三明治

 

2011-10

 

Android 4.1

 

16

 

Jelly Bean 糖豆

 

2012-07

 

Android 4.2

 

17

 

Jelly Bean 糖豆

 

2012-07

 

Android 4.3

 

18

 

Jelly Bean 糖豆

 

2012-07

 

Android 4.4

 

19

 

KitKat 奇巧巧克力棒

 

2013-10

 

Android 4.4W

 

20

 

KitKat with wearable extensions 奇巧巧克力

 

2013-10

 

Android 5.0-5.0.2

 

21

 

Lollipop 棒棒糖

 

2014-11

 

Android 5.1

 

22

 

Lollipop 棒棒糖

 

2014-11

 

Android 6.0-6.1

 

23

 

Marshmallow 棉花糖

 

2015-10

 

Android 7.0

 

24

 

Nougat 牛轧糖

 

2016-08

 

Android 技术栈

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!