Python+Appium執行簡單的demo,你需要理解Appium執行原理!

清菡發表於2020-09-20

堅持原創輸出,點選藍字關注我吧

作者:清菡

部落格: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 包名的連結:

https://blog.csdn.net/qq_41282136/article/details/100265002

adb shell pm list packages -3

然後你進自己手機系統資料夾下可以找到對應的包名。

activity 就是頁面,安卓裝置上每一個頁面都可以叫做一個 activity,它們的名字都是不一樣的。入口 activity 就是開啟這個 app 的時候,預設是進入哪個頁面的,預設是哪個 activity 名稱。

想安裝的時候可以提供 apk 的名字。

4.Appium 官網介紹

http://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('http://127.0.0.1:4723/wd/hub',desired_caps)

# 執行程式碼之前:
#1.appium server啟動成功。處於監聽狀態
#2.模擬器/真機必須能夠被電腦識別。即adb devices能夠識別到要操作的裝置。

執行程式碼,成功開啟應用。


公眾號 清菡軟體測試 首發,更多原創文章:清菡軟體測試 84+原創文章,歡迎關注、交流,禁止第三方擅自轉載。

感謝支援清菡原創,歡迎點選在看和轉發!

相關文章