Playwright POST请求间歇性报错:apiRequestContext.post: getaddrinfo ENOTFOUND
Playwright API请求间歇性getaddrinfo ENOTFOUND问题的解决思路
针对你遇到的Playwright中特定API每约15次请求就触发getaddrinfo ENOTFOUND、调试正常但批量运行故障复现的问题,以下是可行的解决方向:
一、给请求添加DNS错误重试机制
间歇性DNS解析失败是这类问题的常见原因,在辅助函数中针对ENOTFOUND错误做重试,搭配指数退避等待,能有效覆盖解析波动:
public static async postJSONX_Access(request: APIRequestContext, endpoint: string, body: object, xAccessToken: string | undefined): Promise<any> { const maxRetries = 3; let lastError: Error | undefined; for (let attempt = 0; attempt < maxRetries; attempt++) { try { const response = await request.post(endpoint, { data: body, headers: { 'X-Access-Token': xAccessToken! }, }); expect(response.ok()); return await response.json(); } catch (error: any) { lastError = error; // 仅针对DNS解析失败的错误触发重试 if (error.message.includes('getaddrinfo ENOTFOUND')) { // 指数退避等待,避免频繁重试加重解析压力 await new Promise(resolve => setTimeout(resolve, 1000 * (attempt + 1))); continue; } // 非DNS错误直接抛出 throw error; } } throw lastError!; }
二、强制指定可靠DNS服务器
本地DNS服务不稳定可能导致解析波动,直接在Playwright配置中指定公共DNS(如谷歌8.8.8.8或Cloudflare 1.1.1.1),绕过本地DNS的潜在问题:
// playwright.config.js import { defineConfig } from '@playwright/test'; import dns from 'dns'; // 配置公共DNS服务器 dns.setServers(['8.8.8.8', '1.1.1.1']); dns.setDefaultResultOrder("ipv4first"); export default defineConfig({ // 你的现有配置项 });
三、排查目标API的DNS配置
仅特定API出现问题,优先检查该域名d-api.company.com的DNS设置:
- 查看DNS记录的TTL值,若TTL过短会导致客户端频繁重新解析,增加失败概率
- 确认域名是否存在多IP记录(IPv4/IPv6),部分IP节点可能存在可用性问题
- 联系运维排查域名的负载均衡或DNS解析服务是否存在波动
四、调整Playwright请求与缓存设置
- 延长请求超时:给不稳定的请求设置更长的超时时间,避免因解析延迟触发失败:
const response = await request.post(endpoint, { data: body, headers: { 'X-Access-Token': xAccessToken! }, timeout: 10000 // 延长至10秒,根据实际情况调整 });
- 重置DNS缓存:在测试套件运行前添加DNS缓存刷新逻辑,避免旧的失效解析记录影响:
// 在测试全局钩子或配置中添加 import { execSync } from 'child_process'; // Windows环境刷新DNS execSync('ipconfig /flushdns'); // macOS/Linux环境 // execSync('sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder');
五、排查本地网络干扰
- 检查防火墙、代理、VPN等工具是否会间歇性拦截DNS请求
- 用curl或Postman批量请求该API,确认是否也出现解析失败,排除Playwright本身的问题
内容的提问来源于stack exchange,提问作者lc74
相关产品推荐
相关产品推荐

