Skip to content
This repository has been archived by the owner on Feb 16, 2024. It is now read-only.

How to test astilectron UI - chromedp? #248

Open
chinenual opened this issue May 15, 2020 · 12 comments
Open

How to test astilectron UI - chromedp? #248

chinenual opened this issue May 15, 2020 · 12 comments
Assignees
Labels

Comments

@chinenual
Copy link

I'm considering writing some integration tests for my astilectron based app -- but I can't find a way to get a testing tool to attach to the electron instance. Even when I have DevTools open and enabled, I don't see anything listening on a port that appears to be something I could specify as a websocket URL for devtools.

Has anyone else successfully driven their astilectron application from a test harness?

I'm specifically looking at chromedp since it's go based, but would consider other alternatives if others are having success.

@asticode
Copy link
Owner

I have not tried to write integration tests for an astilectron based app but here are 2 issues that could point you to the right direction:

#170
#90

@asticode asticode self-assigned this May 15, 2020
@chinenual
Copy link
Author

chinenual commented May 16, 2020

#90 looks relevant, but I am not able to connect the dots - not sure how the referenced pull request makes it possible to run Selenium tests.

Perhaps still related, chromedp wants to connect to ChromeDevTools via a websocket -- and I've seen some howto's for "javascript electron" on how to pass arguments to enable it (e.g. https://stackoverflow.com/questions/30294600/how-to-include-chrome-devtools-in-electron#30638448) . I don't understand go-astilectron's magic sauce enough to know where to look to try to add something like this for go-astilectron. Hints?

@asticode
Copy link
Owner

I think the idea of this PR is:

  1. You set a custom Executer that does not execute astilectron
  2. You remove the TCP timeout so that go-astilectron doesn't return an error if no astilectron connects after 30s
  3. You execute astilectron manually using a bash script or something else in which you also run Selenium

I've never used Selenium so I may be wrong

@chinenual
Copy link
Author

I'm trying a different tact. I've added options to enable the dev tools websocket via ElectronSwitches:

			ElectronSwitches: []string{
				"remote-debugging-port", "8315",
				"host-rules", "MAP * 127.0.0.1",

and for now I'm not worrying about launching the executable automatically from the test harness. I'm able to connect to the dev tools socket, but so far I've been unsuccessful getting chromedp to drive the application (it's getting 404 errors when trying to connect). Will keep at it and report back if I make any progress...

@chinenual
Copy link
Author

Update .. Still no joy. I've made more progress such that I think I'm calling the remote debugging websocket properly (the same style URL works on "normal chrome" - but doesn't work on my astilectron application, even when I enable the debugging port (and verify that it works - can access the http://localhost:8315/json/version API URL and get back good response. Can even remotely debug using a remote browser via the URLs returned by the API. But when I try to connnect chromedp , I get an error (I believe chrome/electron is returning a "not supported" error code to chromedp. I've submitted an issue to that project as chromedp/chromedp#628).

When I try to connect a nodejs based spectron test harness, it just hangs. So there's still something not quite right.

If anyone has any other ideas of things I should try, I'm all ears. I don't see any other electron command line switches that might be relevant...

@chinenual
Copy link
Author

@asticode - while I don't fully understand how it will work, I am trying to use the Executer support to defer creating the electron process as described in #90

However, I'm using go-astilectron-bootstrap and can't figure out where to set the Executer function. I've set a long timeout via bootstrap's AstilectronOptions.AcceptTCPTimeout, but I can't pass the executer there -- I tried calling a.SetExectuter in the OnWait callback, but it seems to be too late in the lifecycle. Where can I get my hands on the astilectron instance soon enough to prevent it from calling the default executer?

	if err := bootstrap.Run(bootstrap.Options{
		AstilectronOptions: astilectron.Options{
...
			AcceptTCPTimeout: acceptTimeout,
		},
		OnWait: func(as *astilectron.Astilectron, ws []*astilectron.Window, _ *astilectron.Menu, _ *astilectron.Tray, _ *astilectron.Menu) error {
			a = as
			w = ws[0]

			if *uitest {
				a.SetExecuter(executer)
			}

@asticode
Copy link
Owner

asticode commented Jun 9, 2020

If you use the Adapter attribute of bootstrap.Options, you should be able to manipulate your *astilectron.Astilectron and therefore use a.SetExecuter.

@chinenual
Copy link
Author

Thanks @asticode ! That, of course, works. Now to try to get chromedp or selenium to talk to the electron process...

        var executer = astilectron.DefaultExecuter
	var acceptTimeout = astilectron.DefaultAcceptTCPTimeout
	var adapter bootstrap.AstilectronAdapter = nil

	if *uitest {
		executer = func(l astikit.SeverityLogger, a *astilectron.Astilectron, cmd *exec.Cmd) (err error) {
			l.Infof("======= NOT STARTING CMD %s\n", strings.Join(cmd.Args, " "))
			return
		}

		acceptTimeout = time.Minute * 3

		adapter = func(a *astilectron.Astilectron) {
			l.Printf("======= In UI Test adapter - supressing executor\n")
			a.SetExecuter(executer)
		}
	}

@chinenual
Copy link
Author

While I've not had any luck getting the go-based chromedp to work, I have finally cracked the code of getting a nodejs based Spectron (selenium webdriver) test working.

@asticode would it be helpful for me to add this to the boostrap demo? I can work on a PR in the next few days...

@asticode
Copy link
Owner

If that's not too much trouble for you, I'm curious what the PR would look like. I can't promess it will be merged though

@chinenual
Copy link
Author

OK - I've created a PR (asticode/go-astilectron-demo#62). See the comments for a known problem with Linux and more generally a possible improvement with the provisioner.

@carmel
Copy link

carmel commented Apr 29, 2022

Thanks @asticode ! That, of course, works. Now to try to get chromedp or selenium to talk to the electron process...

        var executer = astilectron.DefaultExecuter
	var acceptTimeout = astilectron.DefaultAcceptTCPTimeout
	var adapter bootstrap.AstilectronAdapter = nil

	if *uitest {
		executer = func(l astikit.SeverityLogger, a *astilectron.Astilectron, cmd *exec.Cmd) (err error) {
			l.Infof("======= NOT STARTING CMD %s\n", strings.Join(cmd.Args, " "))
			return
		}

		acceptTimeout = time.Minute * 3

		adapter = func(a *astilectron.Astilectron) {
			l.Printf("======= In UI Test adapter - supressing executor\n")
			a.SetExecuter(executer)
		}
	}

Hi, @chinenual Did you implement the test function you mentioned using chromedp?

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

3 participants