Search code examples
marathontesting

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


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


Solution

    1. There is nothing wrong with the Java versions.
    2. Your application might be having multiple Windows come up before the desired window has come, so he lost his top level component.

    Just use switch to window method and pass tile before findElements is called. This should solve the issue.

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

    Note: I'm one of the contributors of Marathon.