我目前正在解决一个持续存在的问题,希望得到一些指导。我正在利用 Cypress 进行测试,并且我正在尝试找到一种方法来避免每个测试用例重复登录。
以下是我的测试文件:
describe("Authenticated User Validations", () => {
beforeEach(() => {
cy.visit(baseUrl);
cy.login(user, password);
});
it("Login and Verify URL", () => {
cy.url().should('include', '/inventory.html');
});
it("Button Order from A-Z by Default", () => {
cy.contains('A to Z').should('exist');
});
});
Commands.js 文件
const baseUrl = Cypress.env("CYPRESS_BASE_URL");
Cypress.Commands.add('login', (user, password) => {
cy.session([user, password], () => {
cy.visit(baseUrl);
cy.get('[data-test="username"]').type(user);
cy.get('[data-test="password"]').type(password);
cy.get('[data-test="login-button"]').click();
});
});
我很困惑要在哪里添加 cy.visit ,是在 command.js 中,还是在 beforeEach 中,还是在测试中?
我可以在没有会话的情况下使其工作,但每次都会输入并登录。我看到了另一种解决方案,但它对我不起作用
提前致谢
cy.session(id, setup)
是每次调用时都会表现不同的命令。
参数
setup
仅在第一次使用时调用。
第二次调用时,返回保存的数据而不是运行
setup()
。
这是一个小例子
const baseUrl = 'https://example.com'
Cypress.Commands.add('login', (user, password) => {
cy.session([user, password], () => {
console.log('in session setup') // only appear once in the console
cy.visit(baseUrl)
cy.url().should('include', 'example.com') // page is at baseUrl
cy.setCookie('token', 'my-token-123') // simulate a logon cookie
})
})
it('test1', () => {
cy.login('abc', '123')
cy.url().should('include', 'about:blank') // page is at the default blank URL
})
it('test2', () => {
cy.login('abc', '123')
cy.url().should('include', 'about:blank') // page is at the default blank URL
})
测试运行程序对 test1 显示
created
,对 test2 显示 restored
。
在 both 内测试 URL 为
about:blank
,如果没有调用 cy.visit()
,则这是 Cypress 默认页面。
所以,每次测试都必须自己访问你想要测试的页面。
文档的这一部分在哪里调用 cy.visit() 给出了选项
直观上,您似乎应该在登录函数或自定义命令中的 cy.session() 之后立即调用 cy.visit() ,因此它的行为(从后续测试的角度来看)与没有登录函数的行为完全相同cy.session().
但是,如果您想在不同页面上测试某些内容,则需要在测试开始时调用 cy.visit() ...
请参阅会话缓存
为了减少开发时间,在“开放”模式下运行 Cypress 时,会话将被缓存以供 spec 文件重新运行。
因此,当您最初运行规范时,您会看到上面的日志。再次运行,两个测试都标记为 restored,而不是 test1: created,test2: restored。
您必须使用清除所有会话链接手动清除第二次运行。
如果您修改测试,会话应该会自动清除,但我不确定这种情况总是会发生。