Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions src/browser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,33 @@ describe('BrowserManager', () => {
expect(result.remaining).toBe(1);
}
});

it('should auto-switch to externally opened tab (window.open)', async () => {
// Ensure we start on tab 0
const initialIndex = browser.getActiveIndex();
expect(initialIndex).toBe(0);

const page = browser.getPage();

// Use window.open to create a new tab externally (as a user/script would)
await page.evaluate(() => {
window.open('about:blank', '_blank');
});

// Wait for the new page event to be processed
await new Promise((resolve) => setTimeout(resolve, 500));

// Active tab should now be the newly opened tab
const newIndex = browser.getActiveIndex();
expect(newIndex).toBe(1);

const tabs = await browser.listTabs();
expect(tabs.length).toBe(2);
expect(tabs[1].active).toBe(true);

// Clean up: close the new tab
await browser.closeTab(1);
});
});

describe('context operations', () => {
Expand Down
13 changes: 12 additions & 1 deletion src/browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1278,7 +1278,7 @@ export class BrowserManager {

/**
* Set up tracking for new pages in a context (for CDP connections and popups/new tabs)
* This handles pages created externally (e.g., via target="_blank" links)
* This handles pages created externally (e.g., via target="_blank" links, window.open)
*/
private setupContextTracking(context: BrowserContext): void {
context.on('page', (page) => {
Expand All @@ -1287,6 +1287,17 @@ export class BrowserManager {
this.pages.push(page);
this.setupPageTracking(page);
}

// Auto-switch to the newly opened tab so subsequent commands target it.
// For tabs created via newTab()/newWindow(), this is redundant (they set activePageIndex after),
// but for externally opened tabs (window.open, target="_blank"), this ensures the active tab
// stays in sync with the browser.
const newIndex = this.pages.indexOf(page);
if (newIndex !== -1 && newIndex !== this.activePageIndex) {
this.activePageIndex = newIndex;
// Invalidate CDP session since the active page changed
this.invalidateCDPSession().catch(() => {});
}
});
}

Expand Down