Доступ к нескольким рендерерам со спектроном
Я работаю над приложением Электрон. Основной процесс открывает первый рендер (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, но я не думаю, что это проблема. Так что, если кто-нибудь знает, как заставить это работать с Мокко или чем-то еще, это было бы очень полезно.
Спасибо!
2 ответа
Следуя философии ответа Тима, вместо BrowserWindow мы можем использовать WebDriverIO, чтобы сфокусировать нужное окно:
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
});
});
Как пользователь, 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');
it('Switch window', async () => {
await app.client.waitUntilWindowLoaded(100000)
.windowByIndex(0);
.windowByIndex(1);
})