Playwright "Executable doesn't exist" 오류 — 브라우저 실행 파일이 없을 때 윈도우에서 재현하고 푼 기록
Playwright는 설치된 버전에 맞는 브라우저 번호 폴더(예: chromium_headless_shell-1243)를 찾습니다. 그 폴더가 없으면 Executable doesn't exist로 멈춥니다.
한 줄로
Playwright는 설치된 버전에 맞는 브라우저 번호 폴더(예: chromium_headless_shell-1243)를 찾습니다. 그 폴더가 없으면 Executable doesn't exist로 멈춥니다. npx playwright install chromium으로 받으면 풀리지만, Playwright MCP는 자기 안에 든 다른 Playwright 버전의 번호(chromium-1244)를 찾았습니다. 그래서 MCP 쪽은 오류 문구가 안내한 npx @playwright/mcp install-browser chrome-for-testing을 따로 실행해야 했습니다.
2026-09-28 보완: 본문의 Windows 오류·다운로드·성공 출력은 2026-09-17 기록입니다. 글 뒤쪽의 공개 파일로 다시 확인하기에는 당시 비공개 launch.js 대신 사용할 새 파일과 별도 Linux 확인 범위를 넣었습니다. Windows 재실측으로 바꾸지 않았습니다.
증상
스크립트에서 chromium.launch()를 부르면 이렇게 끝납니다.
browserType.launch: Executable doesn't exist at C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\chromium_headless_shell-1243\chrome-headless-shell-win64\chrome-headless-shell.exe
╔════════════════════════════════════════════════════════════╗
║ Looks like Playwright was just installed or updated. ║
║ Please run the following command to download new browsers: ║
║ ║
║ npx playwright install ║
║ ║
║ <3 Playwright Team ║
╚════════════════════════════════════════════════════════════╝Playwright MCP(--browser chromium)에서 browser_navigate를 부르면 도구 결과가 오류로 돌아옵니다.
### Error
Error: Browser "chrome-for-testing" is not installed; expected executable at C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\chromium-1244\chrome-win64\chrome.exe. Run `npx @playwright/mcp install-browser chrome-for-testing` to install둘 다 일부러 만든 상황입니다. PLAYWRIGHT_BROWSERS_PATH를 빈 임시 폴더(browsers18)로 지정해 재현했습니다. 개인 브라우저 캐시(%LOCALAPPDATA%\ms-playwright)는 하위 폴더 이름만 실험 전후로 비교했고 같았습니다(내용은 열지 않음).
실측 환경
| 항목 | 값 |
|---|---|
| OS | Windows 11 Home (10.0.26200) |
| 셸 | Git Bash (명령 실행·로그) |
| Node.js | v24.19.0 |
playwright (임시 폴더에 로컬 설치) | Version 1.63.0 (npm view playwright version = 1.63.0) |
| Playwright MCP | @playwright/mcp@latest, 서버가 밝힌 버전 1.64.0-alpha-2026-09-14 |
| 브라우저 폴더 | PLAYWRIGHT_BROWSERS_PATH=C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18 (시작 시 비어 있음) |
왜 이러나 — 버전마다 찾는 폴더가 다르다
npm install playwright는 2초 만에 끝났고(added 2 packages), 그 뒤에도 browsers18은 비어 있었습니다. 패키지 설치와 브라우저 설치는 별개였습니다. 어디에 무엇을 받을지는 --dry-run으로 설치 없이 볼 수 있습니다.
PLAYWRIGHT_BROWSERS_PATH='C:/Users/User/AppData/Local/Temp/longtail_C2/browsers18' npx playwright install --dry-run chromiumChrome for Testing 153.0.8010.12 (playwright chromium v1243)
Install location: C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\chromium-1243
...
Chrome Headless Shell 153.0.8010.12 (playwright chromium-headless-shell v1243)
Install location: C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\chromium_headless_shell-1243환경변수 없이 같은 --dry-run을 돌리면 설치 위치가 C:\Users\User\AppData\Local\ms-playwright\chromium-1243으로 바뀌었습니다. 이 PC의 그 폴더에는 chromium-1234, chromium_headless_shell-1234는 있었지만 1243번 폴더는 없었습니다. 환경변수 없이 실행했어도 1.63.0은 1243번 폴더를 찾지 못했을 것으로 봅니다(돌려 보지는 않았습니다). 예전에 받아 둔 1234번 폴더는 1.63.0이 찾는 번호와 맞지 않았습니다.
스크립트(1.63.0, 헤드리스)는 chromium_headless_shell-1243을 찾았고, MCP(1.64.0 알파, --headless --browser chromium)는 chromium-1244\chrome-win64\chrome.exe를 찾았습니다. 한 폴더에 두 버전의 브라우저가 따로 필요했습니다.
해결 1 — 스크립트용: npx playwright install chromium
export PLAYWRIGHT_BROWSERS_PATH='C:/Users/User/AppData/Local/Temp/longtail_C2/browsers18'
npx playwright install --no-progress chromiumChrome for Testing 153.0.8010.12 (playwright chromium v1243) downloaded to C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\chromium-1243
FFmpeg (playwright ffmpeg v1011) downloaded to C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\ffmpeg-1011
Chrome Headless Shell 153.0.8010.12 (playwright chromium-headless-shell v1243) downloaded to C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\chromium_headless_shell-1243
Winldd (playwright winldd v1007) downloaded to C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\winldd-1007chromium 하나를 지정해도 네 가지를 받았습니다. 뒤이은 폴더 목록·크기 확인 명령까지 합쳐 30초 걸렸고, 설치 뒤 크기는 이랬습니다(du -sh 기준).
| 폴더 | 크기 |
|---|---|
chromium-1243 | 433M |
chromium_headless_shell-1243 | 271M |
ffmpeg-1011 | 3.4M |
winldd-1007 | 260K |
| 합계 | 707M (du -sb 739,893,941바이트) |
npx playwright install --help에는 --only-shell(헤드리스 셸만)과 --no-shell(헤드리스 셸 제외) 옵션이 있습니다. 헤드리스로만 쓴다면 받는 양을 줄일 수 있어 보이지만, 이번에는 돌려 보지 않았습니다.
당시 비공개 launch.js를 다시 돌리자 바로 됐습니다. 아래는 2026-09-17 출력입니다. 지금 사용할 수 있는 공개 대체 파일과 실행 명령은 글 뒤쪽에 있습니다.
PLAYWRIGHT_BROWSERS_PATH= C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18
browser version: 153.0.8010.12
title: longtail C2 18
OK 0.5s해결 2 — MCP용: 오류 문구가 안내한 명령
1243번을 받은 뒤에도 MCP는 똑같이 chromium-1244가 없다는 오류를 냈습니다. 오류 문구에 적힌 명령을 같은 환경변수로 실행했습니다.
export PLAYWRIGHT_BROWSERS_PATH='C:/Users/User/AppData/Local/Temp/longtail_C2/browsers18'
npx -y @playwright/mcp@latest install-browser --no-progress chrome-for-testingChrome for Testing 154.0.8037.0 (playwright chromium v1244) downloaded to C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\chromium-1244
Chrome Headless Shell 154.0.8037.0 (playwright chromium-headless-shell v1244) downloaded to C:\Users\User\AppData\Local\Temp\longtail_C2\browsers18\chromium_headless_shell-1244확인 명령까지 합쳐 27초 걸렸고 chromium-1244 435M, chromium_headless_shell-1244 273M가 늘어 폴더 전체가 1.4G가 됐습니다. 표준오류에는 프로젝트 의존성을 먼저 설치하라는 WARNING: It looks like you are running 'npx playwright install' without first installing your project's dependencies. 상자가 찍혔습니다. 확인 명령까지 묶은 전체 종료 코드는 0이었고, 설치 명령 하나만의 종료 코드는 따로 기록하지 않았습니다. install-browser --help를 치면 npx playwright install --help와 같은 도움말이 나왔습니다.
그 뒤 MCP의 browser_navigate는 성공했습니다(Page Title: longtail C2 test page, 확인용 클라이언트가 서버를 띄운 뒤 3.5초). 이미 받아 둔 1243번은 지워지지 않았고, 스크립트도 다시 OK 0.3s로 돌았습니다.
결과
| 순서 | 실행 | 결과 |
|---|---|---|
| 1 | 스크립트 node launch.js (빈 폴더) | 종료 코드 1, Executable doesn't exist … chromium_headless_shell-1243 … |
| 2 | MCP browser_navigate (빈 폴더) | isError=true, Browser "chrome-for-testing" is not installed … chromium-1244 … |
| 3 | npx playwright install --no-progress chromium | 확인 명령 포함 30초, 707M, 묶음 종료 코드 0 |
| 4 | 스크립트 재실행 | 성공, browser version: 153.0.8010.12 |
| 5 | MCP 재실행 | 여전히 chromium-1244 없음 오류 |
| 6 | npx -y @playwright/mcp@latest install-browser --no-progress chrome-for-testing | 확인 명령 포함 27초, 폴더 합계 1.4G, 묶음 종료 코드 0 |
| 7 | MCP 재실행 / 스크립트 재실행 | 둘 다 성공 |
| 8 | 임시 폴더 longtail_C2(1.5G) rm -rf | 종료 코드 0, 폴더 없음 확인 |
| - | %LOCALAPPDATA%\ms-playwright 하위 폴더 이름 | 실험 전, 두 번의 설치 뒤, 임시 폴더 삭제 뒤 모두 같음(내용은 열지 않음) |
실패한 것
- 순서 1·2와 5는 일부러 만든 실패입니다.
- MCP 경로 첫 재현 두 번은 저희 쪽 실수였습니다. 설정 파일을 만들면서 윈도우 경로의 역슬래시를 잘못 처리해 한 번은 JSON 파싱 오류(
Bad escaped character in JSON)가 났습니다. 다른 한 번은 값이C:UsersUser…처럼 깨졌고, 서버는 그 값을 작업 폴더 기준 상대 경로(…\longtail_C2\mcp18\UsersUser…)로 해석해 오류를 냈습니다. 경로를 슬래시(C:/Users/...)로 쓴 뒤에야 의도한 폴더로 재현됐습니다. 환경변수 값이 이상하면 오류 문구의expected executable at경로부터 보시면 됩니다.
2026-09-17 실측에서 확인하지 않은 것
- 환경변수 없이 기본 위치(
%LOCALAPPDATA%\ms-playwright)로 받는 경우. 개인 캐시를 건드리지 않으려고 하지 않았습니다. --only-shell,--no-shell,--with-deps옵션의 실제 동작.--browser chromium없이 MCP 기본값으로 둔 경우의 브라우저 선택은 Playwright MCP 윈도우 설정에 적었습니다. Chrome이 설치되지 않은 PC에서의 오류 문구는 확인하지 않았습니다.@playwright/test러너(npx playwright test)에서의 오류 모양.- 사내 프록시·방화벽 뒤에서의 다운로드, 맥·리눅스.
- 첫
npx -y @playwright/mcp@latest실행의 패키지 다운로드 시간과 크기.
공개 파일로 다시 확인하기 — 2026-09-28 추가
별도 빈 폴더에 playwright-launch.cjs, playwright-test.html, mcp-smoke.mjs를 원래 이름으로 저장합니다. playwright-launch.cjs는 브라우저를 띄우고 같은 폴더의 HTML을 page.setContent()로 읽어 제목을 검사한 뒤 닫습니다. 비공개 launch.js 없이 실행할 수 있는 새 예제입니다. Node.js와 npm이 필요합니다.
npm init -y
npm install --save-exact playwright@1.63.0 @modelcontextprotocol/sdk@1.30.1 @playwright/mcp@0.0.82PowerShell에서는 브라우저 설치 위치를 다음처럼 지정합니다. 아직 브라우저를 받은 적 없는 새 예제 폴더에서 시작하고, 설치와 실행을 같은 터미널에서 이어 갑니다.
$env:PLAYWRIGHT_BROWSERS_PATH = Join-Path $PWD 'browsers-check'Git Bash나 Linux Bash라면 위 한 줄 대신 다음을 씁니다.
export PLAYWRIGHT_BROWSERS_PATH="$PWD/browsers-check"스크립트를 먼저 실행하면 지정한 폴더에 브라우저가 없는 상태를 확인할 수 있습니다.
node playwright-launch.cjs스크립트용 브라우저를 설치하고 같은 명령으로 다시 확인합니다.
npx playwright install chromium
node playwright-launch.cjs복구됐을 때의 판단 기준은 title: DADDYNOTE browser check, OK, 종료 코드 0입니다. 이것은 아래에 적은 새 확인 범위와 구분해야 할 성공 기준입니다.
MCP도 확인하려면 navigate.json을 아래 내용으로 저장합니다. 여기서는 로컬 HTTP 서버 없이 브라우저 실행 자체를 확인하도록 빈 페이지를 엽니다.
{"url":"about:blank"}node mcp-smoke.mjs --call browser_navigate --args-file navigate.json -- node node_modules/@playwright/mcp/cli.js --headless --isolated --browser chromiumMCP 결과가 브라우저 없음 오류라면 MCP 패키지의 설치 명령을 실행한 뒤 같은 호출을 다시 합니다. 클라이언트는 PLAYWRIGHT_BROWSERS_PATH를 서버에도 전달합니다.
node node_modules/@playwright/mcp/cli.js install-browser chrome-for-testing
node mcp-smoke.mjs --call browser_navigate --args-file navigate.json -- node node_modules/@playwright/mcp/cli.js --headless --isolated --browser chromiumevent: "result"에서 isError: true이면 복구된 것이 아닙니다. 공개 클라이언트는 이 경우 종료 코드도 1로 끝납니다. HTML 파일을 HTTP로 열어 확인하는 전체 예제는 Playwright MCP 설정 글의 공개 클라이언트 절에 있습니다.
2026-09-28에 새 파일을 확인한 환경은 Linux, Node.js 24.19.0, playwright 1.63.0, SDK 1.30.1, @playwright/mcp 0.0.82입니다. 새 playwright-launch.cjs는 브라우저가 없는 상태에서 Executable doesn't exist와 종료 코드 1을 냈고, MCP 서버 연결·도구 25개 조회는 성공했습니다. 브라우저 다운로드는 ZIP 오류로 완료하지 못해 위 기본 설치 경로의 복구 성공은 새 실측 결과에 포함하지 않습니다. 별도 확인에서는 playwright-launch.cjs의 선택 인수로 기존 Chromium 실행 파일 경로를 넘겨, Linux Chromium 153.0.8010.0에서 제목 DADDYNOTE browser check·OK·종료 코드 0을 얻었습니다. 이 실행 파일은 @sparticuz/chromium 153.0.0에서 꺼낸 것으로 기본 설치 복구와는 별개입니다. 같은 브라우저를 MCP에 지정한 실제 페이지 이동은 서버 내부 Unix 소켓의 listen EPERM으로 실패했고, 클라이언트가 isError: true와 종료 코드 1을 전달했습니다. PowerShell과 Windows 실행은 다시 확인하지 않았습니다. 공식 브라우저 문서의 버전별 설치와 환경변수 안내, MCP README의 옵션은 같은 날 재확인했습니다.