External Electron App Automation
Use this skill for external Electron desktop apps running on the user's machine. Do not default to this for this repository's own Electron app unless the user explicitly asks.
Core workflow
- Quit the app if it is already running.
- Relaunch the app with
--remote-debugging-port=<port>. - Connect with
.bin/playwright connect http://127.0.0.1:<port> --session <session>. - Verify targets with
.bin/playwright list --session <session>. - Run interactions with
.bin/playwright exec "<code>" --session <session>. - Capture evidence with
.bin/playwright snapshot --session <session>.
Launch examples
macOS
open -a "Slack" --args --remote-debugging-port=9222
open -a "Visual Studio Code" --args --remote-debugging-port=9223
open -a "Discord" --args --remote-debugging-port=9224
Linux
slack --remote-debugging-port=9222
code --remote-debugging-port=9223
discord --remote-debugging-port=9224
Windows
"C:\Users\%USERNAME%\AppData\Local\slack\slack.exe" --remote-debugging-port=9222
"C:\Users\%USERNAME%\AppData\Local\Programs\Microsoft VS Code\Code.exe" --remote-debugging-port=9223
Session pattern
Use one session per app:
.bin/playwright connect http://127.0.0.1:9222 --session slack-desktop
.bin/playwright list --session slack-desktop
.bin/playwright exec "return await page.title()" --session slack-desktop
.bin/playwright snapshot --session slack-desktop
Interaction examples
.bin/playwright exec "await page.locator('button:has-text(\"Search\")').click()" --session slack-desktop
.bin/playwright exec "await page.keyboard.type('incident-123')" --session slack-desktop
.bin/playwright exec "await page.keyboard.press('Enter')" --session slack-desktop
When selectors are unstable, inspect first:
.bin/playwright snapshot --session slack-desktop
.bin/playwright exec "return await page.content()" --session slack-desktop
Troubleshooting
- If connection fails, make sure the app was launched with
--remote-debugging-portand relaunch it. - Prefer
127.0.0.1overlocalhostin CDP URLs. - If no pages are listed right after launch, wait 2-5 seconds and retry
list. - If a session is stale, run
connectagain with the same--session.
Use .bin/playwright close --session <session> only when you want to close that controlled browser/app session.