如何在Karate UI中用单个Chrome驱动实例执行多测试用例并复用登录状态
解决方案
1. 全局钩子+共享浏览器实例(适配多数Web自动化框架)
- 在全局前置钩子(如
beforeAll/beforeSuite,依测试框架而定)中完成登录逻辑,同时将浏览器实例挂载到全局对象(比如Node.js的global,或框架提供的上下文对象)。 - 所有测试场景直接调用全局实例执行操作,无需重复初始化驱动。
- 在全局后置钩子(如
afterAll/afterSuite)中执行登出并关闭浏览器实例。
示例代码(WebdriverIO 场景):
// wdio.conf.js exports.config = { // 其他配置项... beforeSession: async (config, capabilities, specs) => { // 初始化驱动并完成登录 await driver.init(); await driver.url('https://your-login-domain.com'); await driver.$('#username').setValue('test-user'); await driver.$('#password').setValue('test-pass'); await driver.$('#submit-btn').click(); // 确认登录成功后进入后续流程 await driver.waitUntil(() => driver.$('#dashboard').isDisplayed()); }, afterSession: async (config, capabilities, specs) => { // 执行登出操作 await driver.$('#logout-btn').click(); // 销毁会话 await driver.deleteSession(); }, // 禁用测试用例间的浏览器重启 restartBrowserBetweenTests: false, };
2. 测试套件分组+会话信息传递
若框架不支持全局钩子,可将所有需复用登录状态的用例归为同一测试套件:
- 在套件的
before钩子中完成登录,保存会话标识(如Cookie、LocalStorage 数据)。 - 套件内每个测试用例执行前,自动注入已保存的会话信息,跳过重复登录。
- 在套件的
after钩子中执行登出并清理资源。
示例代码(Mocha 场景):
describe('登录后统一执行测试场景', function() { let sessionCookies; let driver; before(async function() { // 初始化驱动并完成登录 driver = await new Builder().forBrowser('chrome').build(); await driver.get('https://your-login-domain.com'); // 登录操作逻辑... // 保存会话Cookie sessionCookies = await driver.manage().getCookies(); }); beforeEach(async function() { // 注入Cookie维持登录状态 await driver.manage().deleteAllCookies(); for (const cookie of sessionCookies) { await driver.manage().addCookie(cookie); } await driver.get('https://your-test-page.com'); }); it('测试场景1:验证用户信息展示', async function() { // 测试逻辑(已处于登录状态) const userInfo = await driver.$('#user-info').getText(); assert.equal(userInfo, 'test-user'); }); it('测试场景2:执行权限操作', async function() { // 测试逻辑(已处于登录状态) await driver.$('#admin-action').click(); await driver.waitUntil(() => driver.$('success-alert').isDisplayed()); }); after(async function() { // 执行登出 await driver.get('https://your-logout-domain.com'); // 关闭驱动 await driver.quit(); }); });
3. 浏览器会话复用(基于浏览器参数)
部分浏览器支持通过指定用户数据目录复用会话,比如 Chrome 的user-data-dir参数:
- 启动浏览器时指定固定的用户数据目录,让浏览器自动保存登录状态到本地。
- 所有测试用例复用该目录启动浏览器,无需重复登录。
- 测试结束后在全局钩子中执行登出,可选清理用户数据目录。
示例代码(Selenium Python 场景):
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 指定用户数据目录,实现会话复用 chrome_options.add_argument("--user-data-dir=./chrome-session-data") driver = webdriver.Chrome(options=chrome_options) # 首次启动完成登录,后续启动自动复用状态 driver.get("https://your-login-domain.com") # 登录操作逻辑... # 执行所有测试场景 # ... # 最后执行登出并关闭浏览器 driver.get("https://your-logout-domain.com") driver.quit()
内容的提问来源于stack exchange,提问作者piyush kedar
相关产品推荐
相关产品推荐

