-
-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathpuppeteer-runner.mjs
More file actions
executable file
·166 lines (143 loc) · 4.87 KB
/
puppeteer-runner.mjs
File metadata and controls
executable file
·166 lines (143 loc) · 4.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#!/usr/bin/env node
/**
* DOSee Puppeteer Runner
* Multi-browser testing utility for DOSee
* ES Module version
*/
import puppeteer from "puppeteer";
import config from "./puppeteer.config.mjs";
import { execSync, spawn } from "child_process";
// Parse command line arguments
const args = process.argv.slice(2);
let browserType = "chrome"; // default
let pageType = "main"; // default
let headless = true;
// Process arguments
for (let i = 0; i < args.length; i++) {
const arg = args[i];
if (arg === "--browser" && args[i + 1]) {
browserType = args[i + 1].toLowerCase();
i++; // skip next arg
} else if (arg === "--page" && args[i + 1]) {
pageType = args[i + 1].toLowerCase();
i++; // skip next arg
} else if (arg === "--headful") {
headless = false;
} else if (arg === "--help" || arg === "-h") {
showHelp();
process.exit(0);
}
}
// Validate browser type
const validBrowsers = ["chrome", "firefox", "webkit"];
if (!validBrowsers.includes(browserType)) {
console.error(`Invalid browser type: ${browserType}`);
console.error(`Valid options: ${validBrowsers.join(", ")}`);
process.exit(1);
}
// Get configuration
const puppeteerConfig = config.getConfig(browserType);
const url = config.getUrl(pageType);
console.log(`=== DOSee Puppeteer Runner ===`);
console.log(`Browser: ${browserType}`);
console.log(`Page: ${pageType}`);
console.log(`Headless: ${headless}`);
console.log(`URL: ${url}`);
async function runPuppeteer() {
try {
// Build DOSee if needed
console.log("Building DOSee...");
execSync("pnpm run install", { stdio: "inherit" });
// Start server
console.log(`Starting server on port ${puppeteerConfig.serverPort}...`);
const serverProcess = spawn(
"npx",
[
"http-server",
puppeteerConfig.buildDir,
"--port",
puppeteerConfig.serverPort.toString(),
"--silent",
],
{
stdio: "inherit",
detached: false,
},
);
// Wait for server to start
console.log("Waiting for server to start...");
await new Promise((resolve) => setTimeout(resolve, 2000));
// Launch browser
console.log(`Launching ${browserType}...`);
const browser = await puppeteer.launch({
product: puppeteerConfig.product,
headless: headless,
args: [...puppeteerConfig.launchArgs, ...puppeteerConfig.extraLaunchArgs],
executablePath: puppeteerConfig.executablePath,
});
// Create page with modern user agent approach (setUserAgent is deprecated)
const page = await browser.newPage();
await page.setViewport(puppeteerConfig.viewport);
// Use page.emulate() for modern user agent setting
await page.emulate({
viewport: puppeteerConfig.viewport,
userAgent: puppeteerConfig.userAgent,
});
// Navigate to page
console.log(`Navigating to ${url}...`);
await page.goto(url, {
waitUntil: "networkidle2",
timeout: puppeteerConfig.timeout,
});
console.log("✅ Page loaded successfully!");
console.log(`Title: ${await page.title()}`);
console.log(`URL: ${page.url()}`);
// Take screenshot
await page.screenshot({ path: puppeteerConfig.screenshotPath });
console.log(`📸 Screenshot saved as ${puppeteerConfig.screenshotPath}`);
// Keep browser open for inspection if not headless
if (!headless) {
console.log(
"🔍 Browser window open for inspection. Press Ctrl+C to exit.",
);
await new Promise(() => {}); // Keep running
}
await browser.close();
// Clean up server process in headless mode
if (headless && serverProcess) {
try {
serverProcess.kill("SIGTERM");
// Give it a moment to terminate gracefully
await new Promise((resolve) => setTimeout(resolve, 1000));
console.log("🔌 Server process terminated");
} catch (cleanupError) {
console.warn(
"⚠️ Could not clean up server process:",
cleanupError.message,
);
}
}
console.log("✅ Puppeteer execution completed successfully");
} catch (error) {
console.error("❌ Puppeteer error:", error.message);
process.exit(1);
}
}
function showHelp() {
console.log("DOSee Puppeteer Runner");
console.log("");
console.log("Usage: node puppeteer-runner.js [options]");
console.log("");
console.log("Options:");
console.log(" --browser <type> Browser to use (chrome, firefox, webkit)");
console.log(" --page <type> Page to test (main, benchmark, offline)");
console.log(" --headful Run in headed mode (show browser window)");
console.log(" --help, -h Show this help message");
console.log("");
console.log("Examples:");
console.log(" node puppeteer-runner.js");
console.log(" node puppeteer-runner.js --browser firefox --page benchmark");
console.log(" node puppeteer-runner.js --browser chrome --headful");
}
// Run Puppeteer
runPuppeteer();