如何在受密码保护的Vercel URL上运行Artillery测试?
解决Vercel密码保护URL的Artillery压测令牌传递问题
问题根源
你的配置中存在两个关键问题导致令牌未正确传递:
- YAML配置里的令牌值使用了不必要的转义符
\",导致头信息格式错误 - Artillery Playwright引擎的
extraHTTPHeaders配置可能未被Playwright的page实例正确继承
修正步骤
1. 修复YAML配置中的头信息格式
修改load-test.yml里的extraHTTPHeaders部分,去掉多余的转义符:
config: target: '<my url>' phases: - duration: 1 # Total duration of the test in seconds arrivalRate: 1 # Initial arrival rate of users per second rampTo: 1 # Ramp up to 1137 users over the duration name: 'Ramp-up Users' engines: playwright: config: extraHTTPHeaders: 'x-vercel-protection-bypass': '<my token>' # 移除不必要的转义符\" baseURL: '<my url>' processor: './automation-test/loadtest/artillery/search.ts' scenarios: - engine: playwright testFunction: 'artilleryScript'
2. 在Playwright代码中强制设置请求头(更可靠)
为确保每个请求都携带令牌,直接在测试脚本中为Playwright的context设置全局请求头,或者在page.goto时显式传递:
方法A:设置全局请求头
修改search.ts,在执行测试前为page的context添加全局头:
import { Page, expect } from '@playwright/test'; async function testSearch(page: Page) { await page.goto('/'); // 用/替代空字符串,语义更清晰 await page.getByTestId('search-input-header').click(); await page.getByTestId('search-input-header').fill('test'); await page.getByTestId('search-input-header').press('Enter'); await expect(page.getByTestId('clear-button')).toBeVisible(); } export async function artilleryScript(page: Page) { // 为当前page的context设置全局请求头,所有请求都会携带该令牌 await page.context().setExtraHTTPHeaders({ 'x-vercel-protection-bypass': '<my token>' }); await testSearch(page); }
方法B:在goto时显式传递头
如果只需要在初始页面加载时传递令牌,也可以直接在page.goto中添加headers参数:
async function testSearch(page: Page) { await page.goto('/', { headers: { 'x-vercel-protection-bypass': '<my token>' } }); // 后续操作保持不变 }
3. 验证令牌有效性
先通过curl命令验证令牌是否能正确绕过Vercel保护:
curl -H "x-vercel-protection-bypass: <my token>" <my url>
如果返回正常页面内容,说明令牌有效;如果返回403或密码验证页面,说明令牌错误或权限不足。
验证修改
重新执行Artillery测试命令:
artillery run load-test.yml
如果配置正确,页面会正常加载,测试函数能找到目标元素,不会再出现超时错误。
内容的提问来源于stack exchange,提问作者Saranya Shanmugam
相关产品推荐
相关产品推荐

