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:
- 获取所有已创建的BrowserWindow实例
- 根据页面的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
相关产品推荐
相关产品推荐

