Python+Appium運行簡單的demo,你需要理解Appium運行原理!
堅持原創輸出,點擊藍字關注我吧
作者:清菡
博客:oschina、雲+社區、知乎等各大平台都有。
目錄
- 一、Appium 的理念
- 四個原則
- 1.Web-Selenium 的運行原理
- 2.Appium 運行原理
- 二、Appium 面板
- 三、一段簡單的代碼來打開應用
- 1.前提條件
- 2.怎麼識別 app?
- 3.查看安卓 App 包名的鏈接
- 4.Appium 官網介紹
- 5.為什麼有平台版本號?
- 6.aapt 命令獲取應用包名和入口 activity
- 7.代碼
一、Appium 的理念
四個原則:
-
你沒有必要為了自動化而重新編譯你的應用或者以任何的方式修改它。
-
你不應該被限制在特定的語言或框架上來編寫運行測試。
-
移動端自動化框架在自動化接口方面不應該重新造輪子。
(Appium 中沒必要把 http 通信過程,命令的執行過程以及點擊輸入等公用的操作再寫一遍,Appium 直接繼承 Selenium,把現有的東西全部拿過來)
-
移動端自動化框架應該開源,不但在名義上而且在精神上和實踐上都要實至名歸。
1.Web-Selenium 的運行原理:
通過 Http 通信,沒有改變瀏覽器訪問系統的屬性,只要訪問就可以了。
Appium 做自動化也是如此。
2.Appium 運行原理:
安卓和 Ios 都有自己自帶的自動化測試框架。
因為 Ios 和安卓是不同的語言編寫的,所以用 Appium(Appium 是跨平台跨語言)。
版本不一樣,用的自動化框架也不一樣。自動化框架不一樣,API 接口也不一樣。
Appium server
去跟移動端的東西通信,首先確實是 Ios 還是安卓。即使確認了是安卓,也得確認下是 UiAutomator
的 Api 還是 Instrumentation
的 Api。
一般只支持主流版本,其它版本需要用戶自己支持了。
啟動一個模擬器或者真機就有一套自帶的自動化框架。
Appium 發送命令到手機,手機上有個 Bootstrap 接收命令。Bootstrap 是一個服務:Ip 地址和端口做的一個監聽。
Appium server 啟動後得到代碼發送的命令後,不會直接發給手機。
比如你在安卓 8 的設備上做個什麼操作,打開一個 APP,Appium server 檢查下目前設備上有沒有安卓 8 的。如果有,它就把這個命令發送給手機端。
Bootstrap 得到命令後,在本系統中調用 UIAutomator 提供的 API 去做一些實際的操作。就實現了通過 Python 代碼去驅動移動端做一堆的事情。
Bootstrap.jar
就是利用了 UIAutomator
一個測試類在這個當中寫了 Ip 地址和端口,啟動這個服務就結束了。當然也會傳達命令,調用 UIAutomator 等。
Appium server 是個服務,移動終端上面也放了一個服務。作為服務主要接收別人向我們發送的命令,實際上就是通信。
Appium server 這個中間件支持 Ios、安卓。
移動端不僅有 Web 網頁的操作,還有自己特性的操作。移動端的特點:手指觸屏操作、多點觸控、混合應用。移動端特有的操作,把命令加進來,做一個擴充就好了。
裝了 Appium 沒有裝 Selenium 是肯定會報錯的。因為 Appium 是基於 Selenium 的,Appium 做了些拓展。
很多東西和 Web 自動化,包括從概念上都是一樣的。雖然說,它做了拓展,它也是基於現在的基礎。現在通信原理的基礎上增加了一些原理,增加了一些操作,核心是沒有變的。原因很簡單:大家都是界面操作。本質上是差不多的,就是在不同的平台上來做這些事情。
很多方面基本上都是這種思想來做的。現在開源的東西越來越多,很多實現思想就是這種分層、獨立、兼容很多語言,可以不限定客戶端是誰的。
Appium 本來就是開源的,是 Js 實現的。
以上是 Appium 客戶端的介紹。
二、Appium 面板
高級選項分為 3 大板塊:基本配置-Ios 配置-安卓配置。
日誌文件非常有用,如果你在 App 自動化的過程中遇到了什麼問題報錯了,很多時候都要進入 Appium 的日誌當中來分析的。
這個服務端的日誌,它做的非常的全面。包括 Python 代碼向它發送的請求,以及在它收到請求後做的一系列的處理,到底用的 Adb 還是什麼東西,還是和誰通信等都描述得非常清楚。
所以默認的日誌級別是 debug,把整個過程中做的很多操作全部都打印出來了。
日誌路徑自己配置一個,例如我配置在 D 盤的根目錄下。D://appium.log
這裡有些選項,這些選項什麼都不選的時候,啟動 Server。這樣操作是沒有時間的。
後續運行代碼的時候,面板上的日誌會刷個不停。所以有些日誌要滾動很久才能看到,所以點擊 Get Raw Logs 按鈕。得到一個這樣的文件:
這個文件中有時候很多東西顯示的不對。所以配置一個日誌存放路徑,將日誌輸出到對應的路徑保存就好了。
三、一段簡單的代碼來打開應用
App 自動化最基本的東西:Adb 命令。
Adb 命令是用來調試真機或者模擬器的。adb devices
這條命令識別當前電腦連接的設備(模擬器也能識別)。真機必須開啟 Usb 調試模式,在開發者選項當中勾選 Usb 調試模式。
1.前提條件
- 平台類型
- 平台版本號
- app 包名
- app 入口 activity
- 設備名稱
2.怎麼識別 app?
.apk
的後綴名。
開發把包給你的時候都會先打包成一個 apk,然後你去安裝,安裝後在安卓系統上不再是.apk
,會對它進行解壓。解壓後在特定的系統中特定的目錄下面會有自己的包名。
包名–安卓系統當中的標識(相當於唯一代號)
有相同的包名,就是應用已安裝。卸載的時候能找到這個包名就能卸載,找不到就不能卸載。
模擬器和安卓真機都是基於 Liunx 內核的。在 Liunx 中都是以文件的形式來管理的。各種文件路徑,和 Windows 系統一樣。文件路徑來管理各種內部的數據,包括系統安裝的一些東西。需要熟悉 Liunx 的常用命令。
一般安卓手機都有個系統文件夾。很多產商基於安卓的原生系統做了很多美化工作,所以很多文件目錄會有所改變,每個品牌的手機,文件所放的目錄都不一樣。
3.查看安卓 App 包名的鏈接:
//blog.csdn.net/qq_41282136/article/details/100265002
adb shell pm list packages -3
然後你進自己手機系統文件夾下可以找到對應的包名。
activity 就是頁面,安卓設備上每一個頁面都可以叫做一個 activity,它們的名字都是不一樣的。入口 activity 就是打開這個 app 的時候,默認是進入哪個頁面的,默認是哪個 activity 名稱。
想安裝的時候可以提供 apk 的名字。
4.Appium 官網介紹
//appium.io/docs/cn/about-appium/intro/#appium_1
automationName 是自動化測試的一個引擎。
前面的東西叫做鍵名,既然這個東西是從客戶端編寫的,需要把這樣的一個信息發給 Appium Server 服務端。鍵名是不可以隨便改的。 不然是解析不了的。這個是人家定義好的請求的規範。
5.為什麼有平台版本號?
因為要做平台版本匹配。平台版本號意味着使用的自動化框架 API 是不一樣的,這樣發送到終端上面會調用不同的。
寫的代碼換到 Ios 也是可以用的,只是要準備 Ios 的環境,這個需要蘋果系統才可以。
.apk
是安卓的。Appium 會將這個 App 給到的安裝包路徑,去將這個包安裝到對應的設備上面去。如果你給定的是 App 這個字段,它會主動向你的真機或者模擬器去裝這個 App。但是如果你的真機或者模擬器中已經裝好了,再去裝就會報錯。
如果沒有這個app參數
,只有 APP 包和 appActivity,就證明設備上已經存在,只要根據包名和入口去打開對應的應用就可以了。
做瀏覽器版本的 App 測試,就不需要 app 參數了,直接用 browserName 參數就可以了。
如果連接了好幾台設備,實際上只對一台設備進行操作的時候,通過 udid 去連接設備。
noReset 重置應用的狀態,也就是恢復到默認設置。相當於第一次安裝它,將所有的用戶數據都清除。
在應用中清除緩存數據或者應用數據。例如在安卓上輸入用戶名密碼,以後不需要輸入了。除非把系統重裝了,用戶的賬號密碼登錄後就記住了,如果把所有用戶的記錄全部刪除就相當於第一次下載下來第一次使用。
做自動化的過程中是不需要重置的。按照用戶的習慣來測試。
安卓的一些內核是 chrome,因為安卓系統是谷歌提供的。
activity
:有一些是開發在代碼中指定了這個入口頁面是什麼。用另外一個命令 aapt 獲取
6.aapt 命令獲取應用包名和入口 activity
把路徑配置到系統變量-path 中。
apk 的應用名稱不是包名。
輸入aapt dump badging 包名
,直接把 apk 拖拽過來就可以啦。
7.代碼
from appium import webdriver
desired_caps={}
# 平台類型
desired_caps["platformName"]="Android"
# 平台版本號
desired_caps["platformVersion"]="10"
# 設備名稱
desired_caps["deviceName"]="2NSDU20410017297"
# app 包名
desired_caps["appPackage"]="填對應的package name信息"
# app 入口 acitivity
desired_caps["appActivity"]="填對應的launchable-activity name信息"
# 連接Appium server。前提:appium desktop要啟動。有監聽端口。
# 將desired_caps發送給appium server。打開app
driver = webdriver.Remote('//127.0.0.1:4723/wd/hub',desired_caps)
# 運行代碼之前:
#1.appium server啟動成功。處於監聽狀態
#2.模擬器/真機必須能夠被電腦識別。即adb devices能夠識別到要操作的設備。
運行代碼,成功打開應用。
公眾號 清菡軟件測試 首發,更多原創文章:清菡軟件測試 84+原創文章,歡迎關注、交流,禁止第三方擅自轉載。
感謝支持清菡原創,歡迎點擊在看和轉發!