【问题标题】:Electron desktop Application testing with[PLAYWRIGHT]使用 [PLAYWRIGHT] 进行电子桌面应用程序测试
【发布时间】:2022-08-16 21:59:36
【问题描述】:

我正在尝试使用 playwright 来自动化一个电子 js 应用程序,但我似乎找不到任何相关信息。为了自动化一个简单的程序,我使用了剧作家:- https://playwright.dev/docs/api/class-electronhttps://www.electronjs.org/docs/latest/tutorial/quick-start。但是,我无法在电子应用程序中获取元素(按钮、下拉菜单等)。任何可以深入指导我使用 playwright 自动化桌面应用程序的参考资料或文档。

    标签: electron playwright-test


    【解决方案1】:

    我刚刚使用和你一样的 Electron 和 React 完成了一系列 e2e 测试。你没看到什么?它至少会加载应用程序吗?

    分享一个测试的代码以及如何使用 .launch 方法启动。

    【讨论】:

      【解决方案2】:

      我让我的工作使用他们的intro guide 对我来说,因为安装程序会安装其他组件,所以我必须构建和安装,然后提供 exe 的路径

      在我的 package.json 中有。

      "playwright": "^1.25.0",
      "@playwright/test": "^1.25.0",
      "eslint-plugin-playwright": "^0.10.0",
      

      我创建了这个类来帮助我拥有更简洁的代码。

      import { _electron as electron, ElectronApplication, Page } from 'playwright';
      class ElectronAppController {
        static electronApp: ElectronApplication;
        static window1: Page;
        static window2: Page;
        static window3: Page;
      
        static async launchApp() {
          ElectronAppController.electronApp = await electron.launch({
            executablePath: 'C:\\pathTo\\app.exe',
          });
          ElectronAppController.electronApp.on('window', async (page) => {
            ElectronAppController.assignWindows(page);
          });
          const mywindows: Page[] =
            await ElectronAppController.electronApp.windows();
          for (
            let index = 0, l = mywindows.length;
            index < l;
            index += 1
          ) {
            ElectronAppController.assignWindows(
              mywindows[index]
            );
          }
        }
      
        private static assignWindows(page: Page) {
          const myurl = path.basename(page.url());
          if (myurl === 'window1.html') {
            ElectronAppController.window1= page;
          }
          if (myurl === 'window2.html') {
            ElectronAppController.window2= page;
          }
          if (myurl === 'window3.html') {
            ElectronAppController.window3= page;
          }
          return true;
        }
      }
      

      测试文件名应该是[name].spec.ts,别忘了导入

      test.describe('First Window Tests', async () => {
        test.beforeAll(async () => {
          await ElectronAppController.launchApp();
        });
      
        test('Check if first window opened', didLaunchApp);
      
        test('name of the test', async () => {
          // test body
          // this will allow you to record a test very useful, but sometimes it has some problems check note bellow 
          await ElectronAppController.window1.pause;
        });
        
        test.afterAll(async () => {
          await ElectronAppController.electronApp.close();
        });
      });
      

      这是一个 didLaunchApp 就像一个简单的测试

      const didLaunchApp = async () => {
        const isVisible: boolean = await ElectronAppController.electronApp.evaluate(
          async ({ BrowserWindow }) => {
            const mainWindow = BrowserWindow.getAllWindows()[0];
            const getState = () => mainWindow.isVisible();
      
            return new Promise((resolve) => {
              if (mainWindow.isVisible()) {
                resolve(getState());
              } else {
                mainWindow.once('ready-to-show', () => {
                  setTimeout(() => resolve(getState()), 0);
                });
              }
            });
          }
        );
        await expect(isVisible).toBeTruthy();
      };
      

      您可以记录测试,但有时如果您有一些弹出窗口或其他影响悬停在元素上的效果,这可能会产生一些问题,

      你可以阅读更多关于选择器here

      【讨论】:

        猜你喜欢
        • 2023-01-24
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2023-02-17
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多