channel-worker 1.0.21 → 1.0.22
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/lib/command-poller.js +45 -10
- package/package.json +1 -1
package/lib/command-poller.js
CHANGED
|
@@ -483,21 +483,56 @@ class CommandPoller {
|
|
|
483
483
|
|
|
484
484
|
ws.on('open', async () => {
|
|
485
485
|
try {
|
|
486
|
+
await send('Page.enable');
|
|
486
487
|
await send('DOM.enable');
|
|
487
|
-
const doc = await send('DOM.getDocument');
|
|
488
|
-
let node = await send('DOM.querySelector', { nodeId: doc.root.nodeId, selector });
|
|
489
|
-
if (!node?.nodeId && fallback_selector) {
|
|
490
|
-
node = await send('DOM.querySelector', { nodeId: doc.root.nodeId, selector: fallback_selector });
|
|
491
|
-
}
|
|
492
|
-
if (!node?.nodeId) { ws.close(); resolve({ success: false, error: 'Input not found' }); return; }
|
|
493
488
|
|
|
494
|
-
|
|
489
|
+
// Enable file chooser interception
|
|
490
|
+
await send('Page.setInterceptFileChooserDialog', { enabled: true });
|
|
491
|
+
|
|
492
|
+
// Listen for file chooser event
|
|
493
|
+
const chooserPromise = new Promise((res) => {
|
|
494
|
+
const eventHandler = (data) => {
|
|
495
|
+
const msg = JSON.parse(data);
|
|
496
|
+
if (msg.method === 'Page.fileChooserOpened') {
|
|
497
|
+
ws.removeListener('message', eventHandler);
|
|
498
|
+
res('opened');
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
ws.on('message', eventHandler);
|
|
502
|
+
setTimeout(() => { ws.removeListener('message', eventHandler); res('timeout'); }, 10000);
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
// Click the file input to trigger native file dialog
|
|
506
|
+
const sel = selector.replace(/'/g, "\\'");
|
|
507
|
+
const fbSel = fallback_selector ? fallback_selector.replace(/'/g, "\\'") : '';
|
|
495
508
|
await send('Runtime.evaluate', {
|
|
496
|
-
expression: `document.querySelector('${
|
|
509
|
+
expression: `(document.querySelector('${sel}') || document.querySelector('${fbSel}'))?.click(); 'clicked'`,
|
|
497
510
|
});
|
|
498
511
|
|
|
499
|
-
|
|
500
|
-
|
|
512
|
+
// Wait for file chooser
|
|
513
|
+
const chooserResult = await chooserPromise;
|
|
514
|
+
console.log(`[commands] File chooser: ${chooserResult}`);
|
|
515
|
+
|
|
516
|
+
if (chooserResult === 'opened') {
|
|
517
|
+
// Accept with our file
|
|
518
|
+
await send('Page.handleFileChooser', { action: 'accept', files: [file_path] });
|
|
519
|
+
await send('Page.setInterceptFileChooserDialog', { enabled: false });
|
|
520
|
+
ws.close();
|
|
521
|
+
resolve({ success: true, method: 'file_chooser' });
|
|
522
|
+
} else {
|
|
523
|
+
// Fallback to DOM.setFileInputFiles
|
|
524
|
+
console.log('[commands] File chooser timeout, falling back to DOM.setFileInputFiles');
|
|
525
|
+
await send('Page.setInterceptFileChooserDialog', { enabled: false });
|
|
526
|
+
const doc = await send('DOM.getDocument');
|
|
527
|
+
let node = await send('DOM.querySelector', { nodeId: doc.root.nodeId, selector });
|
|
528
|
+
if (!node?.nodeId && fallback_selector) {
|
|
529
|
+
node = await send('DOM.querySelector', { nodeId: doc.root.nodeId, selector: fallback_selector });
|
|
530
|
+
}
|
|
531
|
+
if (!node?.nodeId) { ws.close(); resolve({ success: false, error: 'Input not found' }); return; }
|
|
532
|
+
await send('DOM.setFileInputFiles', { nodeId: node.nodeId, files: [file_path] });
|
|
533
|
+
ws.close();
|
|
534
|
+
resolve({ success: true, method: 'dom_set_files' });
|
|
535
|
+
}
|
|
501
536
|
} catch (e) { ws.close(); resolve({ success: false, error: e.message }); }
|
|
502
537
|
});
|
|
503
538
|
ws.on('error', (e) => reject(e));
|