[MCP]: --extension --background: noDefaults skips focus emulation, hidden tabs get no rAF and clicks time out

Đang mở
#44,096 2 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@microsoft-playwright-automation đang làm issue này rồi.

Từ ngày 13/11/2026.

  • #44101 của @microsoft-playwright-automation — đang mở

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
25/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Đình trệ
Công nghệ
typescript
Lĩnh vực
testing-qa

Hướng nghiên cứu

Read packages/playwright-core/src/tools/mcp/extensionContextFactory.ts and packages/playwright-core/src/server/chromium/crPage.ts to trace how noDefaults affects focus emulation; compare the issue’s hidden-tab reproduction with focus emulation enabled. Check linked PR #44101, which is already open. Done means the reported background-tab click and Enter failures are addressed without overriding the user's browser defaults.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

agent-triage

Follow-up to #43868, as asked there: with extension 0.5.0 and @playwright/mcp 0.0.85, clicks and Enter still fail in --background tabs. In my setup focus emulation isn't enabled on the controlled tab.

What's going on?

In a tab controlled by @playwright/mcp --extension --background (not the active tab of its window), the page reports:

  • document.visibilityState === 'hidden', document.hasFocus() === false
  • 0 requestAnimationFrame callbacks in 2 s, and a 10 ms setTimeout loop runs about once per second

On https://en.wikipedia.org/wiki/Main_Page:

  • browser_click on the "Search" button fails with TimeoutError: browserBackend.callTool: Timeout 5000ms exceeded., and the call log ends at waiting for element to be visible, enabled and stable
  • browser_type with submit: true, and a later browser_press_key Enter, leave the page on Main_Page: the search is never submitted
Why

In #43868 the comment says Playwright enables focus emulation on each page. On main today, the extension path still connects with noDefaults: true (packages/playwright-core/src/tools/mcp/extensionContextFactory.ts, line 45):

const browser = await playwright.chromium.connectOverCDP(relay.cdpEndpoint(), { isLocal: true, timeout: 0, noDefaults: true });

In packages/playwright-core/src/server/chromium/crPage.ts (lines 547-552), noDefaults on the default context also skips focus emulation:

const skipDefaultOverrides = browserOptions.noDefaults &&
    this._crPage._browserContext === this._crPage._browserContext._browser._defaultContext;
...
if (this._isMainFrame() && !skipDefaultOverrides)
  promises.push(this._client.send('Emulation.setFocusEmulationEnabled', { enabled: true }));

I understand noDefaults is there so the extension doesn't override the user's existing browser defaults (#42117). Focus emulation goes with them, and it's the setting that lets a background tab render and pass actionability checks.

Repro without the extension

Plain connectOverCDP with noDefaults: true, against Chrome started with --remote-debugging-port=9334 and a fresh --user-data-dir:

const { chromium } = require('playwright-core');
(async () => {
  const b = await chromium.connectOverCDP('http://127.0.0.1:9334', { noDefaults: true });
  const ctx = b.contexts()[0];
  const bg = ctx.pages()[0];
  await bg.goto('https://example.com');
  const fg = await ctx.newPage(); await fg.goto('https://example.com'); await fg.bringToFront();
  const frames = () => bg.evaluate(async () => { const t0 = performance.now(); let n = 0;
    await new Promise(r => { const f = () => { n++; performance.now() < t0 + 2000 ? requestAnimationFrame(f) : r(); };
      requestAnimationFrame(f); setTimeout(r, 2500); });
    return { vis: document.visibilityState, raf: n }; });
  console.log(await frames());                                   // { vis: 'hidden', raf: 0 }
  await bg.click('a', { trial: true, timeout: 5000 }).catch(e => console.log('timeout'));  // timeout
  const s = await ctx.newCDPSession(bg);
  await s.send('Emulation.setFocusEmulationEnabled', { enabled: true });
  console.log(await frames());                                   // { vis: 'visible', raf: 97-103 }
  await bg.click('a', { trial: true, timeout: 5000 });           // ok
  await b.close();
})();

The same setup on the Wikipedia main page, filling the search box in the hidden tab and then pressing Enter or clicking "Search":

visibilityState Enter submits the search click on "Search"
focus emulation off hidden no (still on Main_Page after 8 s) Timeout 5000ms exceeded, waiting for "stable"
focus emulation on visible yes ok, 717 ms

Through the extension I couldn't turn it on from the MCP side: browser_run_code_unsafe with page.context().newCDPSession(page) returns Protocol error (Target.attachToBrowserTarget): {"code":-32000,"message":"Not allowed"}, and I found no option for it.

Suggestion

Keep noDefaults for the user's browser defaults, but enable Emulation.setFocusEmulationEnabled on the tabs the MCP controls in extension mode, at least with --background.

Version

@playwright/mcp 0.0.85 (playwright-core 1.66.0-alpha-2026-11-09), Playwright Extension 0.5.0, Google Chrome 157.0.8103.52, macOS 27.2, Node 20.6.1. The test in #43868 used Chromium 158.0.8127.2. I haven't tested 158.

Ngôn ngữ chính
TypeScript
Star
99.7k
Fork
6.8k
Merge trung bình
16 giờ 10 phút
Pull request đã merge (30 ngày)
301

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của microsoft/playwright

Tất cả issue của microsoft/playwright

Issue tương tự

Thêm issue về TypeScript

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.