@auto-wiz/puppeteer 1.0.0
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/dist/index.d.ts +1 -0
- package/dist/index.js +17 -0
- package/dist/runner.d.ts +8 -0
- package/dist/runner.js +116 -0
- package/package.json +36 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./runner";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./runner"), exports);
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type FlowRunner, type RunResult, type ExecutionResult, type RunnerOptions, type Flow, type Step } from "@auto-wiz/core";
|
|
2
|
+
import { Page } from "puppeteer";
|
|
3
|
+
export declare class PuppeteerFlowRunner implements FlowRunner<Page> {
|
|
4
|
+
run(flow: Flow, page: Page, options?: RunnerOptions): Promise<RunResult>;
|
|
5
|
+
runStep(step: Step, page: Page, options?: RunnerOptions): Promise<ExecutionResult>;
|
|
6
|
+
private getSelector;
|
|
7
|
+
private getElement;
|
|
8
|
+
}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PuppeteerFlowRunner = void 0;
|
|
4
|
+
class PuppeteerFlowRunner {
|
|
5
|
+
async run(flow, page, options = {}) {
|
|
6
|
+
const extractedData = {};
|
|
7
|
+
for (const [index, step] of flow.steps.entries()) {
|
|
8
|
+
try {
|
|
9
|
+
const result = await this.runStep(step, page, options);
|
|
10
|
+
if (!result.success) {
|
|
11
|
+
if (options.stopOnError !== false) {
|
|
12
|
+
return {
|
|
13
|
+
success: false,
|
|
14
|
+
error: result.error,
|
|
15
|
+
failedStepIndex: index,
|
|
16
|
+
extractedData,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (result.extractedData) {
|
|
21
|
+
extractedData[`step_${index}`] = result.extractedData;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
error: error.message,
|
|
28
|
+
failedStepIndex: index,
|
|
29
|
+
extractedData,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { success: true, extractedData };
|
|
34
|
+
}
|
|
35
|
+
async runStep(step, page, options = {}) {
|
|
36
|
+
const timeout = options.timeout || 5000;
|
|
37
|
+
try {
|
|
38
|
+
switch (step.type) {
|
|
39
|
+
case "navigate":
|
|
40
|
+
if (step.url) {
|
|
41
|
+
await page.goto(step.url, { timeout });
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
case "click": {
|
|
45
|
+
const el = await this.getElement(page, step, timeout);
|
|
46
|
+
await el.click();
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case "type": {
|
|
50
|
+
const el = await this.getElement(page, step, timeout);
|
|
51
|
+
const text = step.text || step.originalText || "";
|
|
52
|
+
await el.type(text);
|
|
53
|
+
if (step.submit) {
|
|
54
|
+
await page.keyboard.press("Enter");
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case "select": {
|
|
59
|
+
const selector = this.getSelector(step);
|
|
60
|
+
// Puppeteer select uses selector string, not element handle usually
|
|
61
|
+
if (step.value) {
|
|
62
|
+
// Need to wait for it first
|
|
63
|
+
await page.waitForSelector(selector, { timeout });
|
|
64
|
+
await page.select(selector, step.value);
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case "extract": {
|
|
69
|
+
const selector = this.getSelector(step);
|
|
70
|
+
await page.waitForSelector(selector, { timeout });
|
|
71
|
+
// Extract text
|
|
72
|
+
const text = await page.$eval(selector, (el) => el.textContent);
|
|
73
|
+
return { success: true, extractedData: text?.trim() };
|
|
74
|
+
}
|
|
75
|
+
case "waitFor": {
|
|
76
|
+
if (step.selector || step.locator) {
|
|
77
|
+
const selector = this.getSelector(step);
|
|
78
|
+
await page.waitForSelector(selector, {
|
|
79
|
+
visible: true,
|
|
80
|
+
timeout: step.timeoutMs || timeout,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else if (step.timeoutMs) {
|
|
84
|
+
await new Promise((r) => setTimeout(r, step.timeoutMs));
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { success: true };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return { success: false, error: error.message };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
getSelector(step) {
|
|
96
|
+
if ("locator" in step && step.locator) {
|
|
97
|
+
const { primary } = step.locator;
|
|
98
|
+
return primary;
|
|
99
|
+
}
|
|
100
|
+
if ("selector" in step && step.selector) {
|
|
101
|
+
return step.selector;
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`Step ${step.type} requires a selector or locator`);
|
|
104
|
+
}
|
|
105
|
+
async getElement(page, step, timeout) {
|
|
106
|
+
const selector = this.getSelector(step);
|
|
107
|
+
const element = await page.waitForSelector(selector, {
|
|
108
|
+
visible: true,
|
|
109
|
+
timeout,
|
|
110
|
+
});
|
|
111
|
+
if (!element)
|
|
112
|
+
throw new Error(`Element not found: ${selector}`);
|
|
113
|
+
return element;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.PuppeteerFlowRunner = PuppeteerFlowRunner;
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@auto-wiz/puppeteer",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"author": "JaeSang",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/JaeSang1998/automation-wizard.git"
|
|
9
|
+
},
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"require": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"puppeteer": "^23.0.0",
|
|
27
|
+
"@auto-wiz/core": "1.0.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"typescript": "^5.0.0",
|
|
31
|
+
"@types/node": "^20.0.0"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc"
|
|
35
|
+
}
|
|
36
|
+
}
|