@hanivanrizky/nestjs-browser-action 0.20.1 → 0.22.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/README.md +72 -31
- package/dist/browser-action.module-definition.d.ts +1 -0
- package/dist/browser-action.module.d.ts +3 -0
- package/dist/browser-action.module.js +146 -27
- package/dist/browser-action.module.js.map +1 -1
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.js +18 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/tokens.d.ts +7 -0
- package/dist/common/tokens.js +36 -0
- package/dist/common/tokens.js.map +1 -0
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.js +1 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/inject-browser.decorator.d.ts +2 -1
- package/dist/decorators/inject-browser.decorator.js +2 -1
- package/dist/decorators/inject-browser.decorator.js.map +1 -1
- package/dist/decorators/inject-page-controller.decorator.d.ts +2 -0
- package/dist/decorators/inject-page-controller.decorator.js +8 -0
- package/dist/decorators/inject-page-controller.decorator.js.map +1 -0
- package/dist/decorators/inject-page.decorator.d.ts +2 -1
- package/dist/decorators/inject-page.decorator.js +2 -1
- package/dist/decorators/inject-page.decorator.js.map +1 -1
- package/dist/examples/named-browser-example.d.ts +1 -0
- package/dist/examples/named-browser-example.js +183 -0
- package/dist/examples/named-browser-example.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/browser-action-options.d.ts +1 -0
- package/dist/operators/capture.operator.d.ts +11 -0
- package/dist/operators/capture.operator.js +62 -0
- package/dist/operators/capture.operator.js.map +1 -0
- package/dist/operators/container.operator.d.ts +13 -0
- package/dist/operators/container.operator.js +149 -0
- package/dist/operators/container.operator.js.map +1 -0
- package/dist/operators/extraction.operator.d.ts +22 -0
- package/dist/operators/extraction.operator.js +204 -0
- package/dist/operators/extraction.operator.js.map +1 -0
- package/dist/operators/index.d.ts +5 -0
- package/dist/operators/index.js +14 -0
- package/dist/operators/index.js.map +1 -0
- package/dist/operators/pagination.operator.d.ts +24 -0
- package/dist/operators/pagination.operator.js +182 -0
- package/dist/operators/pagination.operator.js.map +1 -0
- package/dist/operators/workflow.operator.d.ts +35 -0
- package/dist/operators/workflow.operator.js +501 -0
- package/dist/operators/workflow.operator.js.map +1 -0
- package/dist/services/browser-action.service.d.ts +10 -30
- package/dist/services/browser-action.service.js +72 -995
- package/dist/services/browser-action.service.js.map +1 -1
- package/dist/services/browser-holder.d.ts +7 -0
- package/dist/services/browser-holder.js +26 -0
- package/dist/services/browser-holder.js.map +1 -0
- package/dist/services/browser-manager.service.js +3 -2
- package/dist/services/browser-manager.service.js.map +1 -1
- package/dist/services/browser-pool.service.d.ts +4 -4
- package/dist/services/browser-pool.service.js +45 -104
- package/dist/services/browser-pool.service.js.map +1 -1
- package/dist/services/named-browser-shutdown.d.ts +9 -0
- package/dist/services/named-browser-shutdown.js +47 -0
- package/dist/services/named-browser-shutdown.js.map +1 -0
- package/dist/services/page-controller.d.ts +39 -0
- package/dist/services/page-controller.js +325 -0
- package/dist/services/page-controller.js.map +1 -0
- package/dist/services/page-session.d.ts +26 -0
- package/dist/services/page-session.js +135 -0
- package/dist/services/page-session.js.map +1 -0
- package/dist/services/page.service.js +14 -3
- package/dist/services/page.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/browser-launcher.d.ts +6 -0
- package/dist/utils/browser-launcher.js +100 -0
- package/dist/utils/browser-launcher.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExtractionOperator = void 0;
|
|
4
|
+
const truncate_log_util_1 = require("../utils/truncate-log.util");
|
|
5
|
+
class ExtractionOperator {
|
|
6
|
+
pipeEngine;
|
|
7
|
+
logger;
|
|
8
|
+
constructor(pipeEngine, logger) {
|
|
9
|
+
this.pipeEngine = pipeEngine;
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
}
|
|
12
|
+
parseSelector(raw) {
|
|
13
|
+
const match = raw.match(/^(.*)@([A-Za-z_][\w-]*)$/);
|
|
14
|
+
if (match && match[1].trim() !== '') {
|
|
15
|
+
return { selector: match[1], attribute: match[2] };
|
|
16
|
+
}
|
|
17
|
+
return { selector: raw };
|
|
18
|
+
}
|
|
19
|
+
validateSelector(key, selector) {
|
|
20
|
+
if (!selector || selector.trim() === '') {
|
|
21
|
+
throw new Error(`Selector for '${key}' cannot be empty`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async extractSingle(page, url, selectors, pipes) {
|
|
25
|
+
const result = {};
|
|
26
|
+
const evalOne = page['$eval'].bind(page);
|
|
27
|
+
await Promise.all(Object.entries(selectors).map(async ([key, rawSelector]) => {
|
|
28
|
+
const { selector, attribute } = this.parseSelector(rawSelector);
|
|
29
|
+
try {
|
|
30
|
+
const value = attribute
|
|
31
|
+
? await evalOne(selector, (el, attr) => el.getAttribute(attr), attribute)
|
|
32
|
+
: await evalOne(selector, (el) => el.textContent);
|
|
33
|
+
result[key] = pipes?.[key]
|
|
34
|
+
? this.pipeEngine.apply(typeof value === 'string' ? value : String(value ?? ''), pipes[key], url)
|
|
35
|
+
: value;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
this.logger.warn(`Failed to scrape '${key}' (${rawSelector}): ${err instanceof Error ? err.message : String(err)}`);
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
async extractAllData(page, target, as = 'text', attribute) {
|
|
44
|
+
if (target.shadowHost && !target.value) {
|
|
45
|
+
const hosts = await page.$$(target.shadowHost);
|
|
46
|
+
const results = await Promise.all(hosts.map((host) => host.evaluate((el, extractAs, attr) => {
|
|
47
|
+
const sr = el.shadowRoot;
|
|
48
|
+
if (!sr)
|
|
49
|
+
return '';
|
|
50
|
+
if (extractAs === 'html' || extractAs === 'outerHtml')
|
|
51
|
+
return sr.innerHTML;
|
|
52
|
+
if (extractAs === 'attribute')
|
|
53
|
+
return el.getAttribute(attr || '') || '';
|
|
54
|
+
return sr.textContent?.trim() || '';
|
|
55
|
+
}, as, attribute)));
|
|
56
|
+
return results;
|
|
57
|
+
}
|
|
58
|
+
if (target.shadowHost) {
|
|
59
|
+
return await this.extractAllFromShadowRoot(page, target, as, attribute);
|
|
60
|
+
}
|
|
61
|
+
if (target.type === 'css') {
|
|
62
|
+
return await page.$$eval(target.value, (elements, extractAs, attr) => elements.map((el) => {
|
|
63
|
+
if (extractAs === 'html')
|
|
64
|
+
return el.innerHTML;
|
|
65
|
+
if (extractAs === 'outerHtml')
|
|
66
|
+
return el.outerHTML;
|
|
67
|
+
if (extractAs === 'attribute')
|
|
68
|
+
return el.getAttribute(attr || '') || '';
|
|
69
|
+
return el.textContent?.trim() || '';
|
|
70
|
+
}), as, attribute);
|
|
71
|
+
}
|
|
72
|
+
return await page.evaluate((selector, extractAs, attr) => {
|
|
73
|
+
const results = document.evaluate(selector, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
|
|
74
|
+
const values = [];
|
|
75
|
+
for (let i = 0; i < results.snapshotLength; i++) {
|
|
76
|
+
const node = results.snapshotItem(i);
|
|
77
|
+
if (!(node instanceof Element)) {
|
|
78
|
+
values.push(node?.textContent?.trim() || '');
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (extractAs === 'html')
|
|
82
|
+
values.push(node.innerHTML);
|
|
83
|
+
else if (extractAs === 'outerHtml')
|
|
84
|
+
values.push(node.outerHTML);
|
|
85
|
+
else if (extractAs === 'attribute')
|
|
86
|
+
values.push(node.getAttribute(attr || '') || '');
|
|
87
|
+
else
|
|
88
|
+
values.push(node.textContent?.trim() || '');
|
|
89
|
+
}
|
|
90
|
+
return values;
|
|
91
|
+
}, target.value, as, attribute);
|
|
92
|
+
}
|
|
93
|
+
async extractAllFromShadowRoot(page, target, as = 'text', attribute) {
|
|
94
|
+
const hosts = await page.$$(target.shadowHost);
|
|
95
|
+
const allResults = await Promise.all(hosts.map(async (host) => {
|
|
96
|
+
return await host.evaluate((el, selector, targetType, extractAs, attr) => {
|
|
97
|
+
const shadowRoot = el.shadowRoot;
|
|
98
|
+
if (!shadowRoot)
|
|
99
|
+
return [];
|
|
100
|
+
const getVal = (e) => {
|
|
101
|
+
if (extractAs === 'html')
|
|
102
|
+
return e.innerHTML;
|
|
103
|
+
if (extractAs === 'outerHtml')
|
|
104
|
+
return e.outerHTML;
|
|
105
|
+
if (extractAs === 'attribute')
|
|
106
|
+
return e.getAttribute(attr || '') || '';
|
|
107
|
+
return e.textContent?.trim() || '';
|
|
108
|
+
};
|
|
109
|
+
if (targetType === 'css') {
|
|
110
|
+
const elements = shadowRoot.querySelectorAll(selector);
|
|
111
|
+
return Array.from(elements).map(getVal);
|
|
112
|
+
}
|
|
113
|
+
const results = document.evaluate(selector, shadowRoot, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
|
|
114
|
+
const values = [];
|
|
115
|
+
let node;
|
|
116
|
+
while ((node = results.iterateNext())) {
|
|
117
|
+
values.push(node instanceof Element
|
|
118
|
+
? getVal(node)
|
|
119
|
+
: node?.textContent?.trim() || '');
|
|
120
|
+
}
|
|
121
|
+
return values;
|
|
122
|
+
}, target.value, target.type, as, attribute);
|
|
123
|
+
}));
|
|
124
|
+
return allResults.flat();
|
|
125
|
+
}
|
|
126
|
+
async extractData(page, target, as = 'text', attribute, debugLogMaxLength = 0) {
|
|
127
|
+
if (target.shadowHost && !target.value) {
|
|
128
|
+
const host = await page.$(target.shadowHost);
|
|
129
|
+
if (!host)
|
|
130
|
+
throw new Error(`Shadow host not found: ${target.shadowHost}`);
|
|
131
|
+
return host.evaluate((el, extractAs, attr) => {
|
|
132
|
+
const sr = el.shadowRoot;
|
|
133
|
+
if (!sr)
|
|
134
|
+
return '';
|
|
135
|
+
if (extractAs === 'html' || extractAs === 'outerHtml')
|
|
136
|
+
return sr.innerHTML;
|
|
137
|
+
if (extractAs === 'attribute')
|
|
138
|
+
return el.getAttribute(attr || '') || '';
|
|
139
|
+
return sr.textContent?.trim() || '';
|
|
140
|
+
}, as, attribute);
|
|
141
|
+
}
|
|
142
|
+
const element = await this.findElement(page, target, debugLogMaxLength);
|
|
143
|
+
if (!element) {
|
|
144
|
+
throw new Error(`Element not found: ${target.value}`);
|
|
145
|
+
}
|
|
146
|
+
return element.evaluate((el, extractAs, attr) => {
|
|
147
|
+
if (extractAs === 'html')
|
|
148
|
+
return el.innerHTML;
|
|
149
|
+
if (extractAs === 'outerHtml')
|
|
150
|
+
return el.outerHTML;
|
|
151
|
+
if (extractAs === 'attribute')
|
|
152
|
+
return el.getAttribute(attr || '') || '';
|
|
153
|
+
return el.textContent?.trim() || '';
|
|
154
|
+
}, as, attribute);
|
|
155
|
+
}
|
|
156
|
+
describeTarget(target) {
|
|
157
|
+
const base = target.value
|
|
158
|
+
? `${target.type}="${target.value}"`
|
|
159
|
+
: `(no selector)`;
|
|
160
|
+
return target.shadowHost
|
|
161
|
+
? `shadowHost="${target.shadowHost}" > ${base}`
|
|
162
|
+
: base;
|
|
163
|
+
}
|
|
164
|
+
async findElement(page, target, debugLogMaxLength = 0) {
|
|
165
|
+
this.logger.debug((0, truncate_log_util_1.truncateLog)(debugLogMaxLength, ` findElement: ${this.describeTarget(target)}`));
|
|
166
|
+
if (target.shadowHost) {
|
|
167
|
+
const el = await this.findElementInShadowRoot(page, target);
|
|
168
|
+
this.logger.debug((0, truncate_log_util_1.truncateLog)(debugLogMaxLength, ` findElement result: ${el ? 'found' : 'NOT FOUND'}`));
|
|
169
|
+
return el;
|
|
170
|
+
}
|
|
171
|
+
if (target.type === 'css') {
|
|
172
|
+
const el = await page.$(target.value);
|
|
173
|
+
this.logger.debug((0, truncate_log_util_1.truncateLog)(debugLogMaxLength, ` findElement result: ${el ? 'found' : 'NOT FOUND'}`));
|
|
174
|
+
return el;
|
|
175
|
+
}
|
|
176
|
+
const el = await page
|
|
177
|
+
.evaluateHandle((selector) => {
|
|
178
|
+
const result = document.evaluate(selector, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
|
|
179
|
+
return result.singleNodeValue;
|
|
180
|
+
}, target.value)
|
|
181
|
+
.then((handle) => handle.asElement());
|
|
182
|
+
this.logger.debug((0, truncate_log_util_1.truncateLog)(debugLogMaxLength, ` findElement result: ${el ? 'found' : 'NOT FOUND'}`));
|
|
183
|
+
return el;
|
|
184
|
+
}
|
|
185
|
+
async findElementInShadowRoot(page, target) {
|
|
186
|
+
const host = await page.$(target.shadowHost);
|
|
187
|
+
if (!host)
|
|
188
|
+
return null;
|
|
189
|
+
return host
|
|
190
|
+
.evaluateHandle((el, selector, targetType) => {
|
|
191
|
+
const shadowRoot = el.shadowRoot;
|
|
192
|
+
if (!shadowRoot)
|
|
193
|
+
return null;
|
|
194
|
+
if (targetType === 'css') {
|
|
195
|
+
return shadowRoot.querySelector(selector);
|
|
196
|
+
}
|
|
197
|
+
const result = document.evaluate(selector, shadowRoot, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
|
|
198
|
+
return result.singleNodeValue;
|
|
199
|
+
}, target.value, target.type)
|
|
200
|
+
.then((handle) => handle.asElement());
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.ExtractionOperator = ExtractionOperator;
|
|
204
|
+
//# sourceMappingURL=extraction.operator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction.operator.js","sourceRoot":"","sources":["../../src/operators/extraction.operator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ExtractionOperator } from './extraction.operator';
|
|
2
|
+
export { CaptureOperator } from './capture.operator';
|
|
3
|
+
export { ContainerOperator } from './container.operator';
|
|
4
|
+
export { WorkflowOperator } from './workflow.operator';
|
|
5
|
+
export { PaginationOperator } from './pagination.operator';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaginationOperator = exports.WorkflowOperator = exports.ContainerOperator = exports.CaptureOperator = exports.ExtractionOperator = void 0;
|
|
4
|
+
var extraction_operator_1 = require("./extraction.operator");
|
|
5
|
+
Object.defineProperty(exports, "ExtractionOperator", { enumerable: true, get: function () { return extraction_operator_1.ExtractionOperator; } });
|
|
6
|
+
var capture_operator_1 = require("./capture.operator");
|
|
7
|
+
Object.defineProperty(exports, "CaptureOperator", { enumerable: true, get: function () { return capture_operator_1.CaptureOperator; } });
|
|
8
|
+
var container_operator_1 = require("./container.operator");
|
|
9
|
+
Object.defineProperty(exports, "ContainerOperator", { enumerable: true, get: function () { return container_operator_1.ContainerOperator; } });
|
|
10
|
+
var workflow_operator_1 = require("./workflow.operator");
|
|
11
|
+
Object.defineProperty(exports, "WorkflowOperator", { enumerable: true, get: function () { return workflow_operator_1.WorkflowOperator; } });
|
|
12
|
+
var pagination_operator_1 = require("./pagination.operator");
|
|
13
|
+
Object.defineProperty(exports, "PaginationOperator", { enumerable: true, get: function () { return pagination_operator_1.PaginationOperator; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":";;;AAAA,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA;AAC3B,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
import { LoggerWithLevel } from '../utils/logger.util';
|
|
3
|
+
import type { PaginationOptions } from '../interfaces/types';
|
|
4
|
+
export declare class PaginationOperator {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(logger: LoggerWithLevel);
|
|
7
|
+
private findPaginationElement;
|
|
8
|
+
paginateClickNext<T>(page: Page, containerFn: (page: Page) => Promise<T[]>, opts: PaginationOptions): Promise<{
|
|
9
|
+
items: T[];
|
|
10
|
+
pages: number;
|
|
11
|
+
}>;
|
|
12
|
+
paginateLoadMore<T>(page: Page, containerFn: (page: Page) => Promise<T[]>, opts: PaginationOptions): Promise<{
|
|
13
|
+
items: T[];
|
|
14
|
+
pages: number;
|
|
15
|
+
}>;
|
|
16
|
+
paginateInfiniteScroll<T>(page: Page, containerFn: (page: Page) => Promise<T[]>, opts: PaginationOptions): Promise<{
|
|
17
|
+
items: T[];
|
|
18
|
+
pages: number;
|
|
19
|
+
}>;
|
|
20
|
+
paginateUrlIncrement<T>(urlTemplate: string, containerFn: (url: string) => Promise<T[]>, opts: PaginationOptions, startPage: number): Promise<{
|
|
21
|
+
items: T[];
|
|
22
|
+
pages: number;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaginationOperator = void 0;
|
|
4
|
+
const delay_util_1 = require("../utils/delay.util");
|
|
5
|
+
const dom_util_1 = require("../utils/dom.util");
|
|
6
|
+
const isTargetClosed = (err) => err instanceof Error &&
|
|
7
|
+
(err.message.includes('Target closed') ||
|
|
8
|
+
err.message.includes('No target with given id') ||
|
|
9
|
+
err.message.includes('detached Frame') ||
|
|
10
|
+
err.message.includes('Attempted to use detached') ||
|
|
11
|
+
err.message.includes('Execution context was destroyed') ||
|
|
12
|
+
err.message.includes('context was destroyed') ||
|
|
13
|
+
err.message.includes('Session closed') ||
|
|
14
|
+
err.message.includes('Navigating frame was detached'));
|
|
15
|
+
class PaginationOperator {
|
|
16
|
+
logger;
|
|
17
|
+
constructor(logger) {
|
|
18
|
+
this.logger = logger;
|
|
19
|
+
}
|
|
20
|
+
async findPaginationElement(page, selector) {
|
|
21
|
+
if (!(0, dom_util_1.isXPathSelector)(selector)) {
|
|
22
|
+
return page.$(selector);
|
|
23
|
+
}
|
|
24
|
+
const pageWithX = page;
|
|
25
|
+
if (typeof pageWithX.$x === 'function') {
|
|
26
|
+
const results = await pageWithX.$x(selector);
|
|
27
|
+
return results[0] ?? null;
|
|
28
|
+
}
|
|
29
|
+
const handle = await page
|
|
30
|
+
.evaluateHandle((sel) => {
|
|
31
|
+
const res = document.evaluate(sel, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
|
|
32
|
+
return res.singleNodeValue;
|
|
33
|
+
}, selector)
|
|
34
|
+
.then((h) => h.asElement());
|
|
35
|
+
return handle;
|
|
36
|
+
}
|
|
37
|
+
async paginateClickNext(page, containerFn, opts) {
|
|
38
|
+
const max = opts.maxPages ?? 10;
|
|
39
|
+
const wait = opts.waitAfter ?? 800;
|
|
40
|
+
const all = [];
|
|
41
|
+
let pages = 0;
|
|
42
|
+
for (let i = 0; i < max; i++) {
|
|
43
|
+
try {
|
|
44
|
+
const items = await containerFn(page);
|
|
45
|
+
all.push(...items);
|
|
46
|
+
pages++;
|
|
47
|
+
if (!opts.selector)
|
|
48
|
+
break;
|
|
49
|
+
const btn = await this.findPaginationElement(page, opts.selector);
|
|
50
|
+
if (!btn)
|
|
51
|
+
break;
|
|
52
|
+
await Promise.all([
|
|
53
|
+
page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
|
|
54
|
+
btn.click(),
|
|
55
|
+
]);
|
|
56
|
+
await (0, delay_util_1.delay)(wait);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (isTargetClosed(err))
|
|
60
|
+
break;
|
|
61
|
+
if (err instanceof Error && err.message.includes('TimeoutError'))
|
|
62
|
+
break;
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { items: all, pages };
|
|
67
|
+
}
|
|
68
|
+
async paginateLoadMore(page, containerFn, opts) {
|
|
69
|
+
const max = opts.maxPages ?? 10;
|
|
70
|
+
const wait = opts.waitAfter ?? 800;
|
|
71
|
+
let previousCount = 0;
|
|
72
|
+
let clicks = 0;
|
|
73
|
+
let lastItems = [];
|
|
74
|
+
for (let i = 0; i < max; i++) {
|
|
75
|
+
try {
|
|
76
|
+
const items = await containerFn(page);
|
|
77
|
+
if (items.length === previousCount) {
|
|
78
|
+
return { items, pages: clicks + 1 };
|
|
79
|
+
}
|
|
80
|
+
lastItems = items;
|
|
81
|
+
previousCount = items.length;
|
|
82
|
+
if (!opts.selector)
|
|
83
|
+
break;
|
|
84
|
+
const btn = await this.findPaginationElement(page, opts.selector);
|
|
85
|
+
if (!btn)
|
|
86
|
+
break;
|
|
87
|
+
await btn.click();
|
|
88
|
+
clicks++;
|
|
89
|
+
await (0, delay_util_1.delay)(wait);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (isTargetClosed(err))
|
|
93
|
+
break;
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
const finalItems = await containerFn(page);
|
|
99
|
+
return { items: finalItems, pages: clicks + 1 };
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
if (isTargetClosed(err))
|
|
103
|
+
return { items: lastItems, pages: clicks + 1 };
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async paginateInfiniteScroll(page, containerFn, opts) {
|
|
108
|
+
const max = opts.maxPages ?? 10;
|
|
109
|
+
const wait = opts.waitAfter ?? 800;
|
|
110
|
+
let previousCount = 0;
|
|
111
|
+
let scrolls = 0;
|
|
112
|
+
let lastItems = [];
|
|
113
|
+
for (let i = 0; i < max; i++) {
|
|
114
|
+
try {
|
|
115
|
+
const items = await containerFn(page);
|
|
116
|
+
if (opts.endSelector) {
|
|
117
|
+
const endEl = await this.findPaginationElement(page, opts.endSelector);
|
|
118
|
+
if (endEl)
|
|
119
|
+
return { items, pages: scrolls + 1 };
|
|
120
|
+
}
|
|
121
|
+
if (items.length === previousCount)
|
|
122
|
+
return { items, pages: scrolls + 1 };
|
|
123
|
+
lastItems = items;
|
|
124
|
+
previousCount = items.length;
|
|
125
|
+
if (opts.selector) {
|
|
126
|
+
const sentinel = await this.findPaginationElement(page, opts.selector);
|
|
127
|
+
if (sentinel) {
|
|
128
|
+
await page.evaluate((el) => el.scrollIntoView(), sentinel);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
|
|
136
|
+
}
|
|
137
|
+
scrolls++;
|
|
138
|
+
await (0, delay_util_1.delay)(wait);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
if (isTargetClosed(err))
|
|
142
|
+
break;
|
|
143
|
+
throw err;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const finalItems = await containerFn(page);
|
|
148
|
+
return { items: finalItems, pages: scrolls + 1 };
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
if (isTargetClosed(err))
|
|
152
|
+
return { items: lastItems, pages: scrolls + 1 };
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async paginateUrlIncrement(urlTemplate, containerFn, opts, startPage) {
|
|
157
|
+
const max = opts.maxPages ?? 10;
|
|
158
|
+
const wait = opts.waitAfter ?? 800;
|
|
159
|
+
const all = [];
|
|
160
|
+
let pagesScraped = 0;
|
|
161
|
+
for (let p = startPage; p < startPage + max; p++) {
|
|
162
|
+
try {
|
|
163
|
+
const url = urlTemplate.replace('{page}', String(p));
|
|
164
|
+
const items = await containerFn(url);
|
|
165
|
+
if (items.length === 0)
|
|
166
|
+
break;
|
|
167
|
+
all.push(...items);
|
|
168
|
+
pagesScraped++;
|
|
169
|
+
if (p < startPage + max - 1)
|
|
170
|
+
await (0, delay_util_1.delay)(wait);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
if (isTargetClosed(err))
|
|
174
|
+
break;
|
|
175
|
+
throw err;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return { items: all, pages: pagesScraped };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.PaginationOperator = PaginationOperator;
|
|
182
|
+
//# sourceMappingURL=pagination.operator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.operator.js","sourceRoot":"","sources":["../../src/operators/pagination.operator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
import { PipeEngine } from '../pipes/pipe-engine';
|
|
3
|
+
import { CleansingService } from '../services/cleansing.service';
|
|
4
|
+
import { CookieService } from '../services/cookie.service';
|
|
5
|
+
import { LoggerWithLevel } from '../utils/logger.util';
|
|
6
|
+
import { ExtractionOperator } from './extraction.operator';
|
|
7
|
+
import { ContainerOperator } from './container.operator';
|
|
8
|
+
import type { WorkflowAction, VariableContext } from '../interfaces/workflow-options';
|
|
9
|
+
export declare class WorkflowOperator {
|
|
10
|
+
private readonly extraction;
|
|
11
|
+
private readonly container;
|
|
12
|
+
private readonly pipeEngine;
|
|
13
|
+
private readonly cleansingService;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
private readonly getCookieService;
|
|
16
|
+
constructor(extraction: ExtractionOperator, container: ContainerOperator, pipeEngine: PipeEngine, cleansingService: CleansingService, logger: LoggerWithLevel, getCookieService: () => CookieService);
|
|
17
|
+
executeAction(page: Page, action: WorkflowAction, context: VariableContext, debugLogMaxLength?: number): Promise<void>;
|
|
18
|
+
private dispatchAction;
|
|
19
|
+
evaluateCondition(page: Page, condition: WorkflowAction['condition'], debugLogMaxLength?: number): Promise<boolean>;
|
|
20
|
+
private describeTarget;
|
|
21
|
+
private findElement;
|
|
22
|
+
private findElementInShadowRoot;
|
|
23
|
+
private waitForTarget;
|
|
24
|
+
private clickElement;
|
|
25
|
+
private typeText;
|
|
26
|
+
private selectOption;
|
|
27
|
+
private scrollToElement;
|
|
28
|
+
private maybeScrollToElement;
|
|
29
|
+
private scrollElementIntoView;
|
|
30
|
+
private hoverElement;
|
|
31
|
+
private clearElement;
|
|
32
|
+
private resolveRawValue;
|
|
33
|
+
private resolveValue;
|
|
34
|
+
private interpolateValue;
|
|
35
|
+
}
|