方格精選

用 Spectron 對 Electron App 做測試

更新於 發佈於 閱讀時間約 11 分鐘

Electron

Electron 是 Node.js 生態圈的框架,用於開發跨平台桌面應用,目標平台可以是 Mac / Linux / Windows,可以視為把 web app 包裝成執行檔在自己的視窗內運行,並且透過 Electron 框架讓這支 app 有與作業系統層溝通的能力,包括存取檔案、週邊裝置等,很多目前原生 web API 無法實現的能力都可以透過 Electron 辦到。

最知名的 Electron 應用應該就是 VSCode 了,這款當代最棒的編輯器也是運用了 Electron 框架達成在桌面端跨平台的能力。

Electron 的測試

對最大宗的 Windows 平台的 Windows Forms 這類的原生桌面應用來說,市場上已經有許多 RPA 工具可以用於自動化測試,但因為 Electron 在介面元件上並未調用系統原生元件,而是由 HTML 元素來構成介面,而那些 RPA 工具都無法抓取到 HTML 元件,導致 RPA 完全無用武之地。

既然沒有 GUI 測試工具可以用,只能回歸寫 code 測 code 這招,Electron 有自己的測試框架 Spectron,Spectron 也可以搭配 Mocha 等其它 JavaScript 測試框架使用,網路上爬文一下可以發現大部分也都就是 Spectron 配 Mocha 這樣的組合。

Spectron + Mocha

Electron App

像做菜節目一樣,前面都要先備料,我們必須先有一支 Electron app 來當作我們的測試 app,這裡我們用 Mini Diary 這個 app 當作待測的目標,因為它夠簡單又夠複雜,所謂夠簡單-它的 app 本身功能簡單,操作也簡單;所謂夠複雜-它是 Electron 加 React 的架構,又搭配了一些 React 生態圈的套件;另一個夠複雜-它除了提供原始碼外,也幫我們打包好了各個平台上的安裝檔。

在這裡我們用 Mini Diary 的 macOS 套件包來使用,依照通用的流程安裝,它會被安裝到 /Applications/ 目錄內,主程式就是 「/Applications/Mini Diary.app/Contents/MacOS/Mini Diary」 這支檔案。

版次搭配

前面提過 Electron app 是由 HTML 構成,為了在桌面前端 render 出這些 HTML,Electron app 裡面有包了一個 Chromium 做為前端的 renderer。而 Electron 的測試框架-Spectron,裡面也有一個 ChromeDriver 做為與 Electron 溝通的介面,就像純 web 常用的自動化測試工具 Selenium 也是透過 ChromeDriver 來操控 Chrome 一樣。

因為有 Chromium 與 ChromeDriver,就會有版次搭配的問題,兩者必須是相匹配的版次才可以成功的運作。

在 Electron 方面,electron-releases 這個專案內有列出各版本的 Electron 與 Chromium 的對應關係,以 Mini Diary 來說,它的 Electron 是 8.3.0 版,透過 Electron / Chromium 版次表,可以查到對應的 Chromium 版次是 80。

在 Spectron 方面,它的專案文件同時也列出了 Spectron 與 Electron 的對應表,透過查表可以知道 Electron 8.x 須與 Spectron 10.x 相互搭配。

專案建置

這裡我們為測試另建一個專案,叫做 minidiary-test,建立同名資料夾後,git init 和 npm init 一下,接著把 Mocha 和 Spectron 裝起來:

npm install mocha spectron

記得前面說的版次搭配性問題,有必要的話需指定 spectron 的版次。

測試程式

const Application = require("spectron").Application
const assert = require("assert");

describe("My Test App", function () {
// SETUP section
let app;
this.timeout(20000)
before(function () {
app = new Application({
path: `/Applications/Mini Diary.app/Contents/MacOS/Mini Diary`,
});
return app.start()
.catch(console.error)
});
// shutdown after all tests
after(function () {
if (app && app.isRunning()) {
return app.stop();
}
});
// TESTS section
// test 1
it("Should have the correct title", async function () {
const title = await app.client.getTitle();

assert.equal(title, "Mini Diary");
});
});

能測試 Electron 的關鍵就在上面程式碼內的 app,把 app 定義出來後,就可以利用 Spectron 的 API 去存取 Electron app 的各項屬性,再配合 Mocha 的測試架構即可讓我們做到 Electron app 測試自動化。除了 app 以外的部分,describe()、it() 等都是 Mocha 的測試用函示,關於 Mocha 的用法請自行參閱 Mocha 的網站或其他大大們的文章。

跑看看測試:

npx mocha test/test.js

結果正常的話應該像這樣:

My Test App
✓ Should have the correct title
1 passing (4s)

在上面的範例程式碼中,只有很簡單的確認 app 的標題是否為 Mini Diary,在實際的測試場景中顯然會更複雜,應該會有大量的調用 Sepctron API 對 app 進行自動化操作以及確認 app 視窗內的屬性值是否與預期相符,以及需要用 Chrome 開發者工具來查找元素與操作 console 等,這部分只能先富奸了

Spectron & WebdriverIO

WebdriverIO 是一個 JavaScript 的測試套件,它提供了一層 API 讓我們可以調用瀏覽器與網頁,雖然前面都沒提到它,但其實它也算是 Spectron 的一部分,在安裝 Spectron 的時候 WebdriverIO 也會被裝進專案內。Spectron 就是利用了 WebdriverIO 的 API 來提供給我們操控 Chromium 與 Electron app 頁面的能力,可以更具體地說,Spectron 只是對 WebdriverIO API 做了一層封裝,在 WebdriverIO API 文件內能調用的函式也都可以在 Spectron 上面做調用。

附帶提醒,延續前面提到的版次問題,新舊版的 Spectron 依賴的 WebdriverIO 也會有新舊版的問題,確認一下專案 package.json 內 webdriverio 套件的版次,並且查閱 API 文件時也要注意文件版次與專案內安裝的 webdriverio 版次要相符。

回歸正題,想要在測試腳本裡面去操控頁面元素的話,就必須利用 Spectron 的 API(也就是被封裝過的 WebdriverIO API)。

首先是選擇器,先上範例:

let accountField = app.client.$('.account-input');
accountField.setValu('user1');

看到熟悉的 $() 錢字號函數與後面的 CSS 選擇器語法,和 jQuery 長一樣,雖然長一樣,不過 WebdriverIO 並不依賴 jQuery,只是借鑒錢字號這樣的函數命名而已,大概是希望提高對開發者的親切感吧。

在上面的範例的第二行,把元素抓到之後,就可以操作它,除了範例內做的填值之外,取值、點擊等都可以被實現。詳細的可調用的函式,請參考 WebdriverIO 文件。

參考資料

其它測試工具

  • TestComplete:Windows 桌面端收費商業應用,可以拿來測 Electron,好像很厲害,也很貴的貴。
  • Squish:跨平台自動化測試工具,也是很貴的貴。
留言
avatar-img
留言分享你的想法!
avatar-img
Leon的沙龍
15會員
64內容數
Where I go and what I get.
Leon的沙龍的其他內容
2024/04/10
Goolge OR-Tools 是一套以數學模型為基礎的求解器,相較於 OptaPlanner,OR-Tools 有更平緩的學習曲線,本文是 OR-Tools 最基礎的介紹。
Thumbnail
2024/04/10
Goolge OR-Tools 是一套以數學模型為基礎的求解器,相較於 OptaPlanner,OR-Tools 有更平緩的學習曲線,本文是 OR-Tools 最基礎的介紹。
Thumbnail
2024/04/09
這篇開箱另一套權限檢查工具 Vakt,相較於 Oso,Vakt 的規則直接以 Python 語法構成,不用再學 Oso 的特規語法,可以作為 Oso 的替代品。
Thumbnail
2024/04/09
這篇開箱另一套權限檢查工具 Vakt,相較於 Oso,Vakt 的規則直接以 Python 語法構成,不用再學 Oso 的特規語法,可以作為 Oso 的替代品。
Thumbnail
2024/04/09
SpiffWorkflow 是一個專門針對業務流程的流程引擎,它與商業 BPMN 產品有所區別,適合應用在自有專案中,並且需要內含稍微複雜的商業流程。例如,對於需要外部程式與前端配合才能真正讓用戶輸入決斷的場景,SpiffWorkflow 是一個適合的解決方案。
Thumbnail
2024/04/09
SpiffWorkflow 是一個專門針對業務流程的流程引擎,它與商業 BPMN 產品有所區別,適合應用在自有專案中,並且需要內含稍微複雜的商業流程。例如,對於需要外部程式與前端配合才能真正讓用戶輸入決斷的場景,SpiffWorkflow 是一個適合的解決方案。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
學習如何使用 Electron 創建跨平台桌面應用程式,這篇教學將帶你從零開始,逐步打造你的第一個 Electron 應用程式!我們涵蓋了環境設置、專案初始化、應用程式編寫到最終的打包流程。Electron 讓你使用熟悉的 Web 技術(HTML、CSS 和 JavaScript)來開發原生桌面應用
Thumbnail
學習如何使用 Electron 創建跨平台桌面應用程式,這篇教學將帶你從零開始,逐步打造你的第一個 Electron 應用程式!我們涵蓋了環境設置、專案初始化、應用程式編寫到最終的打包流程。Electron 讓你使用熟悉的 Web 技術(HTML、CSS 和 JavaScript)來開發原生桌面應用
Thumbnail
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
Thumbnail
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
Thumbnail
前言 上篇我們成功執行第一個測試案例,從 Python 腳本透過 Appium 控制模擬器點選設定中的電池,下個問題就是怎麼找元件,這時候就要請出 Appium Inspector 了
Thumbnail
前言 上篇我們成功執行第一個測試案例,從 Python 腳本透過 Appium 控制模擬器點選設定中的電池,下個問題就是怎麼找元件,這時候就要請出 Appium Inspector 了
Thumbnail
其實要為專案建立操作介面的方式很多,除了網頁之外,還能另外寫個專門的手機 APP 連線,或是乾脆升級算法,讓我們能隨口喊一聲「嘿OO!」就搞定,不過⋯
Thumbnail
其實要為專案建立操作介面的方式很多,除了網頁之外,還能另外寫個專門的手機 APP 連線,或是乾脆升級算法,讓我們能隨口喊一聲「嘿OO!」就搞定,不過⋯
Thumbnail
ESP8266 / ESP32單晶片的學習者或玩家常用板卡,依大小體積區分為 大型板卡: Arduino UNO/MEGA/M0 Pro , WEMOS D1 R2 ,WEMOS UNO 中型板卡: NodeMCU ESP8266-12E , ESP32/WROOM-32 , WEMOS D1
Thumbnail
ESP8266 / ESP32單晶片的學習者或玩家常用板卡,依大小體積區分為 大型板卡: Arduino UNO/MEGA/M0 Pro , WEMOS D1 R2 ,WEMOS UNO 中型板卡: NodeMCU ESP8266-12E , ESP32/WROOM-32 , WEMOS D1
Thumbnail
Electron 是把 web 封裝並發布成桌面 app 的框架,同時也提供了存取本機的 API,但卻帶來難以使用傳統自動測試工具的問題,而透過 Electron 的測試框架 Spectron,讓我們得以操控 app 內的 UI 元件,進而達成自動化測試的目的。
Thumbnail
Electron 是把 web 封裝並發布成桌面 app 的框架,同時也提供了存取本機的 API,但卻帶來難以使用傳統自動測試工具的問題,而透過 Electron 的測試框架 Spectron,讓我們得以操控 app 內的 UI 元件,進而達成自動化測試的目的。
Thumbnail
安裝軟體:ATOM-https://atom.io/ 基本上安裝畫面上的download會顯示您目前所用的工具所需的軟體 這邊顯示是Windows的64-bit就是我所用的~Mac會顯示Mac用的 2.每個軟體學習一開始都是要從HELLO WORLD開始,是因為要確認”環境”是否安裝”完成
Thumbnail
安裝軟體:ATOM-https://atom.io/ 基本上安裝畫面上的download會顯示您目前所用的工具所需的軟體 這邊顯示是Windows的64-bit就是我所用的~Mac會顯示Mac用的 2.每個軟體學習一開始都是要從HELLO WORLD開始,是因為要確認”環境”是否安裝”完成
Thumbnail
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html:
Thumbnail
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html:
Thumbnail
畢竟~我是一個懶人嘛... 估狗之後,大部分的做法就是手動的去下載當前瀏覽器對應版本的 Driver,放到一個特定位置,將 Driver Binary 位置指向它。 在 Google Chrome About Page 你可以看到版本 接著去下載對應的 Chrome Driver ↓ 解決方案:
Thumbnail
畢竟~我是一個懶人嘛... 估狗之後,大部分的做法就是手動的去下載當前瀏覽器對應版本的 Driver,放到一個特定位置,將 Driver Binary 位置指向它。 在 Google Chrome About Page 你可以看到版本 接著去下載對應的 Chrome Driver ↓ 解決方案:
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News