@dev-blinq/cucumber_client 1.0.1654-dev โ†’ 1.0.1656-dev

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.
@@ -298,190 +298,190 @@ export class RemoteBrowserService extends EventEmitter {
298
298
  lastKnownUrl: page.url(),
299
299
  lastKnownWsDebuggerUrl: cdpTargetId ? `${this.wsUrlBase}${cdpTargetId}` : undefined,
300
300
  });
301
- this.log("โœ… Existing page added to map", { stableTabId, cdpTargetId, url: page.url() });
302
- this.attachPageLifecycleListeners(page, stableTabId);
303
- this.log("๐Ÿ” Attached lifecycle listeners to existing page", { stableTabId });
304
- }
305
- if (this.pages.size > 0 && !this._selectedPageId) {
306
- this._selectedPageId = Array.from(this.pages.keys())[0];
307
- }
308
- await this.syncState();
309
- this.context.on("page", async (page) => {
310
- const stableTabId = uuidv4();
311
- this.log("๐Ÿ†• New page event triggered", { stableTabId, url: page.url() });
312
- // We get the ID immediately, but it might be null if the page is too new
313
- const cdpTargetId = await this.getCdpTargetId(page);
314
- this.pages.set(stableTabId, {
315
- page,
316
- cdpTargetId,
317
- lastKnownTitle: undefined,
318
- lastKnownUrl: page.url(),
319
- lastKnownWsDebuggerUrl: cdpTargetId ? `${this.wsUrlBase}${cdpTargetId}` : undefined,
320
- });
321
- if (cdpTargetId) {
322
- this.log("โœ… Page mapped to CDP ID", { stableTabId, cdpTargetId });
323
- }
324
- else {
325
- this.log("โš ๏ธ Could not find CDP ID for new page yet", { stableTabId });
326
- }
327
- if (!this._selectedPageId) {
328
- // Select the first page that opens
329
- this._selectedPageId = stableTabId;
330
- this.log("๐ŸŽฏ Initial selected page set", { selectedPageId: this._selectedPageId });
331
- }
332
- this.attachPageLifecycleListeners(page, stableTabId);
333
- await this.syncState();
334
- });
335
- }
336
- attachPageLifecycleListeners(page, stableTabId) {
337
- page.on("load", () => this.syncState());
338
- page.on("framenavigated", () => this.syncState());
339
- page.on("close", async () => {
340
- this.log("๐Ÿ—‘๏ธ Page close event", { stableTabId });
341
- this.pages.delete(stableTabId);
342
- if (this._selectedPageId === stableTabId) {
343
- this._selectedPageId = this.pages.size > 0 ? Array.from(this.pages.keys())[0] : null;
344
- this.log("๐Ÿ”„ Selected page changed after close", { newSelectedId: this._selectedPageId });
345
- }
346
- await this.syncState();
347
- });
348
- }
349
- async syncState() {
350
- try {
351
- this.log("๐Ÿ”„ Starting state sync");
352
- const state = await this.getState();
353
- this.log("โœ… State sync complete", { pagesCount: state.pages.length, selectedPageId: state.selectedPageId });
354
- this.emit("BrowserService.stateSync", state);
355
- }
356
- catch (error) {
357
- this.log("โŒ Error syncing state", { error });
358
- }
359
- }
360
- async getState() {
361
- this.log("๐Ÿ“Š Getting current state");
362
- const pagesData = [];
363
- const pagesToDelete = []; // To clean up closed pages
364
- for (const [stableTabId, pageInfo] of this.pages.entries()) {
365
- const pageData = {
366
- id: stableTabId,
367
- title: pageInfo.lastKnownTitle ?? "",
368
- url: pageInfo.lastKnownUrl ?? pageInfo.page.url(),
369
- wsDebuggerUrl: pageInfo.lastKnownWsDebuggerUrl ?? "",
370
- };
371
- try {
372
- if (pageInfo.page.isClosed()) {
373
- this.log("๐Ÿงน Found closed page during getState, marking for deletion", { stableTabId });
374
- pagesToDelete.push(stableTabId);
375
- continue;
376
- }
377
- // Get the one, true, live CDP ID
378
- const currentCdpId = await this.getCdpTargetId(pageInfo.page);
379
- if (currentCdpId && pageInfo.cdpTargetId !== currentCdpId) {
380
- this.log("๐Ÿ”„ CDP ID changed", { stableTabId, old: pageInfo.cdpTargetId, new: currentCdpId });
381
- pageInfo.cdpTargetId = currentCdpId; // Update our internal reference
382
- }
383
- // Manually construct the WebSocket URL
384
- const wsDebuggerUrl = currentCdpId
385
- ? `${this.wsUrlBase}${currentCdpId}`
386
- : (pageInfo.lastKnownWsDebuggerUrl ?? "");
387
- if (!wsDebuggerUrl) {
388
- this.log("โš ๏ธ Could not get CDP ID, wsDebuggerUrl will be empty", { stableTabId });
389
- }
390
- const title = await pageInfo.page.title();
391
- const currentUrl = pageInfo.page.url();
392
- pageData.title = title;
393
- pageData.url = currentUrl;
394
- pageData.wsDebuggerUrl = wsDebuggerUrl; // Use the constructed URL
395
- pageInfo.lastKnownTitle = title;
396
- pageInfo.lastKnownUrl = currentUrl;
397
- pageInfo.lastKnownWsDebuggerUrl = wsDebuggerUrl;
398
- this.log("๐ŸŸฅPage data", pageData);
399
- }
400
- catch (error) {
401
- const message = error instanceof Error ? error.message : JSON.stringify(error);
402
- if (this.isTransientPageDataError(error)) {
403
- this.log("โณ Transient error getting page data, will retry", { stableTabId, message });
301
+ page.on("framenavigated", async () => {
302
+ try {
303
+ await this.ensureClipboardScriptLoaded(page);
404
304
  }
405
- else {
406
- this.log("โŒ Error getting page data", { stableTabId, message });
407
- pagesToDelete.push(stableTabId); // Mark for deletion
408
- continue;
305
+ catch (err) {
306
+ this.log("โŒ Error injecting clipboard script on navigation", { stableTabId, error: err });
409
307
  }
410
- }
411
- if (!pageData.title) {
412
- pageData.title = pageInfo.page.url() === "about:blank" ? "" : "Loading...";
413
- }
414
- pagesData.push(pageData);
415
- }
416
- pagesToDelete.forEach((id) => this.pages.delete(id));
417
- if (this._selectedPageId && !this.pages.has(this._selectedPageId)) {
418
- this._selectedPageId = pagesData.length > 0 ? pagesData[0].id : null;
419
- this.log("๐Ÿ”„ Corrected selectedPageId", { new: this._selectedPageId });
420
- }
421
- if (!this._selectedPageId && pagesData.length > 0) {
422
- this._selectedPageId = pagesData[0].id;
423
- this.log("๐ŸŽฏ Set default selectedPageId", { new: this._selectedPageId });
424
- }
425
- const state = {
426
- pages: pagesData,
427
- selectedPageId: this._selectedPageId,
428
- };
429
- this.log("๐Ÿ“ฆ Final state", state);
430
- return state;
431
- }
432
- async createTab(url = "about:blank") {
433
- try {
434
- this.log("๐Ÿ†• Creating new tab", { url });
435
- const page = await this.context.newPage(); // This will trigger the 'page' event
436
- if (url !== "about:blank") {
437
- await page.goto(url, { waitUntil: "domcontentloaded" });
438
- }
439
- for (const [stableTabId, pageInfo] of this.pages.entries()) {
440
- if (pageInfo.page === page) {
441
- this._selectedPageId = stableTabId;
442
- this.log("โœ… New tab created and selected", { stableTabId, url });
443
- break;
444
- }
445
- }
446
- await this.syncState();
447
- }
448
- catch (error) {
449
- this.log("โŒ Error creating tab", { error });
450
- }
451
- }
452
- async closeTab(stableTabId) {
453
- try {
454
- this.log("๐Ÿ—‘๏ธ Closing tab", { stableTabId });
455
- const pageInfo = this.pages.get(stableTabId);
456
- if (pageInfo) {
457
- await pageInfo.page.close(); // This will trigger the 'close' event
458
- }
459
- else {
460
- this.log("โš ๏ธ Page not found for closing", { stableTabId });
461
- }
462
- }
463
- catch (error) {
464
- this.log("โŒ Error closing tab", { error });
465
- }
466
- }
467
- async selectTab(stableTabId) {
468
- try {
469
- this.log("๐ŸŽฏ Selecting tab", { stableTabId });
470
- const pageInfo = this.pages.get(stableTabId);
471
- if (pageInfo) {
472
- this._selectedPageId = stableTabId;
473
- await pageInfo.page.bringToFront();
474
- this.log("โœ… Tab selected successfully", { stableTabId });
475
- await this.syncState();
476
- }
477
- else {
478
- this.log("โš ๏ธ Page not found for selection", { stableTabId });
479
- }
480
- }
481
- catch (error) {
482
- this.log("โŒ Error selecting tab", { error });
483
- }
308
+ });
309
+ // this.log("โœ… Existing page added to map", { stableTabId, cdpTargetId, url: page.url() });
310
+ // this.attachPageLifecycleListeners(page, stableTabId);
311
+ // this.log("๐Ÿ” Attached lifecycle listeners to existing page", { stableTabId });
312
+ }
313
+ // if (this.pages.size > 0 && !this._selectedPageId) {
314
+ // this._selectedPageId = Array.from(this.pages.keys())[0];
315
+ // }
316
+ // await this.syncState();
317
+ this.context.on("page", async (page) => {
318
+ // const stableTabId = uuidv4();
319
+ // this.log("๐Ÿ†• New page event triggered", { stableTabId, url: page.url() });
320
+ // // We get the ID immediately, but it might be null if the page is too new
321
+ // const cdpTargetId = await this.getCdpTargetId(page);
322
+ // this.pages.set(stableTabId, {
323
+ // page,
324
+ // cdpTargetId,
325
+ // lastKnownTitle: undefined,
326
+ // lastKnownUrl: page.url(),
327
+ // lastKnownWsDebuggerUrl: cdpTargetId ? `${this.wsUrlBase}${cdpTargetId}` : undefined,
328
+ // });
329
+ // if (cdpTargetId) {
330
+ // this.log("โœ… Page mapped to CDP ID", { stableTabId, cdpTargetId });
331
+ // } else {
332
+ // this.log("โš ๏ธ Could not find CDP ID for new page yet", { stableTabId });
333
+ // }
334
+ // if (!this._selectedPageId) {
335
+ // // Select the first page that opens
336
+ // this._selectedPageId = stableTabId;
337
+ // this.log("๐ŸŽฏ Initial selected page set", { selectedPageId: this._selectedPageId });
338
+ // }
339
+ // this.attachPageLifecycleListeners(page, stableTabId);
340
+ // await this.syncState();
341
+ await this.ensureClipboardScriptLoaded(page);
342
+ });
484
343
  }
344
+ // private attachPageLifecycleListeners(page: Page, stableTabId: string) {
345
+ // page.on("load", () => this.syncState());
346
+ // page.on("framenavigated", () => this.syncState());
347
+ // page.on("close", async () => {
348
+ // this.log("๐Ÿ—‘๏ธ Page close event", { stableTabId });
349
+ // this.pages.delete(stableTabId);
350
+ // if (this._selectedPageId === stableTabId) {
351
+ // this._selectedPageId = this.pages.size > 0 ? Array.from(this.pages.keys())[0] : null;
352
+ // this.log("๐Ÿ”„ Selected page changed after close", { newSelectedId: this._selectedPageId });
353
+ // }
354
+ // await this.syncState();
355
+ // });
356
+ // }
357
+ // private async syncState() {
358
+ // try {
359
+ // this.log("๐Ÿ”„ Starting state sync");
360
+ // const state = await this.getState();
361
+ // this.log("โœ… State sync complete", { pagesCount: state.pages.length, selectedPageId: state.selectedPageId });
362
+ // this.emit("BrowserService.stateSync", state);
363
+ // } catch (error) {
364
+ // this.log("โŒ Error syncing state", { error });
365
+ // }
366
+ // }
367
+ // async getState(): Promise<BrowserState> {
368
+ // this.log("๐Ÿ“Š Getting current state");
369
+ // const pagesData: PageData[] = [];
370
+ // const pagesToDelete: string[] = []; // To clean up closed pages
371
+ // for (const [stableTabId, pageInfo] of this.pages.entries()) {
372
+ // const pageData: PageData = {
373
+ // id: stableTabId,
374
+ // title: pageInfo.lastKnownTitle ?? "",
375
+ // url: pageInfo.lastKnownUrl ?? pageInfo.page.url(),
376
+ // wsDebuggerUrl: pageInfo.lastKnownWsDebuggerUrl ?? "",
377
+ // };
378
+ // try {
379
+ // if (pageInfo.page.isClosed()) {
380
+ // this.log("๐Ÿงน Found closed page during getState, marking for deletion", { stableTabId });
381
+ // pagesToDelete.push(stableTabId);
382
+ // continue;
383
+ // }
384
+ // // Get the one, true, live CDP ID
385
+ // const currentCdpId = await this.getCdpTargetId(pageInfo.page);
386
+ // if (currentCdpId && pageInfo.cdpTargetId !== currentCdpId) {
387
+ // this.log("๐Ÿ”„ CDP ID changed", { stableTabId, old: pageInfo.cdpTargetId, new: currentCdpId });
388
+ // pageInfo.cdpTargetId = currentCdpId; // Update our internal reference
389
+ // }
390
+ // // Manually construct the WebSocket URL
391
+ // const wsDebuggerUrl = currentCdpId
392
+ // ? `${this.wsUrlBase}${currentCdpId}`
393
+ // : (pageInfo.lastKnownWsDebuggerUrl ?? "");
394
+ // if (!wsDebuggerUrl) {
395
+ // this.log("โš ๏ธ Could not get CDP ID, wsDebuggerUrl will be empty", { stableTabId });
396
+ // }
397
+ // const title = await pageInfo.page.title();
398
+ // const currentUrl = pageInfo.page.url();
399
+ // pageData.title = title;
400
+ // pageData.url = currentUrl;
401
+ // pageData.wsDebuggerUrl = wsDebuggerUrl; // Use the constructed URL
402
+ // pageInfo.lastKnownTitle = title;
403
+ // pageInfo.lastKnownUrl = currentUrl;
404
+ // pageInfo.lastKnownWsDebuggerUrl = wsDebuggerUrl;
405
+ // this.log("๐ŸŸฅPage data", pageData);
406
+ // } catch (error) {
407
+ // const message = error instanceof Error ? error.message : JSON.stringify(error);
408
+ // if (this.isTransientPageDataError(error)) {
409
+ // this.log("โณ Transient error getting page data, will retry", { stableTabId, message });
410
+ // } else {
411
+ // this.log("โŒ Error getting page data", { stableTabId, message });
412
+ // pagesToDelete.push(stableTabId); // Mark for deletion
413
+ // continue;
414
+ // }
415
+ // }
416
+ // if (!pageData.title) {
417
+ // pageData.title = pageInfo.page.url() === "about:blank" ? "" : "Loading...";
418
+ // }
419
+ // pagesData.push(pageData);
420
+ // }
421
+ // pagesToDelete.forEach((id) => this.pages.delete(id));
422
+ // if (this._selectedPageId && !this.pages.has(this._selectedPageId)) {
423
+ // this._selectedPageId = pagesData.length > 0 ? pagesData[0].id : null;
424
+ // this.log("๐Ÿ”„ Corrected selectedPageId", { new: this._selectedPageId });
425
+ // }
426
+ // if (!this._selectedPageId && pagesData.length > 0) {
427
+ // this._selectedPageId = pagesData[0].id;
428
+ // this.log("๐ŸŽฏ Set default selectedPageId", { new: this._selectedPageId });
429
+ // }
430
+ // const state = {
431
+ // pages: pagesData,
432
+ // selectedPageId: this._selectedPageId,
433
+ // };
434
+ // this.log("๐Ÿ“ฆ Final state", state);
435
+ // return state;
436
+ // }
437
+ // async createTab(url: string = "about:blank"): Promise<void> {
438
+ // try {
439
+ // this.log("๐Ÿ†• Creating new tab", { url });
440
+ // const page = await this.context.newPage(); // This will trigger the 'page' event
441
+ // if (url !== "about:blank") {
442
+ // await page.goto(url, { waitUntil: "domcontentloaded" });
443
+ // }
444
+ // for (const [stableTabId, pageInfo] of this.pages.entries()) {
445
+ // if (pageInfo.page === page) {
446
+ // this._selectedPageId = stableTabId;
447
+ // this.log("โœ… New tab created and selected", { stableTabId, url });
448
+ // break;
449
+ // }
450
+ // }
451
+ // await this.syncState();
452
+ // } catch (error) {
453
+ // this.log("โŒ Error creating tab", { error });
454
+ // }
455
+ // }
456
+ // async closeTab(stableTabId: string): Promise<void> {
457
+ // try {
458
+ // this.log("๐Ÿ—‘๏ธ Closing tab", { stableTabId });
459
+ // const pageInfo = this.pages.get(stableTabId);
460
+ // if (pageInfo) {
461
+ // await pageInfo.page.close(); // This will trigger the 'close' event
462
+ // } else {
463
+ // this.log("โš ๏ธ Page not found for closing", { stableTabId });
464
+ // }
465
+ // } catch (error) {
466
+ // this.log("โŒ Error closing tab", { error });
467
+ // }
468
+ // }
469
+ // async selectTab(stableTabId: string): Promise<void> {
470
+ // try {
471
+ // this.log("๐ŸŽฏ Selecting tab", { stableTabId });
472
+ // const pageInfo = this.pages.get(stableTabId);
473
+ // if (pageInfo) {
474
+ // this._selectedPageId = stableTabId;
475
+ // await pageInfo.page.bringToFront();
476
+ // this.log("โœ… Tab selected successfully", { stableTabId });
477
+ // await this.syncState();
478
+ // } else {
479
+ // this.log("โš ๏ธ Page not found for selection", { stableTabId });
480
+ // }
481
+ // } catch (error) {
482
+ // this.log("โŒ Error selecting tab", { error });
483
+ // }
484
+ // }
485
485
  getPageInfo(stableTabId) {
486
486
  if (!stableTabId) {
487
487
  this.log("โš ๏ธ Operation requested without a selected tab");
@@ -494,73 +494,69 @@ export class RemoteBrowserService extends EventEmitter {
494
494
  }
495
495
  return pageInfo;
496
496
  }
497
- async navigateTab(stableTabId, url) {
498
- const pageInfo = this.getPageInfo(stableTabId);
499
- if (!pageInfo) {
500
- return;
501
- }
502
- try {
503
- this.log("๐ŸŒ Navigating tab", { stableTabId, url });
504
- await pageInfo.page.goto(url, { waitUntil: "domcontentloaded" });
505
- this._selectedPageId = stableTabId;
506
- await this.syncState();
507
- }
508
- catch (error) {
509
- this.log("โŒ Error navigating tab", { stableTabId, url, error });
510
- throw error;
511
- }
512
- }
513
- async reloadTab(stableTabId) {
514
- const pageInfo = this.getPageInfo(stableTabId);
515
- if (!pageInfo) {
516
- return;
517
- }
518
- try {
519
- this.log("๐Ÿ”„ Reloading tab", { stableTabId, url: pageInfo.page.url() });
520
- await pageInfo.page.reload({ waitUntil: "domcontentloaded" });
521
- await this.syncState();
522
- }
523
- catch (error) {
524
- this.log("โŒ Error reloading tab", { stableTabId, error });
525
- throw error;
526
- }
527
- }
528
- async goBack(stableTabId) {
529
- const pageInfo = this.getPageInfo(stableTabId);
530
- if (!pageInfo) {
531
- return;
532
- }
533
- try {
534
- this.log("โฌ…๏ธ Navigating back", { stableTabId });
535
- const response = await pageInfo.page.goBack({ waitUntil: "domcontentloaded" });
536
- if (!response) {
537
- this.log("โ„น๏ธ No history entry to go back to", { stableTabId });
538
- }
539
- await this.syncState();
540
- }
541
- catch (error) {
542
- this.log("โŒ Error navigating back", { stableTabId, error });
543
- throw error;
544
- }
545
- }
546
- async goForward(stableTabId) {
547
- const pageInfo = this.getPageInfo(stableTabId);
548
- if (!pageInfo) {
549
- return;
550
- }
551
- try {
552
- this.log("โžก๏ธ Navigating forward", { stableTabId });
553
- const response = await pageInfo.page.goForward({ waitUntil: "domcontentloaded" });
554
- if (!response) {
555
- this.log("โ„น๏ธ No history entry to go forward to", { stableTabId });
556
- }
557
- await this.syncState();
558
- }
559
- catch (error) {
560
- this.log("โŒ Error navigating forward", { stableTabId, error });
561
- throw error;
562
- }
563
- }
497
+ // async navigateTab(stableTabId: string, url: string): Promise<void> {
498
+ // const pageInfo = this.getPageInfo(stableTabId);
499
+ // if (!pageInfo) {
500
+ // return;
501
+ // }
502
+ // try {
503
+ // this.log("๐ŸŒ Navigating tab", { stableTabId, url });
504
+ // await pageInfo.page.goto(url, { waitUntil: "domcontentloaded" });
505
+ // this._selectedPageId = stableTabId;
506
+ // await this.syncState();
507
+ // } catch (error) {
508
+ // this.log("โŒ Error navigating tab", { stableTabId, url, error });
509
+ // throw error;
510
+ // }
511
+ // }
512
+ // async reloadTab(stableTabId: string): Promise<void> {
513
+ // const pageInfo = this.getPageInfo(stableTabId);
514
+ // if (!pageInfo) {
515
+ // return;
516
+ // }
517
+ // try {
518
+ // this.log("๐Ÿ”„ Reloading tab", { stableTabId, url: pageInfo.page.url() });
519
+ // await pageInfo.page.reload({ waitUntil: "domcontentloaded" });
520
+ // await this.syncState();
521
+ // } catch (error) {
522
+ // this.log("โŒ Error reloading tab", { stableTabId, error });
523
+ // throw error;
524
+ // }
525
+ // }
526
+ // async goBack(stableTabId: string): Promise<void> {
527
+ // const pageInfo = this.getPageInfo(stableTabId);
528
+ // if (!pageInfo) {
529
+ // return;
530
+ // }
531
+ // try {
532
+ // this.log("โฌ…๏ธ Navigating back", { stableTabId });
533
+ // const response = await pageInfo.page.goBack({ waitUntil: "domcontentloaded" });
534
+ // if (!response) {
535
+ // this.log("โ„น๏ธ No history entry to go back to", { stableTabId });
536
+ // }
537
+ // await this.syncState();
538
+ // } catch (error) {
539
+ // this.log("โŒ Error navigating back", { stableTabId, error });
540
+ // throw error;
541
+ // }
542
+ // }
543
+ // async goForward(stableTabId: string): Promise<void> {
544
+ // const pageInfo = this.getPageInfo(stableTabId);
545
+ // if (!pageInfo) {
546
+ // return;
547
+ // }
548
+ // try {
549
+ // this.log("โžก๏ธ Navigating forward", { stableTabId });
550
+ // const response = await pageInfo.page.goForward({ waitUntil: "domcontentloaded" });
551
+ // if (!response) {
552
+ // this.log("โ„น๏ธ No history entry to go forward to", { stableTabId });
553
+ // }
554
+ // await this.syncState();
555
+ // } catch (error) {
556
+ // this.log("โŒ Error navigating forward", { stableTabId, error });
557
+ // throw error;
558
+ // }
559
+ // }
564
560
  async applyClipboardPayload(payload) {
565
561
  this.log("๐Ÿ“‹ applyClipboardPayload called", {
566
562
  hasText: !!payload?.text,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dev-blinq/cucumber_client",
3
- "version": "1.0.1654-dev",
3
+ "version": "1.0.1656-dev",
4
4
  "description": " ",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -39,7 +39,7 @@
39
39
  "@cucumber/tag-expressions": "^6.1.1",
40
40
  "@dev-blinq/cucumber-js": "1.0.211-dev",
41
41
  "@faker-js/faker": "^8.4.1",
42
- "automation_model": "1.0.906-dev",
42
+ "automation_model": "1.0.907-dev",
43
43
  "axios": "^1.7.4",
44
44
  "chokidar": "^3.6.0",
45
45
  "create-require": "^1.1.1",