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:
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:
And in our project we are using:
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
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.