playwrightplaywright-testelectron-vue

PlayWright Electron: Is it possible to get BrowserWindow from Page?


I'm trying to find the electron window object that contains the loaded page. I want to take the following action:

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

  electronApp.on("window", async (page) => {
    //evaluate page so that title is loaded
    await page.evaluate(() => { });
    if(await page.title() === 'page1') {
      window1 = getElectronBrowserWindow(page); // Example
    }
    else if(await page.title() === 'page2') {
      window2 = getElectronBrowserWindow(page);
  }
  });

In my test I would like to do something like:

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

I've come across electronApplication.browserWindow(page). However, it does not provide the page's BrowserWindow object.


Solution

  • Yes, it can be done.

    What electronApplication.browserWindow(page) provides is an object of type JSHandle<Electron.BrowserWindow>. You have to use itsevaluate() method.

    I'm not sure of all the details of your test and the differences b/w window1 and window2, but here's an example of testing that a browser window is visible. Hopefully this clarifies

    import { expect, test } from "@playwright/test";
    import { ElectronApplication, Page, JSHandle, _electron } from "playwright";
    
    let electronApp: ElectronApplication;
    let page: Page;
    let bwHandle: JSHandle<Electron.BrowserWindow>;
    
    test.beforeAll(async () => {
      electronApp = await _electron.launch({
        // your launch options
      });
      page = await electronApp.firstWindow();
    });
    
    test("check if window is visible", async () => {
      bwHandle = await electronApp.browserWindow(page);
      const visible = await bwHandle.evaluate((win) => win.isVisible());
      expect(visible).toBeTruthy();
    });
    
    test.afterAll(async () => {
      await electronApp.close();
    });