Appium原理分析

前言:javascript

  隨着產品發佈的週期愈來愈快, 行業對測試的要求也愈來愈高; 每每須要在很短的時間內完成前端

多端測試(Android iOS 小程序、H5)、java

多環境測試(聯調環境、測試環境、預發佈環境)、android

多機型覆蓋(後逃統計到的top20 or top50?)web

多版本共存(歷史版本兼容?)shell

歷史用例的迴歸(迴歸測試時的覆蓋面?)json

這些問題都在推進這整個行業去尋求技術的突破,  自動化測試就是可以保證產品質量的一個重要手段, 其與企業小程序

產品線的CI CD 集成  完成迴歸測試 兼容性及自動化探索測試等;今天主要整理下UI自動化測試技術中的主流技術bash

手段 Appium.服務器

 

使用分層測試策略,控制UI自動化測試規模(在決定作UI自動化前 必定要肯定其主要解決的問題)

  • 少數核心用例交給自動化測試
  • 大部分的基礎迴歸測試交給自動遍歷
  • 新功能測試交給人工測試

 

1、Appium應用原理:

 

  Appium是一個獨立的模塊,使用的時候須要咱們啓動它; 當開啓appium服務器的同時就開啓了監聽端口;咱們運行腳本的時候,調用任何的appiumAPI,都會向Appium Server端post一條HTTP請求,(咱們可使用任何方式去發送交互的post http請求, 各語言腳本,或者是自定義curl等,只要請求符合webdirver協議 );請求內容就是根據webdriver wire protocol協議規定的一條JSON格式的數據;Appium Server端接收到請求後,解析出JSON數據併發送到手機端;(appium會給手機端發送一個apk, apk在手機上會監聽一個forword端口) 手機端上已經由BootStrap.jar(iOS爲BootStrip.js)開啓的socket服務器監聽相應的端口,BootStrap.jar在appium每一個session第一次訪問手機端的時候會自動安裝;手機端接收到對應的請求後,經過BootStrap.jar翻譯成UIAutomator能執行的命令,而後經過UIAutomator處理並操做APP完成測試。下面經過分析腳本與appium通信日誌  以及 appium與移動設備通信日誌來分析其運行原理.

 

2、使用Appium 啓動一個app實例來展現appium的工做流程

  • 分析Appium的log 分析其工做流程  其中存儲來appium工做流中的關鍵數據 可使用appium -p 5723 -g /tmp/appium.log 將appium產生的log導出到本地分析; 
  • 監聽webdriver  經過tcpdump抓包分析 協議通信流程
  • 分析uiautomator的log

 

$(which emulator) -list-avds 查找可用的模擬器

$(which emulator) @XXX       啓動xxx模擬器

 啓動Appium服務; start一個Session  而後導出logs

 

 

 Running '/Users/wangjianqing/Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb -P 5037 -s emulator-5554 shell dumpsys window'

主要分析Running  中的

adb -P 5037 -s emulator-5554 shell dumpsys window'

-P adb開的端口  -s 對應的設備   後面對應的執行腳本

爲了便於分析, 將android 中的adb 替換成以下腳本  將adb mock掉  原adb  改爲adb.bak     mv adb adb.bak

```

log=/tmp/adb.log

echo "# $$ "$(date "+%Y/%m/%d %H:%M:%S") >> $log

echo "# ppid: $(ps -o command  $(ps -o ppid $$ | tail -1) | tail -1)" >> $log

echo "adb $@" >> $log

if echo "$@" | grep -E "logcat |exec-out |uiautomator runtest" &>/dev/null; then

  echo "exec" >> $log

  exec /Users/wangjianqing/Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb.bak "$@"

elif echo "$@" | grep "dumpsys package io.appium.settings" &>/dev/null; then

  echo "mock" >> $log

  cat /Users/wangjianqing/temp/appium/package.mock | tee -a $log

elif echo "$@" | grep "io\.appium\.settings" &>/dev/null;then

  echo "mock" >> $log

  echo "11111" | tee -a $log

else

  result=$(/Users/wangjianqing/Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb.bak "$@")

  echo "origin" >> $log

  echo "$result" | tee -a $log

fi

echo "" >> $log

``` 

 將adb替換完成後,  默認會使用腳本中的adb執行邏輯;  執行完的log會保存到 /tmp/adb.log中;  如執行adb devices 以後,打開log日誌以下:

# 3779 2019/08/12 22:54:42

# ppid: -bash

adb devices

origin

List of devices attached

emulator-5554 device

 此時再次使用appium'時生成的log就會是使用新adb產生的簡化結果日誌; 

 

二、

使用curl命令來給appium發送請求,讓它執行啓動app的操做:

curl -H "Content-Type: application/json; charset=utf-8" \
-H "Cache-Control: no-cache" \
--data '{"desiredCapabilities":{"appActivity":".view.WelcomeActivityAlias","appPackage":"com.xueqiu.android","autoGrantPermissions":"true","deviceName":"hogwarts","platformName":"android","newCommandTimeout":0,"connectHardwareKeyboard":true}}' \
-XPOST http://127.0.0.1:5723/wd/hub/session
 

若是要封裝Appium 的話,首先要知道它作了什麼,才能作到使用你本身的語言或方式去操做appium,能夠直接按照webdriver協議規範封裝發送請求 ,編寫appium前端. 

使用tcpdump監聽webdriver協議操做過程當中的端口,包括操做腳本與appium通信的端口和appium和手機交互過程當中的通信端口

  adb forword   

 appium在和手機交互   會向手機推送一個apk  ,這個apk啓動後會監聽一個端口,會把手機上的命令經過 forword命令映射到你的PC上去;你的PC機更多的是和

forword端口來和手機通信;

sudo tcpdump -i any port 5723 or port 4724 -vv -w /tmp/tcpdump.1    #5723是appium端口   4724是forword端口 將發送到這兩個端口的請求都錄下來

 而後使用wireshark打開tcpdump  選擇某個tcp右鍵follow Http能夠查看具體的請求

POST /wd/hub/session HTTP/1.1
Connection: keep-alive
User-Agent: admc/wd/1.11.1
Accept: application/json
Content-Type: application/json; charset=UTF-8
Content-Length: 234
host: 127.0.0.1:5723

{"desiredCapabilities":{"appActivity":".view.WelcomeActivityAlias","appPackage":"com.xueqiu.android","autoGrantPermissions":"true","deviceName":"hogwarts","platformName":"android","newCommandTimeout":0,"connectHardwareKeyboard":true}}HTTP/1.1 200 OK
X-Powered-By: Express
Vary: X-HTTP-Method-Override
Content-Type: application/json; charset=utf-8
Content-Length: 856
ETag: W/"358-h2tUi1B25lJ0BAIZ1c7Eh+Nw5yY"
Date: Fri, 05 Jul 2019 13:19:54 GMT
Connection: keep-alive

{"status":0,"value":{"platform":"LINUX","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{},"desired":{"appActivity":".view.WelcomeActivityAlias","appPackage":"com.xueqiu.android","autoGrantPermissions":true,"deviceName":"hogwarts","platformName":"android","newCommandTimeout":0,"connectHardwareKeyboard":true},"appActivity":".view.WelcomeActivityAlias","appPackage":"com.xueqiu.android","autoGrantPermissions":true,"deviceName":"emulator-5554","platformName":"android","newCommandTimeout":0,"connectHardwareKeyboard":true,"deviceUDID":"emulator-5554","platformVersion":"8.0.0","deviceScreenSize":"1080x1920","deviceModel":"Android SDK built for x86","deviceManufacturer":"Google"},"sessionId":"2f9abce4-a49f-49f2-9c58-440a2dd300f6"}

相關文章
相關標籤/搜索