Марафон | Java Драйвер в приложении JNLP - Окно верхнего уровня недоступно - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в Marathon и Java Driver. Я работаю в компании по тестированию программного обеспечения, и недавно мы начали исследовать как Marathon, так и Java Driver, чтобы использовать его в качестве go инструмента автоматизации для Java приложений. Мы добились успеха в наших внутренних трассировках, но у нас возникли некоторые проблемы с тем, чтобы Java Driver работал на нашем основном клиенте (этот клиент является причиной, по которой мы тестируем использование Marathon).

Я постараюсь объясните все как можно подробнее, но имейте в виду, что у меня ограниченный доступ к этому клиенту (что было настоящей проблемой), и поэтому некоторая информация может быть недоступна.

Мы работаем с JNLP применение. Нам удалось заставить его правильно работать с MarathonITE в режиме записи и воспроизведения. Чтобы заставить его работать, нам пришлось:

  • Изменить java файлы политик, как установлено в руководствах Marathon, чтобы предоставить доступ
  • Установить этот измененный JRE / JDK как наш JAVA_HOME (мы подтвердили, что он работает на обоих). Нам пришлось это сделать, потому что на компьютере не была настроена переменная среды
  • Установить начало Windows Заголовок

Итак, использование Marathon для записи и воспроизведения работает, наши проблема в том, что нам также нужно иметь возможность делать некоторые вещи через Java Driver, а это тот, который мы не смогли запустить.

Это наш код для запуска приложения с использованием Java Драйвер:

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);

Использует те же данные, что и MarathonITE, и мы даже устанавливаем StartWindowTitle и JavaHome, как мы делали с помощью MarathonITE

Приложение запускается, и после этого нам нужно чтобы начать поиск элементов для взаимодействия с ними.

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

И вот где происходит сбой, сообщая об исключении JavaAgentException: Окно верхнего уровня недоступно

Вот полный журнал исключения (некоторые части этого файла журнала взяты из нашего собственного кода)

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)

Для дополнительной информации компьютер, на котором мы работаем, имеет:

  • Windows 10
  • JDK 1.8.0_144

И в нашем проекте мы используем:

  • Marathon 5.4.0
  • Selenium 3.141.59

Я пытался переключиться с JDK на JRE (оба работают с MarathonITE), но ни один из них не работал. Пытался использовать разные способы распознавания объектов, даже что-то вроде className (". *"), Но получил тот же результат.

Насколько я понимаю, это исключение, потому что Java Драйвер не находит окно работать, несмотря на то, что приложение запускается правильно.

Я действительно не знаю, как к этому подойти. Этот же код работает и в других приложениях JNLP. Если у кого-нибудь есть для меня совет, как заставить его работать, я был бы очень признателен.

Спасибо

1 Ответ

0 голосов
/ 19 июня 2020
  1. В версиях Java нет ничего плохого.
  2. В вашем приложении может появиться несколько Windows до того, как появится желаемое окно, поэтому он потерял свой компонент верхнего уровня.

Просто используйте метод switch to window и передайте tile перед вызовом findElements. Это должно решить проблему.

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

Примечание: я один из разработчиков Marathon.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...