iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
Modern Web

自動化 End-End 測試 Nightwatch.js系列 第 9

自動化 End-End 測試 Nightwatch.js 之踩雷筆記:等待時間

在測試一個網頁時,時常會有需要等待的時候,可能是等待網頁載入、等待 UI 顯示或等待搜尋結果等

pause()

在 Nightwatch.js 中,assert/verify 都有最多等待 5 秒的機制,但如果我們需要的結果可能超過 5 秒時,就可以先利用 pause 帶入時間來等待。

範例:

browser.pause(1000);

其中的參數為 ms,1000 即表示等待一秒

不過當測試的檔案很多時,有些可能需要等待較久,有些則不用,每項都個別寫等待秒數很不方便。

Globals

在 nightwatch 設定檔中,可以透過 nightwatchConfig 決定 globals 放置的位置,並管理全域變數。

// nightwatch.conf.js

const nightwatchConfig = {
    "globals": {
        "myGlobalVar" : "some value",
        "otherGlobal" : "some other value"
    }
}

當然,也可以移到另一個 js 檔案管理

// nightwatch.conf.js

const GLOBALS_PATH = path.join(process.cwd(), './globals.js');

const nightwatchConfig = {
    globals_path: GLOBALS_PATH,
}
// global.js

module.exports = {
    "myGlobalVar" : "some value",
    "otherGlobal" : "some other value"
}

pauseLogin(), pauseSearch()

接著就可以撰寫客製化指令,帶入 global variable 使 pause 變得更通用:

// global.js

module.exports = {
    "LoginTime" : "5000",
    "SearchTime" : "15000"
}
// pauseLogin.js

module.exports = {
  command: async function(type) {
  const { LoginTime } = this.globals;
      this.pause(LoginTime)
  }
}
// pauseSearch.js

module.exports = {
  command: async function(type) {
  const { LoginSearch } = this.globals;
      this.pause(LoginSearch)
  }
}

如此一來,撰寫測試檔案便能夠過 browser.pauseLogin() 更能清楚知道為什麼需要等待以及正在做什麼動作。

總結

這篇大致說明了 pause() 的功用,不過實際上在測試時並不好用,如果只在相同機器、相同 server 或許夠用,但如果測試環境有分 develop 的環境、pre-production 環境等,可能因為環境不同,造成等待時間不夠並導致失敗。

比較好的做法是利用 waitForElementPresent(), waitForElementVisible() 並等待對應的結果出現。下一篇再來寫關於這兩個,同時也說明他們的缺點與改善方法。


上一篇
自動化 End-End 測試 Nightwatch.js 之踩雷筆記:點擊物件 III
下一篇
自動化 End-End 測試 Nightwatch.js 之踩雷筆記:等待物件
系列文
自動化 End-End 測試 Nightwatch.js30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言