You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Protractor如何在it块间保持浏览器打开,避免重复登录?

当然有办法啦!在Protractor里,我们完全可以做到让浏览器在各个it块之间保持打开状态,不用每次都重复登录操作。下面给你分享几个实用的方案,你可以根据自己的测试场景来选:

方案一:复用浏览器实例(最简单的方式)

Protractor默认提供了控制浏览器实例是否重启的配置项。你只需要在测试配置文件(一般是conf.js)里,把restartBrowserBetweenTests设为false就行:

exports.config = {
  // 其他配置项(比如selenium地址、测试文件路径等)...
  restartBrowserBetweenTests: false,
  // 其他配置项...
};

这样一来,整个测试套件只会启动一次浏览器,所有的it测试块都会在同一个浏览器会话里执行——登录状态自然就被保留下来了。

不过要注意:这种方式下,你的测试用例之间最好是独立的,或者在每个it块结束后清理掉测试产生的数据,避免用例之间互相干扰哦。

方案二:用beforeAll只执行一次登录

如果你的整个测试套件所有用例都依赖登录状态,那直接把登录逻辑放在beforeAll钩子里面就好!beforeAll只会在整个测试套件开始前执行一次,之后所有it块都能复用这个登录后的会话:

describe('登录后的页面测试套件', () => {
  beforeAll(async () => {
    // 执行登录流程
    await browser.get('/login');
    await element(by.id('username-input')).sendKeys('你的用户名');
    await element(by.id('password-input')).sendKeys('你的密码');
    await element(by.id('login-submit-btn')).click();
    
    // 等待登录完成,跳转到目标页面
    await browser.wait(until.urlContains('/dashboard'), 5000);
  });

  it('验证主页欢迎文案', async () => {
    // 这里直接操作已登录状态下的元素
    const welcomeText = await element(by.className('welcome-text')).getText();
    expect(welcomeText).toBe('欢迎回来!');
  });

  it('测试用户设置跳转', async () => {
    // 同样复用登录状态,无需再次登录
    await element(by.linkText('设置')).click();
    expect(await browser.getCurrentUrl()).toContain('/settings');
  });
});

这个方案的优势是测试结构清晰,还能节省重复登录的时间。但如果某个it块会修改登录状态(比如执行退出登录操作),那后面的用例就会受影响——这时候可以把这类特殊用例单独放在一个describe块里,或者在afterEach里恢复登录状态。

方案三:保存并恢复登录Cookies(适合需要重启浏览器的场景)

如果因为测试需求必须重启浏览器,但又不想重复登录,那可以通过保存登录后的Cookies,在每个it块开始前恢复Cookies来维持登录状态:

let loginCookies;

beforeAll(async () => {
  // 先执行一次完整的登录流程
  await browser.get('/login');
  // ...(输入账号密码、点击登录的逻辑)
  await browser.wait(until.urlContains('/dashboard'), 5000);
  
  // 保存登录后的所有Cookies
  loginCookies = await browser.manage().getCookies();
});

beforeEach(async () => {
  await browser.get('/dashboard');
  // 清除当前浏览器的所有Cookies
  await browser.manage().deleteAllCookies();
  // 逐个添加之前保存的登录Cookies
  for (const cookie of loginCookies) {
    await browser.manage().addCookie(cookie);
  }
  // 刷新页面让Cookies生效
  await browser.refresh();
});

it('测试仪表盘数据展示', async () => {
  // 此时已经是登录状态了
  const dataCount = await element(by.className('data-item')).count();
  expect(dataCount).toBeGreaterThan(0);
});

这个方案灵活性很高,但要注意:有些网站除了Cookies,还会用Session Storage来存储登录状态,这种情况下你可能还需要额外保存和恢复Session Storage的内容。

最后再提醒一句:不管用哪种方案,都要尽量保证测试用例的独立性,避免前一个用例的操作影响后一个用例的结果哦!

内容的提问来源于stack exchange,提问作者user2683029

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:07:26