Spectron app.client.close() 不会触发 on('close' 事件
Spectron app.client.close() does not trigger on('close' event
我有一个 multiwindow 电子应用程序,即它由一个启动器 window 和一个主程序 window 组成。
主进程负责首先显示启动器,在初始化所有内容后,它通过 ipc 获取事件并显示主进程window,隐藏启动器。
我在主 window 上使用 on('close')
来检测用户何时关闭主 window,再次显示启动器并执行一些拆卸逻辑,然后完成应用程序退出。
this.mainWindow = new BrowserWindow({width: 1024, height: 768, webPreferences: {nodeIntegration: true}});
this.mainWindow.setMenu(null);
this.mainWindow.on('close', () => {
this.logger.debug('"close" received');
this.mainWindow.hide();
this.launcherWindow.show();
this.sendShutdown();
});
这很好用,现在我想用 Spectron 集成测试这个行为。我在向 window 发送关闭信号时遇到问题,模拟用户单击关闭。
it('should start shutting down the services gracefully if the user clicks on the close button', async () => {
await app.client.windowByIndex(1);
await app.client.close();
//..... expectations that verify the launcher window is visible now
});
我已经验证索引为 1 的 window 是主要的 window。当我调用 app.client.close();
时,主 window 关闭,但我可以在日志中看到主 window 的 on('close', )
事件未被触发,因此它不会跳回到启动器。
我有什么遗漏/误解吗?
我最终包装了在额外方法中执行的代码,并将该方法绑定到 ipcMain.on("should-shutdown",..
事件。无论如何这是有道理的,因为其他渲染器也应该能够请求平滑关闭。
然后在 Spectron 测试中我使用了
const { ipcRenderer } = app.electron;
ipcRenderer.send('smooth-shutdown');
而不是 app.client.close()
来启动关机程序。
在main.js中添加以下代码
mainWindow.on('close', async function (event) {
if(process.env.NODE_ENV=="test"){
app.isQuiting = true;
app.quit();
}
//other codes
})
在测试用例中添加NODE_ENV=test
beforeAll(async function (done) {
this.app = new Application({
path: electronPath,
chromeDriverArgs: ['--no-sandbox'],
args: [path.join(__dirname, '../main.js')],
env: {NODE_ENV: 'test'},
waitTimeout: 10e2
});
await this.app.start()
done();
})
afterAll(async function (done) {
if (this.app && this.app.isRunning()) {
await this.app.stop();
done();
} else {
done();
}
})
我有一个 multiwindow 电子应用程序,即它由一个启动器 window 和一个主程序 window 组成。
主进程负责首先显示启动器,在初始化所有内容后,它通过 ipc 获取事件并显示主进程window,隐藏启动器。
我在主 window 上使用 on('close')
来检测用户何时关闭主 window,再次显示启动器并执行一些拆卸逻辑,然后完成应用程序退出。
this.mainWindow = new BrowserWindow({width: 1024, height: 768, webPreferences: {nodeIntegration: true}});
this.mainWindow.setMenu(null);
this.mainWindow.on('close', () => {
this.logger.debug('"close" received');
this.mainWindow.hide();
this.launcherWindow.show();
this.sendShutdown();
});
这很好用,现在我想用 Spectron 集成测试这个行为。我在向 window 发送关闭信号时遇到问题,模拟用户单击关闭。
it('should start shutting down the services gracefully if the user clicks on the close button', async () => {
await app.client.windowByIndex(1);
await app.client.close();
//..... expectations that verify the launcher window is visible now
});
我已经验证索引为 1 的 window 是主要的 window。当我调用 app.client.close();
时,主 window 关闭,但我可以在日志中看到主 window 的 on('close', )
事件未被触发,因此它不会跳回到启动器。
我有什么遗漏/误解吗?
我最终包装了在额外方法中执行的代码,并将该方法绑定到 ipcMain.on("should-shutdown",..
事件。无论如何这是有道理的,因为其他渲染器也应该能够请求平滑关闭。
然后在 Spectron 测试中我使用了
const { ipcRenderer } = app.electron;
ipcRenderer.send('smooth-shutdown');
而不是 app.client.close()
来启动关机程序。
在main.js中添加以下代码
mainWindow.on('close', async function (event) {
if(process.env.NODE_ENV=="test"){
app.isQuiting = true;
app.quit();
}
//other codes
})
在测试用例中添加NODE_ENV=test
beforeAll(async function (done) {
this.app = new Application({
path: electronPath,
chromeDriverArgs: ['--no-sandbox'],
args: [path.join(__dirname, '../main.js')],
env: {NODE_ENV: 'test'},
waitTimeout: 10e2
});
await this.app.start()
done();
})
afterAll(async function (done) {
if (this.app && this.app.isRunning()) {
await this.app.stop();
done();
} else {
done();
}
})