赛普拉斯为完整的测试套件保留 cookie

Cypress preserving cookies over for a complete test suite

我正在测试要求您在执行测试时登录。为了保持登录状态,我在测试期间保留了 Cookie 运行。

我使用自定义函数:

Cypress.Commands.add('preserveAllCookiesOnce', () => {
    Cypress.Cookies.defaults({
        preserve: (cookie) => {
            return true;
        }
    })
})

也试过

beforeEach(function () {
        Cypress.Cookies.preserveOnce('session', 'YII_CSRF_TOKEN');
    })

(仔细检查 cookie 的名称)

现在在这个测试用例中,我在登录后包含了两个 post 请求。但是在这两个 POST 请求测试之后,我再次尝试访问该页面时出现 403 错误。

如果您需要更多详细信息,请告诉我。我试图将代码保持在理解问题所需的最低限度:

import {Login} from "../../pages/login/Login";

describe('test POST/client validation', () => {
    beforeEach(function () {
        cy.preserveAllCookiesOnce()
    })
    it('log in', () => {
        login.goToLoginPage()
        login.loginCredentials(Cypress.env('userEmail'), Cypress.env('userPass'))
    })
    it('test some stuff', function () {
        cy.visit(Cypress.env('url') + '/index.php?r=tc/tcSettings/index&language=de')
        .....
    })
    it('send POST/client request with incorrect values', function () {
        cy.request({
            method: 'POST',
           ...
        })
            .then(response => {
                expect(response.status).to.eq(400)
                expect(response.body.fields).to.contain({stuff})
            })
    })
    it('send POST/client request with correct values', function () {
            cy.request({
              ...
            })
                .then(response => {
                    expect(response.status).to.eq(200)
                })
    })
    it('go to clients page and assert created client', () => {
            cy.visit(Cypress.env('url') + '/index.php?r=client/index&language=de') 
    })
})

看起来保留 cookie 无法通过 POST 测试。当我在最后一步尝试访问该网站时,我得到了 403 状态。

通常我可以 运行 使用命令 cy.preserveAllCookiesOnce() 任意数量的 it 个实例所以我猜它可能与 POST 中的请求有关在

之间

POST 步骤后的 Cookie 屏幕截图:

cy.preserveAllCookiesOnce()一个custom command that you created in your Cypress's project? Note that you should use Cypress.Cookies.preserveOnce()代替:

beforeEach(function () {
    // before each test, we can automatically preserve the
    // 'session_id' and 'remember_token' cookies. this means they
    // will not be cleared before the NEXT test starts.
    //
    // the name of your cookies will likely be different
    // this is an example
    Cypress.Cookies.preserveOnce('session_id', 'remember_token');
})

要启用或禁用 cookie 调试,请使用 Cypress.Cookies.debug()

// Cypress will now log in the console when
// cookies are set or removed
Cypress.Cookies.debug(true)

cy.setCookie('fakeCookie', '123ABC')
cy.clearCookie('fakeCookie')
cy.setCookie('fakeCookie', '123ABC')
cy.clearCookie('fakeCookie')
cy.setCookie('fakeCookie', '123ABC')

您可以阅读更多关于 Cypress.Cookies 的 API here

好的,终于找到问题的原因了。确实和Cookies有关,但我完全无法解释是什么原因造成的。

在第一步中,我以管理员用户身份登录。我为此用户保存会话 cookie,然后继续执行 POST 请求。

然而,在第 5 步中,当我想检查客户端页面时,我突然以非管理员用户身份登录(我创建的第二个测试帐户,用于使用非管理员权限进行测试)。

总结一下:

it('log in', () => {
        //in this step I log in as Admin
    })
    it('test some stuff', function () {
        //in this step I am still logged in as Admin
    })
    it('send POST/client request with incorrect values', function () {
        //still logged in as Admin
    })
    it('send POST/client request with correct values', function () {
        //suddenly log in changes to non-Admin account
    })
    it('go to clients page and assert created client', () => {
        //logged in as non-Admin, therefor this test fails
    })
})

我在我的代码中找不到 POST 测试中登录状态发生变化的任何原因。

但即使我找不到原因,我现在可以通过在第 5 步之前添加一个额外的步骤来解决这个问题,该步骤只是作为管理员用户注销并重新登录。

这是导致登录更改的 POST 步骤的代码:

it('send POST/client request with incorrect values', function () {
        cy.request({
            method: 'POST',
            url: Cypress.env('url') + '/service/clients',
            headers: {
                'API-KEY': api_key,
            },
            body: body1,
            failOnStatusCode: false
        })
            .then(response => {
                expect(response.status).to.eq(400)
                expect(response.body.fields).to.contain({
                    "some stuff"
                })
            })
    })

我看不出为什么这个请求应该改变我的会话状态。此外,非管理员用户的登录凭据在此规范文件中无处使用