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,在每个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

