Cypress系列(90)- Cypress.Cookies 命令詳解以及如何跨測試用例共享 Cookies

小菠蘿測試筆記發表於2020-11-24

如果想從頭學起Cypress,可以看下面的系列文章哦

https://www.cnblogs.com/poloyy/category/1768839.html

 

Cypress.Cookies 共有三個命令

Cypress.Cookies.debug(enable, options)

Cypress.Cookies.preserveOnce(names...)

Cypress.Cookies.defaults(options)

 

Cypress.Cookies.debug(enable, options)

作用

  • 是否啟用 Cookie 除錯功能
  • 更加易於瞭解 Cypress 是如何操作 Cookie 的

 

引數講解

enable

  • true:啟用,預設,啟用後在開發者工具(F12)的 Console 中可以看到詳細的 Cookie 操作日誌
  • false:不啟用,Console 不會顯示 Cookie 操作日誌

 

options

verbose:是否詳細列印 Cookie 操作日誌,預設 true

 

栗子一

程式碼

 

執行結果(Console)

能看到設定和清除 Cookie 都有詳細的操作日誌

  

栗子二

程式碼

 

執行結果(Console)

只顯示 Cookie 名稱,不會顯示 Cookie 物件

 

栗子三

程式碼

 

執行結果(Console)

沒有 Cookie 的操作日誌

 

Cypress.Cookies.preserveOnce(names...)

前言知識

之前也講過,Cypress 會在每次測試前自動清除所有 Cookie,以防止在測試用例之間共享狀態

 

Cypress 為啥要自動清除 Cookie?

  • 通過在每次測試之前清除 Cookie,可以確保始終從乾淨狀態開始測試
  • 從一個乾淨的狀態開始,可以防止測試用例彼此耦合,也可以防止在一項測試中對應用程式中的某些內容進行更改而影響下游的情況

 

實際場景

如果不儲存 Cookie,則每次測試前都需要登入一次,這將大大浪費不必要的測試時間

 

Cypress 如何儲存 Cookie

  •  Cypress.Cookies.preserveOnce(names...) 命令可以儲存 Cookie,使它在多個測試用例間共享
  • 注意:目前如果使用的是基於 Session 的 Cookie,此命令有效

 

實際使用的模板

 

實際栗子

測試用例程式碼

兩個測試用例,主要校驗是否 Cookie 是否能共享

 

commands.js 程式碼

自定義了一個 login 方法,主要就是登入操作 

 

執行結果

Cookie 成功在多個測試用例之間共享

 

Cypress.Cookies.defaults(options)

作用

  • 設定全域性預設 Cookie
  • 可以修改全域性預設值並保留一組 Cookie,這些 Cookie 將始終在測試用例之間保留
  • 只要呼叫了這個方法,將在其他測試用例中都會生效

 

重點

  • 在 cypress/support/index.js 中配置此命令是絕佳選擇
  • 因為它會在所有測試檔案之前載入

 

options 講解

只有一個 preserve 引數,接受下面四種資料型別

  • String
  • Array
  • RegExp
  • Function

 

使用方式

// 所有名為 cypress-session-cookies 將不會被清除
Cypress.Cookies.defaults({
    preserve: 'cypress-session-cookies'
})

// 所有名為 cypress-session-cookies 或 sessions_id 將不會被清除
// 多個 Cookie 可以用陣列來儲存
Cypress.Cookies.defaults({
  preserve: ['sessions_id', 'cypress-session-cookies']
})

// 滿足此正規表示式的 Cookie 將不會被清除
Cypress.Cookies.defaults({
  preserve: /session|cookie/
})

Cypress.Cookies.defaults({
  preserve: (cookie) => {
    // 可以在這裡實現自己的邏輯
    // 如果函式返回 true, 那 Cookie 則不會被清除
  }
})

一般用前三個就能滿足大部分場景了

 

實際栗子

測試用例程式碼

 

support/index.js 程式碼

  • 使用正規表示式去匹配
  • 含義:cookie 名稱包含 session 或 cookie

 

執行結果

Cookie 也共享成功了

 

總結

  • 這種方式感覺更適合在專案中使用
  • 一般我們都會提前知道需要的 Cookie 是什麼,此時就能提前在 support/index.js 中呼叫此命令去設定 Cookie 了

 

相關文章