拦截服务
🕸 在 webdriver.io 中捕获和断言 HTTP ajax 调用
这是 webdriver.io 的一个插件。如果您还不了解它,可以去看看,它 非常酷。
虽然 selenium 和 webdriver 用于 e2e 和特别是 UI 测试,但您可能希望评估客户端代码发起的 HTTP 请求(例如,当您没有立即的 UI 反馈时,如在指标或跟踪调用中)。使用 wdio-intercept-service,您可以拦截由某些用户操作(例如按钮点击等)发起的 ajax HTTP 调用,并在稍后对请求和相应的响应进行断言。
不过有一点需要注意:您无法拦截在页面加载时发起的 HTTP 调用(如大多数 SPA 中的情况),因为这需要在页面加载后才能完成一些设置工作(由于 selenium 的限制)。这意味着您只能捕获在测试内部发起的请求。 如果您对此没有问题,那么这个插件可能适合您,请继续阅读。
先决条件
- webdriver.io v5.x 或更新版本。
注意!如果您仍在使用 webdriver.io v4,请使用此插件的 v2.x 分支!
安装
npm install wdio-intercept-service -D
使用方法
与 WebDriver CLI 一起使用
将 wdio-intercept-service 添加到您的 wdio.conf.js 中应该很简单:
exports.config = {
// ...
services: ['intercept']
// ...
};
这样就设置好了。
与 WebDriver Standalone 一起使用
当使用 WebdriverIO Standalone 时,需要手动调用 before 和 beforeTest / beforeScenario 函数。
import { remote } from 'webdriverio';
import WebdriverAjax from 'wdio-intercept-service'
const WDIO_OPTIONS = {
port: 9515,
path: '/',
capabilities: {
browserName: 'chrome'
},
}
let browser;
const interceptServiceLauncher = WebdriverAjax();
beforeAll(async () => {
browser = await remote(WDIO_OPTIONS)
interceptServiceLauncher.before(null, null, browser)
})
beforeEach(async () => {
interceptServiceLauncher.beforeTest()
})
afterAll(async () => {
await client.deleteSession()
});
describe('', async () => {
... // See example usage
});
初始化后,一些相关函数将添加到您的浏览器命令链中(参见 API)。
快速入门
使用示例:
browser.url('http://foo.bar');
browser.setupInterceptor(); // capture ajax calls
browser.expectRequest('GET', '/api/foo', 200); // expect GET request to /api/foo with 200 statusCode
browser.expectRequest('POST', '/api/foo', 400); // expect POST request to /api/foo with 400 statusCode
browser.expectRequest('GET', /\/api\/foo/, 200); // can validate a URL with regex, too
browser.click('#button'); // button that initiates ajax request
browser.pause(1000); // maybe wait a bit until request is finished
browser.assertRequests(); // validate the requests
获取请求的详细信息:
browser.url('http://foo.bar')
browser.setupInterceptor();
browser.click('#button')
browser.pause(1000);
var request = browser.getRequest(0);
assert.equal(request.method, 'GET');
assert.equal(request.response.headers['content-length'], '42');
支持的浏览器
它应该可以在所有较新版本的浏览器上工作。如果它不能在您的浏览器上工作,请报告问题。
API
查阅 TypeScript 声明文件以获取添加到 WebdriverIO 浏览器对象的自定义命令的完整语法。通常,任何接受"options"对象作为参数的方法都可以在不带该参数的情况下调用,以获得默认行为。这些"可选选项"对象后跟 ?: = {},每个方法的默认值都有描述。