@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 +1 -1
- package/src/browser-manager.js +30 -10
package/package.json
CHANGED
package/src/browser-manager.js
CHANGED
|
@@ -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
|
|
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
|
|
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 };
|