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 技術棧