Java Driver on a JNLP application - No Top Level Window Available

62 views
Skip to first unread message

Gonzalo Sintas

unread,
Jun 17, 2020, 11:35:00 PM6/17/20
to Marathon Java GUI Testing
Hi!

I'm new to Marathon and Java Driver. I work on a Software Testing Company and we have recently started researching both Marathon and Java Driver to use it as our go to Automation Tool for Java Applications. We had success in our internal trails, but we are experiencing some trouble getting Java Driver to work on our main client (this client is te reason we are testing the use of Marathon).

I will try to explain everything as detailed as I can, but please keep in mind that I have limited access to this client (which has been a real challenge) and therefore some information might not be available.

We are working with a JNLP application. We have been able to make it work with MarathonITE correctly in Record & Playback mode. In order to get it to work we had to:
  • Change the java policy files as established in Marathon's guides to grant access
  • Set that modified JRE / JDK as our JAVA_HOME (we have validated that it works on both). We had to do this because the computer didn't have the environment variable set up
  • Set the Start Windows Title
So, using Marathon for Record & Playback works, our problem is that we also need to be able to do some stuff through Java Driver, and that's the one we haven't been able to get going.

This is our code to launch the application using Java Driver:


JavaProfile
 profile = new JavaProfile (LaunchMode.JAVA_WEBSTART);
profile
.setJNLPPath(applicationPath);
profile
.setStartWindowTitle("Topaz Client");
profile
.setJavaHome("C:\\Program Files (x86)\\Java\\jdk1.8.0_144");


JavaDriver driver = new JavaDriver(profile);
    

Which uses the same data as MarathonITE, and we even set the StartWindowTitle and JavaHome, just as we did using MarathonITE

The applications launches, and after that we need to start finding Elements to interact with them.


List
<WebElement> elements = driver.findElements(By.className("javax.swing.JTextField"));


And here is where it crashes, reporting a JavaAgentException:No top level window available

Here is the full log of the exception (some parts of this log file are from our own code)

JUnit version 4.12



.{ejecutar} ; Test-Login ; ATCAJERO ; AT
{iniciar} ; http://xxx:xxxx/xxx/xxx/jdesktop.jnlp
jun
17, 2020 10:35:53 AM net.sourceforge.marathon.javadriver.JavaProfile getLocalCopy
INFORMACI
ËN: WebStart: Copied remote URL http://xxx:xxxx/xxx/xxx/jdesktop.jnlp to C:\Users\gsintas\AppData\Local\Temp\4\marathon7059451124821184879.jnlp
jun
17, 2020 10:35:53 AM net.sourceforge.marathon.javadriver.JavaProfile getAgentJar
INFORMACI
ËN: Using C:\Stela\PRUEBAS\STELA-STB\lib\marathon\marathon-java-agent-5.4.0.0.jar for agent
jun
17, 2020 10:35:53 AM net.sourceforge.marathon.javadriver.JavaProfile getAgentJar
INFORMACI
ËN: Using C:\Stela\PRUEBAS\STELA-STB\lib\marathon\marathon-java-agent-5.4.0.0.jar for agent
jun
17, 2020 10:35:53 AM net.sourceforge.marathon.javadriver.JavaDriverCommandExecutor start
INFORMACI
ËN: Executing: [C:\Program Files (x86)\Java\jdk1.8.0_144\bin\javaws.exe, C:\Users\gsintas\AppData\Local\Temp\4\marathon7059451124821184879.jnlp][ {JAVA_TOOL_OPTIONS=-DkeepLog=false -Dmarathon.launch.mode=webstart -Dmarathon.mode=playing -Dstart.window.title="Topaz Client" -Dmarathon.agent=file:/C:/Stela/PRUEBAS/STELA-STB/lib/marathon/marathon-java-agent-5.4.0.0.jar -javaagent:"C:\Stela\PRUEBAS\STELA-STB\lib\marathon\marathon-java-agent-5.4.0.0.jar"=59024, JAVA_HOME=C:\Program Files (x86)\Java\jdk1.8.0_144}]
Picked up JAVA_TOOL_OPTIONS: -DkeepLog=false -Dmarathon.launch.mode=webstart -Dmarathon.mode=playing -Dstart.window.title="Topaz Client" -Dmarathon.agent=file:/C:/Stela/PRUEBAS/STELA-STB/lib/marathon/marathon-java-agent-5.4.0.0.jar -javaagent:"C:\Stela\PRUEBAS\STELA-STB\lib\marathon\marathon-java-agent-5.4.0.0.jar"=59024
jun
17, 2020 10:36:12 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMACI
ËN: Detected dialect: OSS
{espera} ; 15
{espera_obj} ; TXT_Usuario ;  ; 10
org
.openqa.selenium.WebDriverException: net.sourceforge.marathon.javaagent.JavaAgentException:No top level window available
Command duration or timeout: 0 milliseconds
       at sun
.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun
.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun
.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java
.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org
.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
        at org
.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
        at org
.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
        at org
.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)
        at org
.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)
        at org
.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
        at net
.sourceforge.marathon.javadriver.JavaDriverCommandExecutor.execute(JavaDriverCommandExecutor.java:135)
        at org
.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
        at org
.openqa.selenium.remote.RemoteWebDriver.findElements(RemoteWebDriver.java:353)
        at org
.openqa.selenium.remote.RemoteWebDriver.findElementsByClassName(RemoteWebDriver.java:416)
        at
org.openqa.selenium.By$ByClassName.findElements(By.java:380)
        at org
.openqa.selenium.remote.RemoteWebDriver.findElements(RemoteWebDriver.java:311)
        at framework_stela
.module_automation_logic.Marathon.findObjects(Marathon.java:169)
        at framework_stela
.module_automation_logic.AutomationFacade.findObjects(AutomationFacade.java:117)
        at framework_stela
.module_language_logic.LanguageFacade.findObjects(LanguageFacade.java:854)
        at framework_stela
.entities.language.STBObject.searchObject(STBObject.java:116)
        at framework_stela
.module_language_logic.ObjectHandler.getObject(ObjectHandler.java:43)
        at framework_stela
.module_language_logic.ObjectHandler.objectFinder(ObjectHandler.java:67)
        at framework_stela
.module_language_logic.ObjectHandler.waitForObjectExistence(ObjectHandler.java:181)
        at framework_stela
.module_language_logic.LanguageFacade.waitForObjectExistence(LanguageFacade.java:262)
        at framework_stela
.module_language_logic.commands.WaitForObject_Command.run(WaitForObject_Command.java:43)
        at framework_stela
.module_language_logic.LanguageFacade.waitForObjectCommand(LanguageFacade.java:674)
        at framework_stela
.module_language_logic.ExecutionHandler.executeCommand(ExecutionHandler.java:541)
        at framework_stela
.module_language_logic.ExecutionHandler.runBatch(ExecutionHandler.java:147)
        at framework_stela
.module_language_logic.LanguageFacade.runBatch(LanguageFacade.java:66)
        at framework_stela
.module_language_logic.commands.ExecuteBatch_Command.run(ExecuteBatch_Command.java:32)
        at framework_stela
.module_language_logic.LanguageFacade.executeBatchCommand(LanguageFacade.java:695)
        at framework_stela
.module_language_logic.ExecutionHandler.executeCommand(ExecutionHandler.java:557)
        at framework_stela
.module_language_logic.ExecutionHandler.runBatch(ExecutionHandler.java:147)
        at framework_stela
.module_language_logic.LanguageFacade.runBatch(LanguageFacade.java:66)
        at framework_stela
.Stela.runBatch(Stela.java:131)
        at demos
.RUN_STELA.AA_Marathon(RUN_STELA.java:19)
        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
.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org
.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org
.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
        at org
.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
        at org
.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org
.junit.runners.Suite.runChild(Suite.java:128)
        at org
.junit.runners.Suite.runChild(Suite.java:27)
        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
.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at org
.junit.runner.JUnitCore.run(JUnitCore.java:115)
        at org
.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
        at org
.junit.runner.JUnitCore.main(JUnitCore.java:36)
Caused by: org.openqa.selenium.WebDriverException: net.sourceforge.marathon.javaagent.JavaAgentException:No top level window available
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:48'
System info: host: 'xxx', ip: 'xxx.xxx.xxx.xxx', os.name: 'Windows 10', os.arch: 'x86', os.version: '10.0', java.version: '1.8.0_144'
Driver info: driver.version: unknown
        at net
.sourceforge.marathon.javaagent.server.JavaServer.invoke(JavaServer.java:517)
        at net
.sourceforge.marathon.javaagent.server.JavaServer.handleRoute(JavaServer.java:410)
        at net
.sourceforge.marathon.javaagent.server.JavaServer.serve_internal(JavaServer.java:367)
        at net
.sourceforge.marathon.javaagent.server.JavaServer.serve(JavaServer.java:324)
        at
fi.iki.elonen.NanoHTTPD.serve(NanoHTTPD.java:2244)
        at
fi.iki.elonen.NanoHTTPD$HTTPSession.execute(NanoHTTPD.java:945)
        at
fi.iki.elonen.NanoHTTPD$ClientHandler.run(NanoHTTPD.java:192)
        at java
.lang.Thread.run(Unknown Source)
        at net
.sourceforge.marathon.javaagent.Wait.wait(Wait.java:118)
        at net
.sourceforge.marathon.javaagent.JavaTargetLocator.getTopContainer(JavaTargetLocator.java:497)
        at net
.sourceforge.marathon.javaagent.JavaAgent.findByCss(JavaAgent.java:340)
        at net
.sourceforge.marathon.javaagent.JavaAgent.findElementsByClassName(JavaAgent.java:336)
        at net
.sourceforge.marathon.javaagent.server.Session.findElements(Session.java:115)
        at net
.sourceforge.marathon.javaagent.server.JavaServer.findElements(JavaServer.java:761)
        at sun
.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun
.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun
.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java
.lang.reflect.Method.invoke(Unknown Source)
        at net
.sourceforge.marathon.javaagent.server.JavaServer.invoke(JavaServer.java:486)
        at net
.sourceforge.marathon.javaagent.server.JavaServer.handleRoute(JavaServer.java:410)
        at net
.sourceforge.marathon.javaagent.server.JavaServer.serve_internal(JavaServer.java:367)
        at net
.sourceforge.marathon.javaagent.server.JavaServer.serve(JavaServer.java:324)
        at
fi.iki.elonen.NanoHTTPD.serve(NanoHTTPD.java:2244)
        at
fi.iki.elonen.NanoHTTPD$HTTPSession.execute(NanoHTTPD.java:945)
        at
fi.iki.elonen.NanoHTTPD$ClientHandler.run(NanoHTTPD.java:192)
        at java
.lang.Thread.run(Unknown Source)


For some aditional information, the machine we are working in has:
  • Windows 10
  • JDK 1.8.0_144

And in our project we are using:
  • Marathon 5.4.0
  • Selenium 3.141.59

I have tried switching from JDK to JRE (both work with MarathonITE), but neither worked. Tried to use different ways of object recognition, even something like className(".*"), but got the same result.

As I understand the Exception is threre because Java Driver doesn't find a Window to work, despite the application being launched correctly. 

I'm really clueless as to how to approach this. This same code works on other JNLP applications. if anyone has some advice for me as to what to try to get it to work, I would really appreciate it.


Thanks 

Aditya Chandrasekhar Karra

unread,
Jun 18, 2020, 11:51:31 AM6/18/20
to Marathon Java GUI Testing
Hi..

Firstly thank you for using Marathon Java Driver..
When the AUT is launcher, there might be multiple windows or blurb windows might have come on top. So he is not able to set the top level container. Just get the window handles and switch or directly call switchToWindow method with title and then try to find the elements. This should solve the issue.

Thanks & Regards,
Aditya Karra
Jalian Systems Pvt., Ltd.

Gonzalo Sintas

unread,
Jun 18, 2020, 2:47:22 PM6/18/20
to marathon...@googlegroups.com
Hi Aditya. 

Thanks for the quick reply. 

Just to be 100%, you are suggesting that, after the JavaDriver is created, tell the driver to Switch to a Window. As I have seen, the code would be like this:


JavaDriver driver = new JavaDriver(profile);

driver
.switchTo().window("Topaz Client");




The title would be the same as the one I was using in the profile.setStartWindowTitle() method.


I will try that and let you know if that fixes the issue.


Thanks again,-


Aditya Chandrasekhar Karra

unread,
Jun 19, 2020, 11:51:29 AM6/19/20
to Marathon Java GUI Testing
Yes Exactly.

Thanks & Regards
Aditya Karra

Gonzalo Sintas

unread,
Jun 23, 2020, 3:54:16 PM6/23/20
to Marathon Java GUI Testing
Indeed, switching to the desired Window solved the problem I had. 

Thanks again for your help, Aditya

Aditya Chandrasekhar Karra

unread,
Jun 24, 2020, 1:43:00 PM6/24/20
to Marathon Java GUI Testing
Hi Gonzalo,

Happy to hear that it solved your problem.
Can you please accept the answer in Stackoverflow.


Thanks & Regards,
Aditya Karra


Gonzalo Sintas

unread,
Jun 24, 2020, 1:58:34 PM6/24/20
to Marathon Java GUI Testing
Oh, Yeah. Forgot about that. 

Done. 
Reply all
Reply to author
Forward
0 new messages