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

WebdriverIO v9中带通配符的browser.mock()失效求助

WebdriverIO v9 恢复外部图片Mock能力的解决方案

问题背景

升级WebdriverIO到v9后,原有的外部图片Mock代码失效:

const imageMock = await browser.mock('/my/company/resources/**', { method: 'get' })
await imageMock.respond(`${browser.options.baseUrl}/img/default_image.svg`, {  
     statusCode: 200   
})

原因是v9不再支持glob通配符(如**),*会被当作字面量解析,但官方文档仍保留通配符示例,存在误导性。尝试精确匹配URL虽有效但不够灵活,传入URLPattern实例时*会被转义为\*;使用network.beforeRequestSent结合provideResponse的方案也未生效。

有效解决方案

方案1:使用正则表达式替代通配符

WebdriverIO v9的browser.mock支持直接传入正则表达式作为URL匹配规则,完全可以替代原有的glob通配符效果:

// 用正则匹配/my/company/resources/下的所有子路径
const imageMock = await browser.mock(/^\/my\/company\/resources\/.*$/, { method: 'get' })
await imageMock.respond(`${browser.options.baseUrl}/img/default_image.svg`, {  
     statusCode: 200   
})

正则表达式可按需调整,比如匹配特定后缀的图片:/^\/my\/company\/resources\/.*\.(svg|png|jpg)$/

方案2:修复CDP network.provideResponse的用法

之前的代码未生效是因为参数传递错误,CDP的network.provideResponse需要传入requestId而非完整的request对象,同时body部分无需重复转码:

browser.on('network.beforeRequestSent', async (event) => {
  if (event.request.url.includes('/some/url/to/image/')) {
    // 1x1透明PNG的base64编码
    const placeholderBase64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==';

    await browser.send({
      method: 'network.provideResponse',
      params: {
        requestId: event.requestId, // 关键:传入requestId而非request对象
        statusCode: 200,
        headers: [{ name: 'Content-Type', value: 'image/png' }],
        body: placeholderBase64 // 直接使用base64字符串
      }
    })
  }
})

额外说明

目前WebdriverIO官方文档中仍存在**通配符的示例,与实际v9的行为不符,建议向官方提交issue修正文档内容。

内容的提问来源于stack exchange,提问作者Piotr Słowik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:12:44