做者:清菡
博客:oschina、雲+社區、知乎等各大平臺都有。web
你沒有必要爲了自動化而從新編譯你的應用或者以任何的方式修改它。chrome
你不該該被限制在特定的語言或框架上來編寫運行測試。shell
移動端自動化框架在自動化接口方面不該該從新造輪子。
(Appium 中不必把 http 通訊過程,命令的執行過程以及點擊輸入等公用的操做再寫一遍,Appium 直接繼承 Selenium,把現有的東西所有拿過來)瀏覽器
移動端自動化框架應該開源,不但在名義上並且在精神上和實踐上都要實至名歸。緩存
經過 Http 通訊,沒有改變瀏覽器訪問系統的屬性,只要訪問就能夠了。
Appium 作自動化也是如此。網絡
安卓和 Ios 都有本身自帶的自動化測試框架。
由於 Ios 和安卓是不一樣的語言編寫的,因此用 Appium(Appium 是跨平臺跨語言)。app
版本不同,用的自動化框架也不同。自動化框架不同,API 接口也不同。框架
Appium server
去跟移動端的東西通訊,首先確實是 Ios 仍是安卓。即便確認了是安卓,也得確認下是 UiAutomator
的 Api 仍是 Instrumentation
的 Api。測試
通常只支持主流版本,其它版本須要用戶本身支持了。.net
啓動一個模擬器或者真機就有一套自帶的自動化框架。
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 客戶端的介紹。
高級選項分爲 3 大板塊:基本配置-Ios 配置-安卓配置。
日誌文件很是有用,若是你在 App 自動化的過程當中遇到了什麼問題報錯了,不少時候都要進入 Appium 的日誌當中來分析的。
這個服務端的日誌,它作的很是的全面。包括 Python 代碼向它發送的請求,以及在它收到請求後作的一系列的處理,到底用的 Adb 仍是什麼東西,仍是和誰通訊等都描述得很是清楚。
因此默認的日誌級別是 debug,把整個過程當中作的不少操做所有都打印出來了。
日誌路徑本身配置一個,例如我配置在 D 盤的根目錄下。D://appium.log
這裏有些選項,這些選項什麼都不選的時候,啓動 Server。這樣操做是沒有時間的。
後續運行代碼的時候,面板上的日誌會刷個不停。因此有些日誌要滾動好久才能看到,因此點擊 Get Raw Logs 按鈕。獲得一個這樣的文件:
這個文件中有時候不少東西顯示的不對。因此配置一個日誌存放路徑,將日誌輸出到對應的路徑保存就行了。
App 自動化最基本的東西:Adb 命令。
Adb 命令是用來調試真機或者模擬器的。adb devices
這條命令識別當前電腦鏈接的設備(模擬器也能識別)。真機必須開啓 Usb 調試模式,在開發者選項當中勾選 Usb 調試模式。
.apk
的後綴名。
開發把包給你的時候都會先打包成一個 apk,而後你去安裝,安裝後在安卓系統上再也不是.apk
,會對它進行解壓。解壓後在特定的系統中特定的目錄下面會有本身的包名。
包名–安卓系統當中的標識(至關於惟一代號)
有相同的包名,就是應用已安裝。卸載的時候能找到這個包名就能卸載,找不到就不能卸載。
模擬器和安卓真機都是基於 Liunx 內核的。在 Liunx 中都是以文件的形式來管理的。各類文件路徑,和 Windows 系統同樣。文件路徑來管理各類內部的數據,包括系統安裝的一些東西。須要熟悉 Liunx 的經常使用命令。
通常安卓手機都有個系統文件夾。不少產商基於安卓的原生系統作了不少美化工做,因此不少文件目錄會有所改變,每一個品牌的手機,文件所放的目錄都不同。
https://blog.csdn.net/qq_41282136/article/details/100265002
adb shell pm list packages -3
而後你進本身手機系統文件夾下能夠找到對應的包名。
activity 就是頁面,安卓設備上每個頁面均可以叫作一個 activity,它們的名字都是不同的。入口 activity 就是打開這個 app 的時候,默認是進入哪一個頁面的,默認是哪一個 activity 名稱。
想安裝的時候能夠提供 apk 的名字。
http://appium.io/docs/cn/about-appium/intro/#appium_1
automationName 是自動化測試的一個引擎。
前面的東西叫作鍵名,既然這個東西是從客戶端編寫的,須要把這樣的一個信息發給 Appium Server 服務端。鍵名是不能夠隨便改的。 否則是解析不了的。這個是人家定義好的請求的規範。
由於要作平臺版本匹配。平臺版本號意味着使用的自動化框架 API 是不同的,這樣發送到終端上面會調用不一樣的。
寫的代碼換到 Ios 也是能夠用的,只是要準備 Ios 的環境,這個須要蘋果系統才能夠。
.apk
是安卓的。Appium 會將這個 App 給到的安裝包路徑,去將這個包安裝到對應的設備上面去。若是你給定的是 App 這個字段,它會主動向你的真機或者模擬器去裝這個 App。可是若是你的真機或者模擬器中已經裝好了,再去裝就會報錯。
若是沒有這個app參數
,只有 APP 包和 appActivity,就證實設備上已經存在,只要根據包名和入口去打開對應的應用就能夠了。
作瀏覽器版本的 App 測試,就不須要 app 參數了,直接用 browserName 參數就能夠了。
若是鏈接了好幾臺設備,實際上只對一臺設備進行操做的時候,經過 udid 去鏈接設備。
noReset 重置應用的狀態,也就是恢復到默認設置。至關於第一次安裝它,將全部的用戶數據都清除。
在應用中清除緩存數據或者應用數據。例如在安卓上輸入用戶名密碼,之後不須要輸入了。除非把系統重裝了,用戶的帳號密碼登陸後就記住了,若是把全部用戶的記錄所有刪除就至關於第一次下載下來第一次使用。
作自動化的過程當中是不須要重置的。按照用戶的習慣來測試。
安卓的一些內核是 chrome,由於安卓系統是谷歌提供的。
activity
:有一些是開發在代碼中指定了這個入口頁面是什麼。用另一個命令 aapt 獲取
把路徑配置到系統變量-path 中。
apk 的應用名稱不是包名。
輸入aapt dump badging 包名
,直接把 apk 拖拽過來就能夠啦。
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+原創文章,歡迎關注、交流,禁止第三方擅自轉載。
感謝支持清菡原創,歡迎點擊在看和轉發!