跨测试保存本地存储以避免重新身份验证

时间:2018-05-17 14:26:46

标签: cypress

我想知道是否可以跨测试保存localStorage的状态。 主要是因为我想避免在每次测试时重新进行身份验证。我意识到我可以创建一个向我们的后端发送API请求的命令,以避免通过auth流程,但由于各种原因,这在我的情况下不起作用。

我在问是否有可能有这样的工作流程:

  1. 转到登录页面:验证取回响应并将会话保存到本地存储
  2. 以某种方式坚持本地存储...
  3. 通过其他测试作为经过身份验证的用户

4 个答案:

答案 0 :(得分:1)

你可以在JS中做任何你可以在柏树测试中做的事情。如果您有某种方法可以在本地存储中存储信用卡(身份验证令牌等),我认为没有理由不这样做。如果cypress在测试之间清除本地存储,则必须编写一个beforeEach挂钩,在每次测试之前将经过身份验证的令牌(由您硬编码)保存到本地存储。

答案 1 :(得分:1)

这是我最终做的事情:

  1. 转到登录页面:验证 此时,我们希望在localStorage中的测试之间保留数据,但我们不允许将localStorage列入白名单。 但是,我们允许whitelist cookies
  2. 我在$timeline_array = $customer->comments; $timeline_array = $timeline_array->toBase()->merge($customer->tasks); //sort timeline event $timeline_array = $timeline_array->sortByDesc(function($timeline_event){ return $timeline_event->created_at; }); $timeline_array = $this->paginate($items); public function paginate($items, $perPage = 15, $page = null, $options = []) { $page = $page ?: (Paginator::resolveCurrentPage() ?: 1); $items = $items instanceof Collection ? $items : Collection::make($items); return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options); } 中有一些像这样的代码作为助手

    support/commands.js
    1. 因此我们在登录后致电const sessionKeys = { authTokens: 'auth.tokens', sessionConfig: 'session.config', }; // The concatenation of username and cid will be the key to set the session Cypress.Commands.add('persistSession', (key) => { const authTokens = localStorage.getItem(key); cy.setCookie(key, authTokens); }); Cypress.Commands.add('restoreSession', (key) => { cy.getCookie(key).then(authTokens => { localStorage.setItem(key, authTokens.value); }); }); ,这意味着我们将所有身份验证保存为Cookie,并在cy.persistSession(key)内加入代码列入白名单。
    2. 像这样:

      support/index.js
      1. 现在我们在运行它们之前需要我们的其他测试中的auth令牌,我们Cypress.Cookies.defaults({ whitelist: function(cookie){ // Persist auth stuff const reAuthTokens = new RegExp('.*auth\.tokens'); if(reAuthTokens.test(cookie.name)){ return true; } return false; } }); 我们应该很好!

答案 2 :(得分:1)

这是解决您像我这样的问题的有用链接:通过多次测试保留cookie

我的代码如下:

const login = () => { cy.visit('http://0.0.0.0:8080/#/login'); cy.get('#username').type('username'); cy.get('#password').type('1234password$'); cy.get('#login-button').click(); }

describe('UI', () => { // beforeEach(login); beforeEach(() => { login(); Cypress.Cookies.preserveOnce('session_id', 'remember_token'); });

});

希望可以帮助您。

答案 3 :(得分:0)

您可以使用cypress-localstorage-commands包在两次测试之间保留localStorage,因此只能登录一次:

在support / commands.js中:

import "cypress-localstorage-commands";

在您的测试中:

before(() => {
  // Do your login stuff here
  cy.saveLocalStorage();
});

beforeEach(() => {
  cy.restoreLocalStorage();
});