Shopify嵌入应用Playwright E2E测试:iframe连接重置错误求助
问题现象
将部署在fly.io的Shopify应用进行端到端(E2E)测试时,遇到以下问题:
- 通过Playwright的
setup项目完成认证并保存storageState后,后续测试项目加载Shopify嵌入应用的iframe时,大概率(非100%)出现「连接已重置」错误:
- 若将所有测试步骤合并执行,问题出现概率大幅降低,但fly.io服务因闲置停止后仍偶发
- 日常使用Chrome操作应用时仅在标签页长期闲置时偶发,刷新页面即可恢复
当前Playwright配置的项目部分如下:
projects: [ { name: 'setup', use: { ...devices['Desktop Chrome'] }, testMatch: /global\.setup\.ts/, }, { name: 'chromium', use: { ...devices['Desktop Chrome'], storageState: STORAGE_FILE, }, dependencies: ['setup'], },
可能的原因
1. fly.io冷启动与网络兼容性问题
fly.io的基础套餐会在应用闲置一段时间后停止容器,后续请求触发冷启动时,容器初始化需要时间,若Playwright的超时设置不足以等待容器就绪,会导致iframe加载时连接重置。另外你之前安装CLI时需关闭IPv6或优先IPv4,说明你的网络环境下fly.io的IPv6兼容性存在问题,Playwright浏览器可能默认使用IPv6发起请求,而fly.io实例无法响应,引发连接错误。
2. Playwright storageState的会话有效性问题
Shopify嵌入应用的会话可能包含与上下文绑定的临时令牌,这类令牌有效期短,且和初始认证的IP、浏览器指纹强关联。setup项目保存的storageState在后续测试中复用,可能因时间间隔(如冷启动等待时长)导致令牌过期,或因Playwright启动新浏览器实例时指纹变更,被Shopify安全机制拦截,进而触发iframe加载失败。
3. Shopify嵌入iframe的加载时序异常
Shopify嵌入应用的iframe依赖主站的初始化脚本完成前置配置。复用storageState时,Playwright直接跳转目标页面,可能跳过了Shopify主站的部分初始化步骤,导致iframe的加载请求时机异常,引发连接重置。而合并测试步骤时上下文未中断,初始化流程连贯,因此问题概率低。
4. Playwright网络连接池的复用问题
Playwright在setup项目结束后会关闭浏览器实例并清空网络连接池;后续测试启动新实例时重新建立连接,若fly.io负载均衡器未正确释放旧连接,或Playwright的连接复用机制出现异常,会导致连接重置错误。
验证与临时修复方向
- 调整Playwright超时配置,在iframe加载前增加显式等待(如等待Shopify主站的特定元素加载完成后再操作iframe)
- 在
setup项目结束后立即触发后续测试,减少storageState闲置时间;或在后续测试开始前,先发起简单请求到fly.io应用触发容器暖启动 - 强制Playwright使用IPv4:在配置中添加
launchOptions: { args: ['--disable-ipv6'] },规避IPv6连接问题 - 检查
storageState中的令牌有效期,尝试在后续测试开始前访问Shopify授权页面触发会话续期
内容的提问来源于stack exchange,提问作者Gavin

