electron-userland / spectron

DEPRECATED: 🔎 Test Electron apps using ChromeDriver
http://electronjs.org/spectron
MIT License
1.68k stars 229 forks source link

Can't interact with dialog #23

Open krzkaczor opened 8 years ago

krzkaczor commented 8 years ago

I am opening dialog in my app like this:

const path = dialog.showOpenDialog(remote.getCurrentWindow(), {
      title: i18n.t("Where do you want to save it?"),
      properties: ['openDirectory', 'createDirectory']
    });

And I cannot find way to select directory in tests. I tried using webdriverio's keys with no luck. I thought that maybe electron creates second window and that's why I can't interact with it but by using client.getWindowCount() it founds only 1 window. Any ideas?

kevinsawicki commented 8 years ago

Any ideas?

I don't think dialogs can be tested well yet via ChromeDriver and Spectron. Will look into this further.

remss commented 8 years ago

Same issue with dialog.showMessageBox

davej commented 8 years ago

Also encountered this. Got around it with a super-simple mock version of dialog that is used when the application is started with a test ENV. It works ok but it's very messy.

davej commented 8 years ago

See #94 for a somewhat graceful way of mocking dialogs for the moment.

tansaku commented 7 years ago

I guess we can't just use the webdriver alert accept/dismiss functionality? http://webdriver.io/api/protocol/alertAccept.html

tansaku commented 7 years ago

it doesn't look like that works, but seems like I can use robotjs to send keypresses that are intercepted by the dialog so that I can hit enter and close the dialog etc., which is at least part of the job done I guess ...

myfrndjk commented 7 years ago

issue is still there as discussed with webdriverio community https://github.com/electron/spectron/issues/236

screen shot 2017-10-05 at 1 55 25 pm
cmdcolin commented 6 years ago

This node package spectron-fake-dialog implements a technique that I thought worked pretty well https://www.npmjs.com/package/spectron-fake-dialog

talhaguy commented 4 years ago

Hi - are we now able to use the real dialog object instead of the mock?

danielroehrig commented 4 years ago

Don't think so. I've been trying for the last couple of days but can't seem to find a way to mock dialogs.

talhaguy commented 4 years ago

Darn - here's a snippet of my code on how I'm mocking for now. I can probably clean this up, but it does the job for now. Basically it uses the NODE_ENV to decide to inject a mock dialog or not.

import path from "path"
import { Dialog, OpenDialogOptions, OpenDialogReturnValue } from "electron"

export const dialogMock: Dialog = {
    showOpenDialog: (options: OpenDialogOptions) => {
        const openDialogReturnValue: OpenDialogReturnValue = {
            canceled: false,
            filePaths: [
                path.join(__dirname, "..", process.env.E2E_TEST_FOLDER),
            ],
        }

        return Promise.resolve(openDialogReturnValue)
    },
} as any
import { onSelectFolderStart as _onSelectFolderStart } from "./integration/openDialog"
import { dialog, IpcMainEvent } from "electron"
import { dialogMock } from "../../../e2e/dialogMock"

// need to use mocked dialog (set from e2e test file) for spectron testing due to limitations of not being able to interact with OS dialogs
const dialogModule = process.env.NODE_ENV === "spectron" ? dialogMock : dialog

export const onSelectFolderStart = ((dialog) => (event: IpcMainEvent) =>
    _onSelectFolderStart(dialog, event))(dialogModule)

And then I run my test using:

npm run NODE_ENV=spectron E2E_TEST_FOLDER=e2e-temp jest --config=jest.config.e2e.js

There's also the https://github.com/joe-re/spectron-fake-dialog though it didn't work with my code (maybe because of my factory function).

danielroehrig commented 4 years ago

There is also spectron-dialog-addon which is a newer fork of spectron-fake-dialog but it only supports electron up to 6 and I am on electron 9 and I didn't get it to work.