跳到主要内容

模拟

模拟请求的响应。您可以基于匹配的URLPattern和相应的头部和状态码定义模拟。调用mock方法会返回一个存根对象,您可以使用它来修改Web资源的响应。

通过存根对象,您可以返回自定义响应或使请求失败。

有3种修改响应的方式:

  • 返回自定义JSON对象(用于模拟API请求)
  • 用本地文件替换Web资源(提供修改后的JavaScript文件)或
  • 将资源重定向到不同的URL
信息

请注意,使用mock命令需要支持WebDriver Bidi。当您在基于Chromium的浏览器或Firefox上本地运行测试时,或者使用Selenium Grid v4或更高版本时,通常都支持该功能。如果您在云端运行测试,请确保您的云提供商支持WebDriver Bidi。

信息

URLPattern是一项实验性技术,在某些环境中尚未得到支持,例如Node.js。 我们建议导入一个polyfill,直到该功能得到更广泛的支持。

用法
browser.mock(url, { method, requestHeaders, responseHeaders, postData, statusCode })
参数
名称类型详情
urlString要模拟的url
filterOptions
可选
MockFilterOptions通过附加选项过滤模拟资源
filterOptions.method
可选
String, Function按HTTP方法过滤资源
filterOptions.requestHeaders
可选
Object, Function按特定请求头过滤资源
filterOptions.responseHeaders
可选
Object, Function按特定响应头过滤资源
filterOptions.postData
可选
String, Function按请求postData过滤资源
filterOptions.statusCode
可选
Number, Function按响应状态码过滤资源
示例
mock.js
it('should mock network resources', async () => {
// via static string
const userListMock = await browser.mock('**' + '/users/list')
// or as regular expression
const userListMock = await browser.mock(/https:\/\/(domainA|domainB)\.com\/.+/)
// you can also specifying the mock even more by filtering resources
// by request or response headers, status code, postData, e.g. mock only responses with specific
// header set and statusCode
const strictMock = await browser.mock('**', {
// mock all json responses
statusCode: 200,
requestHeaders: { 'Content-Type': 'application/json' },
responseHeaders: { 'Cache-Control': 'no-cache' },
postData: 'foobar'
})

// comparator function
const apiV1Mock = await browser.mock('**' + '/api/v1', {
statusCode: (statusCode) => statusCode >= 200 && statusCode <= 203,
requestHeaders: (headers) => headers['Authorization'] && headers['Authorization'].startsWith('Bearer '),
responseHeaders: (headers) => headers['Impersonation'],
postData: (data) => typeof data === 'string' && data.includes('foo')
})
})

it('should modify API responses', async () => {
// filter by method
const todoMock = await browser.mock('**' + '/todos', {
method: 'get'
})

// mock an endpoint with a fixed fixture
todoMock.respond([{
title: 'Injected Todo',
order: null,
completed: false,
url: "http://todo-backend-express-knex.herokuapp.com/916"
}])

// respond with different status code or header
todoMock.respond([{
title: 'Injected Todo',
order: null,
completed: false,
url: "http://todo-backend-express-knex.herokuapp.com/916"
}], {
statusCode: 404,
headers: {
'x-custom-header': 'foobar'
}
})
})

it('should modify text assets', async () => {
const scriptMock = await browser.mock('**' + '/script.min.js')
scriptMock.respond('./tests/fixtures/script.js')
})

it('should redirect web resources', async () => {
const headerMock = await browser.mock('**' + '/header.png')
headerMock.respond('https://media.giphy.com/media/F9hQLAVhWnL56/giphy.gif')

const pageMock = await browser.mock('https://google.com/')
pageMock.respond('https://webdriver.io')
await browser.url('https://google.com')
console.log(await browser.getTitle()) // returns "WebdriverIO · Next-gen browser and mobile automation test framework for Node.js"
})
返回
  • <Mock> return: 一个用于修改响应的模拟对象

Welcome! How can I help?

WebdriverIO AI Copilot