Selenium Grid Appnium 自動化測試 Android

利用Selenium Grid + Appium 來執行 Android 分散式測試

劉明凱 Matt Liu 2020/09/28 12:14:24
67

前言

在web或app開發,若是有導入自動化測試的設置時,有時候可能會需要利用各種裝置或者軟體來進行自動化測試,

像是app開發也許就會需要到不同作業系統版本的裝置 (Ex: Android  9、Android  10...),

又或者需要用到不同版本的Webview來進行測試,

所以我們也可以利用 Selenium Grid 結合 appium 來進行分散式測試,並且方便管理我們現有的測試裝置。

 

本次會使用到的工具有

1. Selenium Server (Grid) (Ver. 3.14) 

2. Appium Desktop

3. Genymotion

4. node.js

 

 

1.啟動Selenium Server Grid   (Hub)

由於Appium本身可以結合Selenium Grid的使用,因此我們可以將利用Selenium擔任Hub提供後續Appium Server來註冊,

所以我們先使用command 執行 java -jar selenium-server-standalone-<< Version >>.jar  -role hub 來啟動

在啟動後我們可以看到訊息中有顯示,

node必須於 http://192.168.99.1:4444/grid/register 註冊,

以及client端需要連線至 http://192.168.99.1:4444/wd/hub

這些設置會在後面使用到,可以稍微紀錄一下。

執行後可以利用 http:// << host : port >> /grid/console 看看有沒有成功啟動

 

 

2. 將node註冊至Selenium Grid

要將appium Server及裝置註冊至Selenium Grid,會需要使用到json格式的config檔,

Appium官方文件中也有範例可以參考

{
  "capabilities":
      [
        {
          "deviceName": "192.168.19.103:5555",		# 利用adb devices 查詢的裝置資訊
          "version":"9",  							# 裝置系統版本
          "maxInstances": 1,  						# 最大實例數		
          "platform":"ANDROID"  					# 作業系統名稱
        }
      ],
  "configuration":
  {
    "cleanUpCycle":2000,
    "timeout":30000,
    "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
    "url":"http://127.0.0.1:4724/wd/hub",			# Appium Server 的接口位址
    "host": "127.0.0.1", 							# Appium Server 的 Host
    "port": 4724,  									# Appium Server 的 Port
    "maxSession": 1,
    "register": true,
    "registerCycle": 5000,
	"hub":"192.168.99.1:4444/grid/register/", 		# Selenium Grid 的註冊位址nt連線位址
    "hubHost": "192.168.99.1",						# selenium Grid 的Host
	"hubPort": 4444, 								# selenium Grid 的Port
    "hubProtocol": "http"							# selenium Grid 的通訊協定
  }
}

 

在設置文件中的deviceName是需要利用command指令來查詢與當前設備有連接的裝置資訊,

可以利用 adb devices 來查詢

 

在設定檔準備完成後,

我們利用文件中提到的 running from source的方式註冊appium節點至hub上,

因此需要找到Appium Desktop的main.js所在位置,

預設的安裝位置應該會在

C:\Users\<<使用者>>\AppData\Local\Programs\Appium\resources\app\node_modules\appium\build\lib\

 

在找到main.js的位置之後,利用command指令啟動Appium Desktop

node main.js --nodeconfig <<設定檔json所在位置>>

另外,啟動也可以利用-a 、 -p 、 -bp 、 -U 等等參數進行額外設定,其他參數可以用 node main.js --help 查詢

這裡主要會用到的有

-a  Appium Server 的 host  (與文件中相同即可)

-p  Appium Server 的 port  (與文件中相同即可)

-bp  bootstrap 的監聽端口

-U  Appium連結的裝置的UDID (與文件中相同即可)

--nodeconfig  註冊的json文件設定檔位置

node main.js -a 127.0.0.1 -p 4723 -bp 4725 -U 192.168.19.102:5555 --nodeconfig d:/appium/102.json

執行command指令後可以看到相關的設定資訊,並且成功註冊到grid上,也可以在grid/console上面看到註冊的裝置訊息

目前這種設定方式有個缺點是,若要設定多個裝置時,會需要利用多個json檔及appium server來進行設定及管理,

成功啟動多個裝置之後,grid的畫面上也可以看到多個設備的資訊

到這邊我們就已經將hub以及node都設置完畢了,接下來就可以利用Appium的測試腳本來進行測試,

Appium的腳本除了自行手動撰寫之外,也可以利用Appium Desktop來進行錄製。

 

 

3. 測試腳本撰寫/錄製

啟動Appium Desktop時,可以利用右上角的放大鏡 (Start inspector session) 開啟視窗

 

platformName : 裝置平台名稱 / 作業系統名稱

deviceName : 透過adb devices 查詢到的裝置資訊

automationName : Testing framework的名稱,這裡使用UiAutomator2

autoGrantPermissions : 自動同意系統權限

 

簡易設置相關的裝置資訊以及測試框架的資訊後,點選右下角的Start Session進行錄製

 

點選錄製按鈕之後,在右方也可以選擇Export的腳本所使用的語言,這邊使用的是JS-WD,

Export出來後的腳本大致上會長這樣

 

 

簡單的調整腳本內容,改為利用selenium grid的hub去驅動兩個裝置進行測試,並且讓腳本可以一口氣利用這兩個裝置進行測試

 

 

最後在利用node.js執行 test script,就可以看到selenium Grid (hub) 去驅動 appium server 進而呼叫測試裝置進行腳本測試

 

但是這個做法 Appium 雖然可以分散配置測試裝置,但是在測試過程中依然是一個一個進行,

若是想要進行併行測試的話,也可以參考appium的相關文件

Appium #parallel-android-tests

 

總結

在簡單透過Selenium Grid + Appium 的結合,雖然可以透過Selenium Grid的console頁面看到目前所註冊的裝置資訊,

但是在設定及config檔管理上還是相當的麻煩,

另外也有其他開發人員提到這種做法 無法自動排除故障、需要準確的設定文件及指令參數以及需要啟用多個appium server等等,

也還有許多其他的設定方式,可以讓自動化測試更加的便利,開發過程也更加的快速。

 

劉明凱 Matt Liu