You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PlayWright Electron:能否从Page获取对应的BrowserWindow对象?

获取Electron页面对应的BrowserWindow对象

我需要在Electron测试场景中,根据已加载的页面实例获取对应的BrowserWindow对象,用来做窗口可见性这类验证。当前代码逻辑是监听窗口创建事件,根据页面标题区分窗口,但找不到正确的方法把page实例转为BrowserWindow:

let window1 : BrowserWindow | null = null
let window2 : BrowserWindow | null = null

electronApp.on("window", async (page) => {
  // 等待页面标题加载完成
  await page.evaluate(() => { });
  if(await page.title() === 'page1') {
    window1 = getElectronBrowserWindow(page); // 需要替换成实际可行的方法
  }
  else if(await page.title() === 'page2') {
    window2 = getElectronBrowserWindow(page);
  }
});

测试时需要调用BrowserWindow的实例方法:

test("check if window is not visible", async () => {
  let visibility = window1.isVisible();
  expect(visibility).toBeFalsy();
});

之前试过electronApplication.browserWindow(page),但无法返回对应的BrowserWindow对象。


解决方法

可以通过页面实例的webContents.id来匹配对应的BrowserWindow:

  1. 获取所有已创建的BrowserWindow实例
  2. 根据页面的webContents ID进行匹配

修改后的代码如下:

import { BrowserWindow } from 'electron';

// 自定义方法:通过page获取对应的BrowserWindow
function getElectronBrowserWindow(page: any): BrowserWindow | null {
  // 获取所有当前的BrowserWindow实例
  const allWindows = BrowserWindow.getAllWindows();
  // 获取当前page对应的webContents ID
  const webContentsId = page.mainFrame()._id;
  // 匹配对应窗口
  return allWindows.find(window => window.webContents.id === webContentsId) || null;
}

// 监听事件中使用该方法
electronApp.on("window", async (page) => {
  await page.evaluate(() => { });
  const title = await page.title();
  if(title === 'page1') {
    window1 = getElectronBrowserWindow(page);
  } else if(title === 'page2') {
    window2 = getElectronBrowserWindow(page);
  }
});

如果使用playwright-electron,也可以尝试page.context().browserWindow(),但webContents ID匹配的方式兼容性更强,能避免部分场景下直接调用返回空的问题。

注意要确保调用getElectronBrowserWindow时,页面的webContents已经完成初始化,避免ID匹配失败。


内容的提问来源于stack exchange,提问作者Nikhil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:35:35