Hi Stefan, I tried your code as-is and it works for me, the JUnit test is successful.
Make sure that the test is run in a non-UI thread, otherwise if the test runs in the UI thread, it won't give a chance for the asyncExec() to execute. I think you could create the dialog with a null parent shell in openConfirm() instead of an new invisible shell. I would put back getting the dialog shell by name and activate() it, otherwise the button() call could find any "OK" button anywhere in any shell. To be more strict, get a bot() from SWTShell, and find the button in that bot. That will restrict the search to the widgets inside that specific shell. Patrick On Fri, Sep 21, 2018 at 3:49 AM Stefan Nöbauer < stefan.noeba...@kgu-consulting.com> wrote: > Hi Patrick, > > > > Thanks for your answer! > > > > But somehow Display.asyncExec is not called at all in my test. > > The syncExec is calling my MessageDialog fine. But than the test is > waiting for the Dialog to be closed. > > > > My code locks like that now: > > > > @Test > > *public* *void* testInfoDialogWithDontShowAgain() { > > > > Display.*getDefault*().asyncExec(() -> { > > System.*out*.println("Hallooooo"); > > MessageDialog.*openConfirm*(*new* Shell(Display.*getDefault*()), "A > > MessageDialog", "Buhu"); > > }); > > > > SWTBotPreferences.*PLAYBACK_DELAY* = 100; > > > > SWTBot bot = *new* SWTBot(); > > bot.button("OK").click(); > > } > > > > Could you give me an example to open this MessageDialog and close it with > SWTBot by clicking the OK Button? > > > > Thanks very much > > Stefan > > > > > > *Von:* swtbot-dev-boun...@eclipse.org <swtbot-dev-boun...@eclipse.org> *Im > Auftrag von *Patrick Tasse > *Gesendet:* Donnerstag, 20. September 2018 20:58 > *An:* SWTBot developers list <swtbot-dev@eclipse.org> > *Betreff:* Re: [swtbot-dev] Testing simple SWT Dialogs > > > > Hi Stefan, > > > > The short answer is that the Shell you create to feed to the SWTBot > instance has not been opened, so there is no active shell which makes > activeShell() fail. > > > > Long answer: > > > > Usually we use SWTBot to test an existing application. Here the test is > both creating the application and testing it. I guess it is OK for trying > out SWTBot. > > > > However you probably should create your application (the Dialog under > test) using purely SWT APIs, not using SWTBot APIs (for example you can use > Display.getDefault().asyncExec(...) directly). Then use SWTBot APIs to test > the dialog. > > > > I would try to avoid using activeShell() as much as possible. Lately we > notice problems where opened shells do not become active, due to the > platform or the window manager, I'm not sure. But it's usually better to > get a shell by name and activate it manually, like you do at the end of the > test. > > > > It's usually not necessary to add sleeps in the tests, most SWTBot finder > methods like shell(...) or button(...) have a retry with timeout mechanism, > so if the searched widget comes only after a short delay, it still works. > Not activeShell() though, it tries only once and fails immediately... > > > > Hope this helps, > > Patrick > > > > On Thu, Sep 20, 2018 at 8:52 AM Stefan Nöbauer < > stefan.noeba...@kgu-consulting.com> wrote: > > Hi, > > > > I am new to SWTBot and have some troubles writing my first test for a > simple Dialog. > > > > My test looks like: > > > > *public* *void* testInfoDialogWithDontShowAgain() { > > SWTBotPreferences.*PLAYBACK_DELAY* = 100; > > > > bot = *new* SWTBot(*new* Shell(Display.*getDefault*())); > > > > bot.activeShell().display.asyncExec(*new* Runnable() { > > *public* *void* run() { > > MessageDialog.*openConfirm*(bot.activeShell().widget, "A > MessageDialog", "Buhu"); > > } > > }); > > bot.shell("A MessageDialog").activate(); > > bot.sleep(5000); > > bot.button("OK").click(); > > } > > > > I get following Trace: > > > > org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException: The > widget was null. > > at > org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot.<init>(AbstractSWTBot.java:110) > > at > org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBotControl.<init>(AbstractSWTBotControl.java:48) > > at > org.eclipse.swtbot.swt.finder.widgets.SWTBotShell.<init>(SWTBotShell.java:56) > > at > org.eclipse.swtbot.swt.finder.widgets.SWTBotShell.<init>(SWTBotShell.java:45) > > at > org.eclipse.swtbot.swt.finder.SWTBotFactory.activeShell(SWTBotFactory.java:461) > > at > org.eclipse.swtbot.swt.finder.SWTBot.activeShell(SWTBot.java:1) > > at > de.kgucms.tps.client.base.dialog.ExtendedMessageDialogTest.testInfoDialogWithDontShowAgain(ExtendedMessageDialogTest.java:64) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native > Method) > > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at java.lang.reflect.Method.invoke(Method.java:498) > > at > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) > > at > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) > > at > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) > > at > org.eclipse.swtbot.swt.finder.junit.internal.CapturingFrameworkMethod.invokeExplosively(CapturingFrameworkMethod.java:47) > > at > org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) > > at > org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) > > at > org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) > > at > org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner.runChild(SWTBotJunit4ClassRunner.java:75) > > at > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) > > at > org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) > > at > org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) > > at > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) > > at > org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) > > at > org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) > > at > org.junit.runners.ParentRunner.run(ParentRunner.java:363) > > at > org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner.run(SWTBotJunit4ClassRunner.java:60) > > at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) > > at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538) > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) > > > > What am I doing wrong? > > > > I use Junit4 and the default Junit Runner. > > > > Best Regards > > Stefan > > > > > > _______________________________________________ > swtbot-dev mailing list > swtbot-dev@eclipse.org > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > https://dev.eclipse.org/mailman/listinfo/swtbot-dev > > _______________________________________________ > swtbot-dev mailing list > swtbot-dev@eclipse.org > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > https://dev.eclipse.org/mailman/listinfo/swtbot-dev
_______________________________________________ swtbot-dev mailing list swtbot-dev@eclipse.org To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://dev.eclipse.org/mailman/listinfo/swtbot-dev