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

如何在WebdriverIO中获取扩展Service Worker(后台页面)对象

WebdriverIO测试浏览器扩展:控制弹窗与后台页面

一、启动并控制扩展弹窗

要操作扩展弹窗,核心是获取扩展ID并直接访问弹窗页面:

  1. 获取扩展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');
    
  2. 打开并控制弹窗
    扩展弹窗本质是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:31:06