概觀

Nightwatch 提供內建的可擴充 assert/verify 程式庫,作為包含相同方法以對元素執行斷言的兩個命名空間。

.assert

使用 .assert 命名空間時,當斷言失敗時,測試會結束,因此會跳過測試中的所有其他斷言。

下列範例程式碼片段使用 assert 命名空間來判斷類別為 non_existing 的元素是否在頁面上可見。如果斷言失敗,測試會結束

    browser.element.find('selector').assert.visible('.non_existing');
  

.verify

使用 .verify 命名空間時,當斷言失敗時,測試會記錄失敗並繼續測試中的其他斷言。

下列範例程式碼片段使用 verify 命名空間來檢查類別為 non_existing 的元素是否在頁面上可見。如果斷言失敗,則會記錄失敗,並且測試會繼續

browser.verify.visible('.non_existing');

基本斷言

Node.js assert 模組中的方法也可在 .assert/.verify 命名空間中使用。

否定 (".not") 斷言

從 Nightwatch 版本 1.3 開始,所有斷言 (包括自訂定義的斷言) 都有 ".not" 對應項,可用於判斷相反的條件。

諸如 `elementNotPresent`、`cssClassNotPresent`、`hidden` 之類的斷言已過時且已棄用。

下列範例程式碼片段顯示 ".not" 斷言

tests/sampleTest.js
describe('Demo .not assertion', function() {
  it('demo test', function(browser) {
    browser.init();
    
browser .element.find('.not_present') .assert.not.elementPresent();
browser .assert.not.urlContains('http://');
// ... }) })

自動重試

依預設,Nightwatch 會自動重試失敗的斷言,最長可達 5000 毫秒。這可以在 nightwatch.json 檔案中的 globals 物件中設定 retryAssertionTimeout (以毫秒為單位) 屬性來設定。請查看使用測試全域變數以取得更多詳細資料。

如果達到指定的逾時時間,測試執行器會停止重試,並將斷言標記為失敗。

下列範例程式碼片段顯示在組態檔中定義的 retryAssertionTimeout 屬性

nightwatch.conf.js
{
  src_folders: ['tests'],
  
test_settings: { default: { launch_url: 'https://nightwatch.dev.org.tw',
globals: { myGlobalVar: 'some value', retryAssertionTimeout: 5000 } } } }

Expect 斷言

除了 assert 命名空間之外,Nightwatch API 還支援開箱即用的 BDD 樣式 expect 斷言程式庫,這大幅提高了斷言的彈性以及可讀性。

expect 斷言使用 Chai 框架中的 Expect API 的子集,目前可用於元素、Cookie、頁面標題和 URL。

範例

以下是使用各種 expect.element([...]) 斷言的基本範例

tests/sampleTest.js
module.exports = {
  'Demo test Ecosia.org': function (browser) {
    browser.url('https://www.ecosia.org/');
    
// expect element header to be present in 1000ms expect(browser.element.find('header')).to.be.present.before(1000);
browser.end(); } };

預期特定元素計數

在此範例中,測試預期頁面上存在指定數量的元素,使用 expect.elements([...]).count 斷言

tests/sampleTest.js
module.exports = {
  'demo test ecosia.org'(browser) {
    browser
      .url('https://www.ecosia.org/')
      .expect(browser.element.findAll('section').count()).to.equal(5);
  },
  
after(browser) { browser.end(); } };

expect 介面提供更具彈性且流暢的語言來定義斷言,與現有的 assert 介面相比,大幅改進。唯一的缺點是無法再串連斷言。


如需可用 expect 斷言的完整清單,請參閱API 文件