使用Cypress自动化时点击链接后网站意外登出问题求助
Cypress点击特定标签后网站意外登出问题排查与解决
问题场景
使用Cypress对https://admin.britex.pw/进行自动化测试时,执行多个it块后,触发cy.get('table#table tbody tr').first().find('td').eq(2).find('a').click()命令会导致网站意外登出,但手动操作无此问题。已设置testIsolation:false,跳过该点击命令则测试流程正常。
排查与解决方案
1. 验证目标标签的实际跳转地址
先确认点击的链接是否误指向登出页面,排除元素定位错误:
cy.get('table#table tbody tr').first().find('td').eq(2).find('a') .invoke('attr', 'href') .then(href => { cy.log('目标链接地址:', href); // 验证地址是否符合预期,排除登出路径 expect(href).not.to.include('/logout'); });
2. 优化元素定位逻辑,避免DOM重查询问题
原代码在then回调中重新查询DOM元素,可能因页面状态变化导致定位到错误元素。建议用别名缓存目标行,减少重复查询:
it('Selecting user to create a custom invoice', () => { cy.get('.form-control#validationDefaultUsername') .should('be.visible') .clear() .type('muhammadafnan.senarios@gmail.com'); cy.get('li>.searchEmail').click({ force: true }); cy.wait(3000); // 缓存目标行元素 cy.get('table#table tbody tr').first().as('targetUserRow'); cy.get('@targetUserRow').invoke('text').then((value) => { cy.log('目标行内容:', value); // 使用缓存的元素执行点击操作 cy.get('@targetUserRow').find('td').eq(2).find('a').click(); cy.wait(5000); }); });
3. 用cy.session管理登录状态(官方推荐)
虽然设置了testIsolation:false,但跨it块的会话保持仍可能不稳定。改用cy.session持久化登录状态,确保各测试块间会话一致:
describe('', () => { before(() => { Cypress.on('uncaught:exception', (err, runnable) => { return false; }); // 用cy.session封装登录逻辑,持久化会话 cy.session('admin-login', () => { cy.visit("https://admin.britex.pw", { failOnStatusCode: false }); cy.loginAdmin('gulraiz@gmail.com', '12345678'); }, { // 配置会话验证规则,确保登录状态有效 validate() { cy.visit("https://admin.britex.pw"); cy.get('.custom-select[name="company"]').should('be.visible'); } }); }); it('Selecting Teltik Test as Company', () => { cy.visit("https://admin.britex.pw"); cy.get('.custom-select[name="company"]').select('1'); cy.wait(2000); cy.get('.swal-button').click(); cy.wait(6300); }); // 其余测试块保持逻辑不变,无需重复登录 });
4. 检查点击事件的前端逻辑
手动操作正常但Cypress触发异常,可能是前端事件绑定存在差异:
- 打开浏览器开发者工具,查看目标标签的
click事件监听器,确认是否存在误绑定的登出逻辑 - 尝试用
{force: true}强制触发点击,避免元素不可见或覆盖导致的异常:cy.get('@targetUserRow').find('td').eq(2).find('a').click({ force: true }); - 点击后立即验证当前URL,确认是否跳转到登录页:
cy.get('@targetUserRow').find('td').eq(2).find('a').click(); cy.url().should('not.include', '/login'); // 验证未跳转到登录页
5. 禁用不必要的缓存清理
原before钩子中清理了所有缓存,但cy.session会自动管理会话,可移除冗余的清理命令:
before(() => { Cypress.on('uncaught:exception', (err, runnable) => { return false; }); // 移除以下清理命令,避免影响会话持久化 // cy.clearCookies(); // cy.clearLocalStorage(); // cy.clearAllSessionStorage(); });
内容的提问来源于stack exchange,提问作者Muhammad Afnan
相关产品推荐
相关产品推荐

