使用Spectron访问多个渲染器

时间:2018-09-01 18:15:27

标签: mocha electron webdriver-io ava spectron

我正在开发电子应用程序。主进程将打开第一个渲染器(browserWindow)。当用户单击按钮时,此渲染器将IPC消息发送到主进程。收到此消息后,主进程将打开另一个不同的渲染器。这两个渲染器同时存在。该应用程序运行正常。

然后,使用Spectron测试该应用程序,如何访问两个渲染器?问题是app.rendererProcess总是返回第一个渲染器。

app.client的问题相同,该问题始终包含第一个渲染器的WebdriverIO browser对象,从不包含第二个渲染器。

是否可以列出测试中Spectron应用程序的所有过程?是否可以访问第二个渲染器的browser对象?

使用AVA:

test.(async t => {
    // the application is open before the test
    // at this point, the first renderer is open

    // click on the button to open the second renderer
    await t.context.app.client.click('#bt_openSecondRenderer');

    // wait for the second renderer to open

    // error: this element doesn't exist
    await t.context.app.client.click('elt_of_the_scnd_renderer');
});

我正在使用AVA,但我不认为这是问题所在。因此,如果有人知道如何与Mocha或其他工具配合使用,那将非常有帮助。

谢谢!

3 个答案:

答案 0 :(得分:2)

按照Tim answer给出的原理,我们可以使用WebDriverIO来聚焦所需的窗口,而不是使用BrowserWindow:

test.(async t => {
    // here, t.context.app.client handles the first window
    await t.context.app.client.windowByIndex(1).then(() => {
        // here, t.context.app.client handles the second window
    });
});

答案 1 :(得分:1)

像用户一样,Specton只能与聚焦窗口进行交互。 应该可以工作,但我尚未对其进行测试:

// The docs say that app.electron gives you access to all the Electron APIs
// This should get you a list of BrowserWindows
const windows = await t.context.app.electron.BrowserWindow.getAllWindows();

// Focus the window you want to interact with
windows[1].focus();

// Do your clicking
await t.context.app.client.click('elt_of_the_scnd_renderer');

答案 2 :(得分:0)

  it('Switch window', async () => {
    await app.client.waitUntilWindowLoaded(100000)
      .windowByIndex(0);
      .windowByIndex(1);
})