公司动态
Playwright 1.56.1离线浏览器包制作与Windows部署指南
简介面向Windows平台自动化测试场景这份资源提供适配Playwright 1.56.1的离线浏览器包专门解决离线或内网隔离环境下无法通过在线命令拉取浏览器内核的痛点。压缩包共663个文件包含pak资源文件、svg图标、dll动态库、js脚本、exe可执行程序和png图片等整体体积约415.03MB覆盖Chromium、Firefox、WebKit等主流浏览器内核及配套依赖解压后放入%USERPROFILE%\AppData\Local\ms-playwright目录即可被Playwright正常识别。已有426人学习使用适合需要在无外网条件下搭建自动化测试环境的开发与测试人员。资源内附了安装完成标记与校验文件可帮助确认包体完整性通过本地路径加载方式可显著降低企业内网环境下的安全风险和部署成本提升Playwright脚本在离线场景下的可移植性与稳定性。无论是本地调试还是服务器端批量执行均可利用该包快速建立可复用的浏览器运行环境。 搞自动化测试的人早晚都会碰上“离线装环境”这道坎。最近在一个内外网隔离的项目里业务机器完全没有外网权限我需要在这台Windows机器上跑Playwright 1.56.1结果playwright install直接报连接失败连浏览器都拉不下来。折腾了一整天最后手工造了一个“适配Playwright 1.56.1的离线浏览器包”——把联网机器上下载好的浏览器缓存整体打包、搬到内网、解压、配路径一次性解决。今天就把这套完整的离线部署方案写出来尤其针对Windows环境因为Windows下的坑比Linux多不少。这篇文章不是讲Playwright怎么用的基础教程而是讲怎么在内网、隔离网络、无外网权限的Windows环境里给Playwright 1.56.1配好可用的浏览器。适合有Python基础、对Playwright有一定了解但正被“浏览器下载失败”“Executable doesnt exist”这类问题折磨的测试开发同学。哪怕你的环境不是完整离线只是下载速度慢得离谱这套思路一样能帮你省下大量等待时间。1. 为什么要单独做离线浏览器包1.1 Playwright的浏览器获取机制Playwright本质上只是一个自动化驱动层它自己不带浏览器。你通过pip install playwright1.56.1装好的是Python这边的库和命令行工具真正的Chromium、Firefox、WebKit还得另外下载。正常情况下你在联网机器上执行python -m playwright install chromium这个命令会从Playwright官方CDN拉取对应版本的浏览器二进制解压到本地缓存目录。Windows下这个缓存目录默认是C:\Users\你的用户名\AppData\Local\ms-playwright这是Playwright在Windows上的固定路径后面所有操作都要围绕这个目录展开。问题在于很多企业的测试环境、生产环境是物理隔离的别说外网连内网软件源都不一定齐全。playwright install在联网机器上很顺滑一放到离线机器上就原形毕露——命令卡住、超时、下载失败各种姿势的花式报错。此时最直接的解法就是在能联网的机器上先把浏览器全部下载好连同整个ms-playwright目录一起打包带着走。1.2 版本匹配为什么这么关键Playwright有一个很硬性的约束每个版本的Playwright库只认对应版本的浏览器构建产物。比如你装的是Playwright 1.56.1那么它内部会有一个固定的浏览器构建号寻找的浏览器目录名也带这个构建号例如chromium-1169、chromium_headless_shell-1169具体数字以1.56.1实际输出为准。如果你拿一套Playwright 1.51时代下载的浏览器缓存放到1.56.1上直接报版本不匹配必须重下。这意味着离线包必须“版本对齐”。常用的做法是在联网机器上先锁定playwright1.56.1安装再下载浏览器这样得到的浏览器构建号一定是1.56.1对应的那一批。千万别拿着旧包去凑省了一步后面填坑填到怀疑人生。2. 离线浏览器包的获取与整理2.1 在联网机器上把浏览器“跑出来”这一步需要有另一台能正常访问外网的Windows机器或者同机临时开代理也能凑合但最干净的方式还是找一台纯联网机器操作。建议装在Windows上不要用Linux或macOS下载后再搬到Windows因为不同操作系统的浏览器二进制文件不通用。你可以联网机器和目标机器都是Windows架构一致直接拷。具体操作# 1. 创建干净虚拟环境并锁定版本 python -m venv .venv .venv\Scripts\activate # 2. 安装指定版本的Playwright pip install playwright1.56.1 # 3. 下载Chromium浏览器也可加firefox、webkit python -m playwright install chromium下载完成后进入%LOCALAPPDATA%\ms-playwright目录你会看到类似的结构C:\Users\dev\AppData\Local\ms-playwright\ ├── chromium-1169\ │ ├── chrome-win\ │ │ ├── chrome.exe │ │ └── ... ├── chromium_headless_shell-1169\ │ ├── chrome-win\ │ └── ...需要注意从Playwright 1.49开始部分版本在install chromium时会同时下载chromium_headless_shell这是为了在headless模式下更轻量地启动浏览器。1.56.1是否默认包含这个目录取决于版本内部逻辑稳妥起见整个目录直接打包就行不用纠结哪些该删。2.2 只下载需要的浏览器而不是全部很多初学的人一上来就执行python -m playwright install不带参数结果把Chromium、Firefox、WebKit全给下了。一套下来好几个GB打包、拷贝、解压都费劲。如果你的自动化项目只跑Chromium就只下Chromium只做兼容性测试最多再加个Firefox。还有一个实用命令--dry-run它不会真正下载而是打印出“如果要安装会下载哪些浏览器、对应什么版本、装到哪个目录”非常适合在做离线包时先确认目标内容python -m playwright install --dry-run我在项目里执行后能清楚地看到1.56.1需要哪些浏览器提前判断能不能精简体积。这个命令在离线机器上也能用因为它不联网只读取本地已装的Playwright版本信息——后面部署验证时会再提到它。2.3 打包时的文件格式选择Windows下打包我推荐直接右键压缩成ZIP或者在命令行里用PowerShell的Compress-Archive。如果目录很大压缩时间会长一点但换来的是传输方便。用ZIP有个小坑ZIP默认不保留可执行文件的Unix权限位但微软的浏览器二进制本身就是Windows PE格式不涉及这个可以忽略。更稳妥的方式是使用tarWindows 10 1709以上系统自带tar.exe它能更好地保留长路径和文件属性cd %LOCALAPPDATA% tar -cvf ms-playwright.tar ms-playwright打包解包用同一个工具一般不会出问题。传输到内网机器后cd %LOCALAPPDATA% tar -xvf ms-playwright.tar这里的注意点也很明确解压时目标位置必须是%LOCALAPPDATA%\ms-playwright否则等于白解压。后面我会详细说自定义路径的方案。3. 离线浏览器包的Windows部署实操3.1 拷贝与放置的正确姿势到了目标Windows机器上第一步不是解压而是先确认这台机器上有没有残留的旧版本缓存。如果之前装过别的Playwright版本ms-playwright目录里可能已经有其他构建号的浏览器文件夹新旧混在一起虽然不冲突但会占用空间。干脆把旧目录改名备份或者直接删掉再放入新的。如果你直接把ZIP包里的ms-playwright文件夹解压到了D:\tools\之类的地方也没有关系Playwright允许通过环境变量指定浏览器缓存目录。但为了不变更太多环境配置最简单的路径还是原封不动放到默认位置C:\Users\目标机器用户名\AppData\Local\ms-playwright注意目标机器上的用户名很可能和联网下载时用的用户名不一样。比如打包的机器用户名是dev目录里记录的路径在打包时不固化Playwright是运行时通过os.environ定位的所以放到目标机器后路径会随当前Windows用户变化——不用修改包内部任何东西只要确保最终解压到当前用户的AppData\Local下就行。3.2 设置PLAYWRIGHT_BROWSERS_PATH环境变量如果你不想把浏览器缓存放在默认的AppData下或者当前项目希望用一个独立的浏览器目录那就要用到PLAYWRIGHT_BROWSERS_PATH这个环境变量。这是我在内网项目里最推荐的做法因为目标机器C盘空间紧张而浏览器解压后动辄一两百MB放D盘更合适。:: 以管理员身份或当前用户身份设置用户环境变量推荐用用户变量避免影响全局 setx PLAYWRIGHT_BROWSERS_PATH D:\playwright_browsers\ms-playwright设置完之后一定要重新打开一个命令行窗口才能生效因为setx写入的是注册表里的持久化环境变量当前已打开窗口并不会自动读取新的值。这一步很多人忽略结果下次运行时还是抱“找不到浏览器”的错。如果你在Python代码里运行Playwright也可以在启动前临时在代码里设置环境变量这样不用改系统级配置适合想把依赖局限在项目内的场景import os os.environ[PLAYWRIGHT_BROWSERS_PATH] rD:\playwright_browsers\ms-playwright不过要注意一点必须在sync_playwright()启动之前设置这个环境变量否则Playwright读取不到。3.3 验证安装的有效方法部署完成后别急着跑完整自动化脚本先用一段最简单的Python代码验证浏览器能不能正常启动from playwright.sync_api import sync_playwright with sync_playwright() as p: browser p.chromium.launch(headlessTrue) page browser.new_page() page.goto(https://example.com) print(页面标题:, page.title()) browser.close() print(浏览器启动成功)如果这个脚本顺利打印出标题说明浏览器包路径无误、版本匹配、chromium可执行文件权限正常。如果是内网机器https://example.com可能也访问不了可以把page.goto指向一个内网测试地址或者干脆只做browser.new_page()和打印浏览器版本with sync_playwright() as p: browser p.chromium.launch(headlessTrue) print(browser.version) browser.close()只要能打印出类似140.0.x.x的版本号就说明启动链路已经通了。另外可以先在目标机器上跑一次python -m playwright install --dry-run输出里会列出浏览器缓存目录预期路径把它和实际目录比对能快速暴露路径不匹配问题。4. 我踩过的坑与排查心得4.1 启动报错“Executable doesnt exist”这是我离线部署时遇到频率最高的一个问题。报错长这样Error: Executable doesnt exist at C:\Users\xxx\AppData\Local\ms-playwright\chromium-1169\chrome-win\chrome.exe可能原因有三类浏览器包根本没有解压到当前用户对应的AppData\Local\ms-playwright下。注意不同用户登录Windows后环境变量%LOCALAPPDATA%不同即使你解压到了另一个用户的目录里当前用户依然找不到。解压层级多套了一层。比如ZIP包内本来就有ms-playwright文件夹你又手动新建了一层ms-playwright再解压进去路径变成...\ms-playwright\ms-playwright\...必然识别不了。只拷贝了chromium-xxx目录漏掉了chromium_headless_shell目录。某些Playwright版本在headless模式下需要另找headless shell少一个都会报错。排查办法很简单用dir命令确认完整目录结构再用一个测试脚本启动。4.2 版本不匹配导致的崩溃有时候浏览器能启动但跑到一半或者一执行某些API就崩溃大多和版本错位有关。我遇到过拿Playwright 1.52的浏览器缓存给1.56.1用的情况结果报Browser is not supported by the current Playwright. Please install a supported browser.这种错还比较友好直接告诉你版本不对。更隐藏的错是浏览器启动后异常退出、页面加载空白、点击无效。如果不确定版本检查一下浏览器目录名里的构建号。Playwright在Windows下的目录名规则是浏览器名-构建号例如chromium-1100这种。每个版本的Playwright对应的构建号是固定的在联网机器上跑一次python -m playwright install chromium记下输出里的目录名再和目标机器上的比对。不一致就说明你带的包和Playwright版本对不上。4.3 Windows解压产生的长路径问题ms-playwright目录里的路径嵌套很深尤其Chromium的chrome-win下面还有层层子目录。Windows传统路径最大支持260字符默认情况下解压过程中很容易出现“Cannot create a file when that file already exists”或“文件名或扩展名太长”的错误。解决办法有两个一是用7-Zip来解压。7-Zip对长路径处理得比自带资源管理器好一些遇到超长路径会给出弹窗提示可以勾选“自动解压长路径”。二是干脆使用tar.exe命令解压tar在Windows 10 1803以后自带对长路径的兼容性比explorer.exe的右键解压好不少。实际项目里我都是用tar命令一条条解省心省力。4.4 缺少Visual C运行库这个坑特别隐蔽。Chromium在Windows上运行依赖系统的Visual C Redistributable离线机器如果很久没打补丁可能缺这玩意。表现就是浏览器启动时窗口一闪而过或者直接抛The procedure entry point ... could not be located的错误。解决办法是在内网机器上提前安装Microsoft Visual C 2015-2022 Redistributable如果说内网没有安装包就在联网机器上下好带进去。别觉得这是小概率事件我在两台干净的Windows Server上部署时全部中了招简直跟写好了剧本一样。4.5 场景实践一个完整的故障排查过程给你还原一次我踩坑的全过程方便照镜子。某次我在目标机上配好环境变量、解压完毕信心满满地跑测试脚本却报Executable doesnt exist。第一反应是环境变量没生效我用echo %PLAYWRIGHT_BROWSERS_PATH%一查路径没问题。又去目录里翻发现chromium-1169确实存在。后来仔细看才发现报错信息里的路径是C:\Users\oldadmin\AppData\Local\ms-playwright\...而当前登录用户是johndoe问题明摆着是缓存目录里的路径是按旧用户名解析的。原来Playwright在某次版本改动后如果找不到PLAYWRIGHT_BROWSERS_PATH就会回退到当前用户的%LOCALAPPDATA%而我对目标机器设置的是系统级环境变量PLAYWRIGHT_BROWSERS_PATH但旧会话没有刷新。重启终端后就正常了。这类问题必须结合报错信息里的实际路径逐个拆解不能凭感觉处理。4.6 经验沉淀离线包的三条铁律最后沉淀几条经验都是真金白银换来的第一永远在联网机器上锁定版本再下载浏览器包。锁定playwright1.56.1之后执行install chromium得到的包才是1.56.1能认识的。不要用其他版本拼凑拼到最后耗时又耗力。第二打包时保留完整的ms-playwright目录不做取舍。有些文件看起来没用比如ffmpeg、LICENSE但少一个说不定就触发稀奇古怪的错。我传包的时候习惯打成ZIP控制体积在可接受范围内不强行裁剪。第三在目标机上准备一份校验记录。把目录结构、构建号、文件大小、解压后的绝对路径都记到一个README.txt里下次遇到问题直接对照这份记录排错不用重新摸索。这套离线部署方案我先后在几台Windows 10、Windows Server 2019上验证过Playwright 1.56.1配套的chromium包可以稳定跑完冒烟测试和回归用例。只要版本对齐、路径正确、运行库齐全离线环境里的Playwright用起来和联网机器没有任何差别。如果你正在内网环境里跟“浏览器下载失败”死磕照着上面的步骤走一遍基本能一次通关。本文还有配套的精品资源点击获取