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

如何在Artillery Playwright测试中配置Google IAP请求头?

问题场景

我用Artillery结合Playwright做浏览器测试,需要为请求设置Google IAP的Proxy-Authorization凭证头。尝试了两种设置请求头的方法,但只要保留头的逻辑,测试就会失败,报错net::ERR_INVALID_ARGUMENT。

我的Artillery配置脚本:

config:
  target: https://website.dev
  # Load the Playwright engine:
  engines:
    playwright:
      launchOptions:
        headless: false
  processor: "./test.js"
scenarios:
  - engine: playwright
    testFunction: "test"

测试代码(两种设置头的方法我都单独试过):

module.exports = { test };
const { getIAPToken } = require('./IAP.js');

async function test(page) {
    const token = await getIAPToken('client_id')

    await page.setExtraHTTPHeaders({
        'Proxy-Authorization': token,
    });

    // Intercept and modify network requests
    await page.route('**', (route) => {
        const headers = {
            'Proxy-Authorization': `${token}`,
        };
        route.continue({ headers });
    });

    await page.goto("https://website.dev/");
}

报错信息:

page.goto: net::ERR_INVALID_ARGUMENT at https://website.dev/
=========================== logs ===========================
navigating to "https://website.dev/", waiting until "load"
解决方案

1. 先确认Token格式正确性

Google IAP的Proxy-Authorization头要求格式为Bearer <token字符串>,先检查getIAPToken返回的内容是否已经包含Bearer 前缀,如果没有,必须手动拼接。

2. 选择单一的请求头设置方式(不要同时用两种)

方式一:用page.setExtraHTTPHeaders(推荐,更简单)

这个方法会在原有请求头基础上追加自定义头,不会覆盖必要的默认头(比如Host、User-Agent):

module.exports = { test };
const { getIAPToken } = require('./IAP.js');

async function test(page) {
    const rawToken = await getIAPToken('client_id');
    // 保证Token格式正确
    const authToken = rawToken.startsWith('Bearer ') ? rawToken : `Bearer ${rawToken}`;

    // 设置额外HTTP头
    await page.setExtraHTTPHeaders({
        'Proxy-Authorization': authToken,
    });

    await page.goto("https://website.dev/");
}

方式二:用page.route拦截修改(需保留原有头)

如果用路由拦截的方式,必须保留原有请求头,直接替换头会导致请求缺少必要字段,触发参数无效错误:

module.exports = { test };
const { getIAPToken } = require('./IAP.js');

async function test(page) {
    const rawToken = await getIAPToken('client_id');
    const authToken = rawToken.startsWith('Bearer ') ? rawToken : `Bearer ${rawToken}`;

    // 拦截请求并修改头,合并原有头和自定义头
    await page.route('**', (route) => {
        const originalHeaders = route.request().headers();
        const modifiedHeaders = {
            ...originalHeaders,
            'Proxy-Authorization': authToken,
        };
        route.continue({ headers: modifiedHeaders });
    });

    await page.goto("https://website.dev/");
}

报错原因说明

你之前的代码存在两个问题:

  • 路由拦截时直接替换了所有请求头,只保留了Proxy-Authorization,导致浏览器请求缺少Host、User-Agent等必要字段,触发net::ERR_INVALID_ARGUMENT错误。
  • 同时使用setExtraHTTPHeaders和page.route两种方式设置头,可能导致头重复或冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:42:55