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

TypeScript Playwright中如何正确传递自定义请求头x-my-api-token?

解决Playwright API测试中自定义请求头不生效的问题

核心问题:APIRequestContext实例传递错误

你在初始化DataApi时,传入的是导入的request模块,而非Playwright测试上下文提供的APIRequestContext实例,这直接导致自定义请求头无法被正确应用。

修正方案

1. 修正测试代码的实例传递

从测试上下文获取request对象(而非导入的模块),传入DataApi构造函数:

import { request, test, APIRequestContext } from "@playwright/test"

class DataApi {
    constructor(private context: APIRequestContext) { }

    public async getDataForEntity(token: string, entityId?: string): Promise<JSON> {
        const response = await this.context.get(`https://api.example.com/activities/${entityId}`, {
            headers: {
                Accept: "application/json",
                Authorization: `Bearer ${token}`,
                'x-my-api-token': token
            },
        });
        return await response.json();
    }
}

test("Data API", ({ request }) => { // 从测试上下文获取合法的APIRequestContext
    let dataApi: DataApi;

    test.beforeAll(async () => {
        dataApi = new DataApi(request); // 传入正确的实例
    });

    const token = "sample_token";
    const entityId = "12345";

    test.step("should fetch data for an entity", async () => {
        const data = await dataApi.getDataForEntity(token, entityId);
        console.log(data);
    });
});

2. 为什么page.setExtraHTTPHeaders无效?

page.setExtraHTTPHeaders仅作用于浏览器页面发起的请求,而APIRequestContext是独立的HTTP客户端,两者上下文完全隔离,因此该方法无法影响API请求的头信息。

如果需要给所有API请求统一设置默认头,可以通过request.newContext()创建全局配置的上下文:

test.beforeAll(async () => {
    const apiContext = await request.newContext({
        headers: {
            'x-my-api-token': token // 全局默认自定义头
        }
    });
    dataApi = new DataApi(apiContext);
});

3. 修复语法错误(附带说明)

你之前调用page.setExtraHTTPHeaders存在语法错误,正确写法应为:

await page.setExtraHTTPHeaders({
    'x-my-api-token': token
});

但再次强调:该方法仅对页面请求生效,对APIRequestContext发起的请求无作用。

验证请求头是否生效

可以通过请求拦截打印实际发送的头信息,确认自定义头是否被正确携带:

test.step("should fetch data for an entity", async () => {
    await dataApi.context.route("https://api.example.com/**", (route) => {
        console.log("实际请求头:", route.request().headers());
        route.continue();
    });
    const data = await dataApi.getDataForEntity(token, entityId);
    console.log(data);
});

内容的提问来源于stack exchange,提问作者Gary Young

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:59:58