赛普拉斯为完整的测试套件保留 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"
})
})
})
我看不出为什么这个请求应该改变我的会话状态。此外,非管理员用户的登录凭据在此规范文件中无处使用
我正在测试要求您在执行测试时登录。为了保持登录状态,我在测试期间保留了 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"
})
})
})
我看不出为什么这个请求应该改变我的会话状态。此外,非管理员用户的登录凭据在此规范文件中无处使用