我正在尝试与剧作家一起自动化电子应用程序,并在我需要保存或打开文件的时候遇到了困难。在触发保存或打开文件菜单项后,我无法获取正在打开的对话框。
我尝试使用以下两个事件,但它们似乎都不起作用。
ElectronApp.waitForEvent('窗口')
window.waitForEvent('文件选择器')
有什么方法可以获取打开的保存对话框,以便我可以访问保存按钮并通过 e2e 脚本完成保存功能。
你不能。作为解决方法,您可以模拟文件保护程序窗口。
示例:
const svgPath = path.join(__dirname, 'resources', 'generated.svg');
await app.evaluate(async ({ dialog }, svgPath) => {
dialog.showSaveDialog = () => Promise.resolve({ filePath: svgPath, canceled: false });
}, svgPath);
await page.click('text=Export SVG');
上面我模拟了
dialog.showSaveDialog
来保存 SVG 文件。
app
来自 await _electron.launch(...)
,page
来自 await app.firstWindow();
不会弹出文件保护程序窗口。但你的应用程序可以直接通过模拟获取
filePath
。
看起来这是一个bug。
除了模拟之外,您还可以将输入移至客户端。如果你有类似的东西
<input data-testid="my-input" type="file" multiple onchange=""/>
您可以使用 Playwright 输入文件,如下所示。
const window = await electronApp.firstWindow();
const myInput = window.getByTestId('my-input');
expect(myInput).not.toBe(undefined);
myInput.click();
await new Promise<void>(resolve => {
window.on('filechooser', async (fileChooser) => {
await fileChooser.setFiles(path.join(__dirname, "file.txt"));
resolve();
});
})