如何在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
相关产品推荐
相关产品推荐

