頁面物件 API

概觀

頁面物件為測試案例的建立提供額外的抽象層。頁面物件定義在模組中,並解析為建立頁面物件實例的工廠函式。

如需 Nightwatch 中頁面物件模型的介紹,請參閱入門指南。

頁面物件模組

名稱 類型 描述
commands 陣列 包含函式的物件清單,表示新增至頁面物件實例的方法。
elements Object | Array 命名元素定義的物件或物件陣列,用作從頁面物件呼叫的元素指令中的元素選取器。
props Object | Function 物件或傳回物件的函式,表示使用者變數的容器。Props 物件會直接複製到頁面物件實例的 props 屬性中。
sections 物件 命名區段定義的物件,定義頁面物件內的區段。
url String | Function 當呼叫頁面的 navigate() 方法時,在 url() 指令中使用的 URL 或傳回 URL 的函式。

頁面物件實例

當呼叫標準指令 API 的 page 參考內的各自工廠函式時,會使用頁面物件模組定義來定義頁面物件實例。

const myPageObject = browser.page.MyPage(); // defined in MyPage.js module

每次呼叫上述的 MyPage 等工廠函式時,都會建立新的頁面物件實例。

屬性




名稱 類型 描述
api 物件 提供對完整 Nightwatch 指令 API 的存取權的參考,通常在測試案例中稱為 browser。這用於存取不屬於頁面物件 API 中指令子集的指令。
elements 物件 由元素選取器使用的元素物件對應。
name 字串 由其模組名稱定義的頁面物件名稱 (不包含副檔名)。這是用來從指令 API 的 page 參考中存取頁面物件工廠的相同名稱。
props 物件 參考從模組定義指派的 props 物件。

注意: 如果在頁面物件模組中定義為物件實例,則這將是頁面物件所有實例的相同 props 物件。如果您希望每個 props 物件都是唯一的,請在模組中將 props 定義為一個函式,該函式將為每個新的頁面物件實例傳回一個新的 props 物件。
section 物件 為頁面物件定義的區段物件的對應。這將僅包含頁面物件模組根 sections 定義中的區段。巢狀區段可透過其父區段自己的 section 參考存取。
url string|Function 頁面物件模組中的 URL 值,可以是字串或函式,具體取決於其定義方式。

範例

module.exports = {
  // can be string or function
  url: function () {
    return this.api.launchUrl;
  },
  elements: {
    // shorthand, specifies selector
    mySubmitButton: 'input[type=submit]'
    
// full myTextInput: { selector: 'input[type=text]', locateStrategy: 'css selector' } }, commands: [ { myCustomPause: function () { this.api.pause(this.props.myPauseTime); } } ], // object version (best considered immutable) props: { myPauseTime: 1000 },
sections: { myFooterSection: { selector: '#my-footer', locateStrategy: 'css selector', elements: { myLogo: { selector: '.my-logo', locateStrategy: 'css selector' } }, commands: [ { myMoveToLogo: function () { this.moveToElement('@myLogo', this.props.myLogoX, this.props.myLogoY); } } ], // function version (recommended) props: function () { return { myLogoX: 10, myLogoY: 10 }; }, sections: { // additional, nested sections } } } };

頁面物件方法

使用指令 API 的 url() 指令導覽至為頁面物件定義的已解析 URL。當使用頁面物件時,此指令通常會取代指令 API 的 url(),因為頁面物件的 url 成員是使用者定義的 URL 字串或函式,而不是用於導覽至 URL 的呼叫。

元素實例

元素實例封裝用於處理元素選取器的定義。通常您不需要直接存取它們,而是使用其 @ 前置名稱來參照它們以進行選取器引數,但它們可透過頁面物件或區段的 elements 屬性取得。

區段實例

如需建立區段的介紹,請參閱定義區段指南頁面。

頁面物件區段實例是從頁面物件實例的 section 屬性存取的 (請注意,這是 "section" 的單數版本,而複數版本 "sections" 用於模組定義中)。

區段會透過頁面物件工廠自動建立,並且可直接作為 section 參考的屬性使用。

const myPageObject = browser.page.MyPage();
const mySection = myPageObject.section.MySection; // from a `sections: {}` block in page object

頁面物件指令

如需撰寫頁面物件自訂指令的介紹,請參閱撰寫頁面特定指令指南頁面。



名稱 類型 描述
commands 陣列 包含函式的物件清單,表示新增至頁面物件實例的方法。

頁面物件指令注意事項

模組根指令中的頁面物件指令在子區段中不可用,而區段指令在父區段或根頁面物件中不可用。

  • 內容: 頁面物件指令內容 (this 的值) 是頁面物件 (對於區段,它是區段實例);
  • 執行: 頁面物件指令不是從指令佇列中呼叫。頁面物件指令中的程式碼會在呼叫函式時立即執行;
  • 鏈結: 頁面物件指令必須傳回一個值才能進行鏈結。這可以是任何值,但建議您堅持使用 this,以便您的指令可以在頁面物件實例的內容中進行鏈結。