如何在WebdriverIO中获取扩展Service Worker(后台页面)对象
WebdriverIO测试浏览器扩展:控制弹窗与后台页面
一、启动并控制扩展弹窗
要操作扩展弹窗,核心是获取扩展ID并直接访问弹窗页面:
获取扩展ID
安装扩展后Chrome会分配唯一ID,可通过程序化方式从chrome://extensions/页面提取:// 打开扩展管理页面 await browser.url('chrome://extensions/'); // 开启开发者模式(若未开启) const devModeToggle = await $('//*[@id="devMode"]'); if (!(await devModeToggle.isSelected())) { await devModeToggle.click(); } // 根据扩展名称定位并提取ID(替换成你的扩展名称) const extensionRow = await $(`//div[contains(text(), "你的扩展名称")]/ancestor::div[contains(@class, "extension-item")]`); const extensionId = await extensionRow.getAttribute('id');打开并控制弹窗
扩展弹窗本质是HTML页面,直接访问其chrome-extension://协议URL即可:// 替换为你的弹窗页面路径(通常是popup.html,需匹配扩展内实际文件名) await browser.url(`chrome-extension://${extensionId}/popup.html`); // 像测试普通网页一样操作弹窗元素 await $('#popup-button').click(); await expect($('#popup-result')).toHaveText('操作成功');
二、访问扩展后台页面/Service Worker
1. 访问传统后台页面
如果扩展使用传统后台页面,直接访问其URL即可:
// 替换为你的后台页面路径(通常是background.html) await browser.url(`chrome-extension://${extensionId}/background.html`); // 操作后台页面元素或执行脚本 const backgroundResult = await browser.execute(() => { return window.someBackgroundFunction(); // 调用后台页面的全局函数 });
2. 访问Service Worker(现代扩展)
对于使用Service Worker的扩展,需通过Chrome DevTools Protocol(CDP)连接并执行脚本:
// 获取所有CDP目标 const targets = await browser.send('Target.getTargets'); // 筛选出扩展的Service Worker目标 const backgroundTarget = targets.targetInfos.find(target => target.type === 'service_worker' && target.url.startsWith(`chrome-extension://${extensionId}/`) ); // 附加到该Service Worker目标 await browser.send('Target.attachToTarget', { targetId: backgroundTarget.targetId, flatten: true }); // 在Service Worker环境中执行脚本(替换为你的扩展逻辑) const scriptResult = await browser.send('Runtime.evaluate', { expression: ` // 示例:调用扩展的后台API chrome.storage.local.get('userData', (data) => console.log(data)); // 返回结果供测试断言 Promise.resolve('Service Worker执行成功') `, awaitPromise: true // 执行异步操作时需开启 }); console.log(scriptResult.result.value); // 输出执行结果
内容的提问来源于stack exchange,提问作者irb
相关产品推荐
相关产品推荐

