@guanzhu.me/pw-cli 0.0.13 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guanzhu.me/pw-cli",
3
- "version": "0.0.13",
3
+ "version": "0.0.14",
4
4
  "description": "Persistent Playwright browser CLI with headed defaults, profile support, queueing, and script execution",
5
5
  "bin": {
6
6
  "pw-cli": "./bin/pw-cli.js"
@@ -7,7 +7,7 @@ const fs = require('fs');
7
7
  const crypto = require('crypto');
8
8
  const { execSync } = require('child_process');
9
9
  const { readState, writeState, clearState, getProfileDir } = require('./state');
10
- const { probeCDP, findFreePort, sleep } = require('./utils');
10
+ const { probeCDP, findFreePort, sleep, fetchActivePageUrl } = require('./utils');
11
11
 
12
12
  const DAEMON_SCRIPT = path.join(__dirname, 'launch-daemon.js');
13
13
 
@@ -61,6 +61,32 @@ function loadPlaywright() {
61
61
  throw new Error('playwright is not installed. Run: npm install -g playwright');
62
62
  }
63
63
 
64
+ function pickPage(pages, activeUrl) {
65
+ if (!pages || pages.length === 0) return null;
66
+ if (activeUrl) {
67
+ const matchingPages = pages.filter(page => {
68
+ try {
69
+ return page.url() === activeUrl;
70
+ } catch {
71
+ return false;
72
+ }
73
+ });
74
+ if (matchingPages.length > 0) {
75
+ return matchingPages[matchingPages.length - 1];
76
+ }
77
+ }
78
+ return pages[pages.length - 1];
79
+ }
80
+
81
+ async function resolveContextAndPage(browser, cdpPort) {
82
+ const contexts = browser.contexts();
83
+ const context = contexts.length > 0 ? contexts[0] : await browser.newContext();
84
+ const pages = context.pages();
85
+ const activeUrl = cdpPort ? await fetchActivePageUrl(cdpPort) : null;
86
+ const page = pickPage(pages, activeUrl) || await context.newPage();
87
+ return { context, page };
88
+ }
89
+
64
90
  // ---------------------------------------------------------------------------
65
91
  // Our own CDP-based browser launcher (fallback when playwright-cli not running)
66
92
  // ---------------------------------------------------------------------------
@@ -131,10 +157,7 @@ async function getConnection({ headless = false, profile = 'default', port: pref
131
157
  if (alive) {
132
158
  try {
133
159
  const browser = await playwright.chromium.connectOverCDP(`http://127.0.0.1:${cliCdpPort}`);
134
- const contexts = browser.contexts();
135
- const context = contexts.length > 0 ? contexts[0] : await browser.newContext();
136
- const pages = context.pages();
137
- const page = pages.length > 0 ? pages[0] : await context.newPage();
160
+ const { context, page } = await resolveContextAndPage(browser, cliCdpPort);
138
161
  return { browser, context, page, playwright };
139
162
  } catch {
140
163
  // fall through to own browser
@@ -163,10 +186,7 @@ async function getConnection({ headless = false, profile = 'default', port: pref
163
186
  }
164
187
 
165
188
  const browser = await playwright.chromium.connectOverCDP(cdpUrl);
166
- const contexts = browser.contexts();
167
- const context = contexts.length > 0 ? contexts[0] : await browser.newContext();
168
- const pages = context.pages();
169
- const page = pages.length > 0 ? pages[0] : await context.newPage();
189
+ const { context, page } = await resolveContextAndPage(browser, state ? state.port : null);
170
190
 
171
191
  return { browser, context, page, playwright };
172
192
  }
@@ -188,4 +208,4 @@ async function killBrowser() {
188
208
  return true;
189
209
  }
190
210
 
191
- module.exports = { getConnection, killBrowser, getPlaywrightCliCdpPort };
211
+ module.exports = { getConnection, killBrowser, getPlaywrightCliCdpPort, pickPage };