t.me/atinfo_chat Telegram группа по автоматизации тестирования

Selenide 5 - ошибка после открытия новой вкладки через JS

windows
java
webdriver
selenide
javascript
Теги: #<Tag:0x00007f21d71dfab0> #<Tag:0x00007f21d71df970> #<Tag:0x00007f21d71df830> #<Tag:0x00007f21d71df6f0> #<Tag:0x00007f21d71df5b0>

#1

Использую Selenide 5.2.4 для java - проверял и на более ранних версиях 5.х.х., ошибка аналогичная. На чистом Selenium и Selenide версии 4.10 и ниже ошибки нет.

При выполнении данного скрипта:

String script = "window.open('"+ url +"','_blank');"; // открыть новую вкладку
((JavascriptExecutor)getWebDriver()).executeScript(script);

Падает ошибка:

There was an error in the forked process
No webdriver is bound to current thread: 1. You need to call open(url) first.
org.apache.maven.surefire.booter.SurefireBooterForkException: There was an error in the forked process
No webdriver is bound to current thread: 1. You need to call open(url) first.
        at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:656)
        at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
        at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
        at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
        at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
        at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:954)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
        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.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

Подскажите пожалуйста, почему так происходит. Самое интересное, что если менять версию Selenide на 4-ую, затем снова на 5-ую, подгрузить все зависимости снова, то несколько запусков - работает! А затем как-будто бы executor вспоминает, что у него 5-ая версия и начинает падать внезапно. При этом в логах указывается INFO: Selenide v. 5.2.4 Это меня еще больше удивляет. Но рано или поздно ошибка на 5-ой версии всегда есть.


(Vasiliy Rakshin) #2

Чтобы выполнить Javascript нужно чтобы уже была открыта вкладка/окно. Вам же в ошибке так и написано - сначала откройте какую-нить страничку.
Попробуйте open("about:blank")


#3

А как это сделать, чтобы открылось в новой вкладке, а не в существующей? И как я вызову open() (Селенидовскую функцию), в аргумент которой передам JS?


(Vasiliy Rakshin) #4

#5

Так я же и открываю вкладку через window.open(); Посмотрите в теме)

Selenide то ругается на то, что я не вызываю его функцию com.codeborne.selenide.Selenide.open()


(Vasiliy Rakshin) #6

Вы должны сделать 3 действия:

  1. Открыть браузер на какой-нить странице.
  2. Открыть новую вкладку.
  3. Переключиться на новую вкладку.
    Из вашего верхнего сообщения ощущается проблема во втором шаге. Притом, по коду стектрейса, вообще непонятно что это из теста. Я вам дал ссылку на тему где описывается как открывать новые закладки. В вашей смежной свежей теме вы уже поняли как переключаться на новые закладки. Так в чём проблема ещё раз?

#7

Я открываю браузер. Работаю в одной вкладке.
Затем открываю новую вкладку через JS. Переключаюсь в нее.
Но этого не происходит, тест падает сразу после вызова JSE.

Вот в чем проблема. В смежной теме я пытался обойти вызов JS через создание двух инстансов драйвера - не вышло. А переключаться между вкладками я умею. Переключиться в пустую - нельзя. Только если она уже существует и там уже что-то открыто.


(Vasiliy Rakshin) #8
Selenide.executeJavaScript("window.open('http://ya.ru');");
Selenide.switchTo().window(1);

Это шаги 2 и 3 соответственно.


#9

Попробовал ваш способ. Ошибка аналогичная. То есть выполняется Selenide.switchTo().window(1);, затем я поставил sleep() на всякий случай - он спокойно ждет. Однако после того как секунды ожидания проходят - сразу же падает. То есть Selenide отказывается работать, пока не будет вызвана функция com.codeborne.selenide.Selenide.open()

Решил проверить дебаггером через -Dmaven.surefire.debug и словил вот такое: прямо сразу после запуска тестов:

Please refer to C:\Users\lovtsovkn\IdeaProjects\agclone\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
Command was cmd.exe /X /C ""C:\Program Files\Java\jdk1.8.0_191\jre\bin\java" -javaagent:C:\Users\user\.m2\repository/org/aspectj/aspectjweaver/1.8.10/aspectjweaver-1.8.10.jar -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:trans
port=dt_socket,server=y,suspend=y,address=5005 -jar C:\Users\LOVTSO~1\AppData\Local\Temp\surefire8738254732406849802\surefirebooter4774144785950532456.jar C:\Users\lovtsovkn\AppData\Local\Temp\surefire8738254732406849802 2019-07-18T19
-07-30_522-jvmRun1 surefire3771998065571144702tmp surefire_07990134847691497474tmp"
Error occurred in starting fork, check output in log
Process Exit Code: 2
org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
Command was cmd.exe /X /C ""C:\Program Files\Java\jdk1.8.0_191\jre\bin\java" -javaagent:C:\Users\lovtsovkn\.m2\repository/org/aspectj/aspectjweaver/1.8.10/aspectjweaver-1.8.10.jar -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:trans
port=dt_socket,server=y,suspend=y,address=5005 -jar C:\Users\LOVTSO~1\AppData\Local\Temp\surefire8738254732406849802\surefirebooter4774144785950532456.jar C:\Users\user\AppData\Local\Temp\surefire8738254732406849802 2019-07-18T19
-07-30_522-jvmRun1 surefire3771998065571144702tmp surefire_07990134847691497474tmp"
Error occurred in starting fork, check output in log
Process Exit Code: 2
        at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:669)
        at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
        at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
        at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
        at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
        at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:954)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
        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.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.287 s
[INFO] Finished at: 2019-07-18T19:07:31+04:00
[INFO] ------------------------------------------------------------------------

Что-то дичь какая-то. До этого с дебаггером было все ок. Теперь код вообще не влияет, дебаггер сразу падает.


(Vasiliy Rakshin) #10

Ещё раз. 1 шаг-то выполнился?


#11

Это само собой. Open() у меня в @beforeMethod (testNG), там совершаются некие действия по авторизации. Затем я открываю другую страницу в новой вкладке. Ну а дальше вы знаете.

То есть Selenide открыл таки вкладку. Но ему не нравится, что в новой не открыли url.


(Vasiliy Rakshin) #12

Ещё раз стектерейс ошибки в студию. Потому что что первый, что второй к делу не относятся.


#13

Кажется я решил проблему!! По крайней мере все сработало как надо сейчас.

Как я сделал:

open(url1);
Selenide.executeJavaScript("window.open('url2");
Selenide.switchTo().window(1);
open(url2);

Таким образом Selenide остается доволен, что выполнили open() таки. Конечно это немного костыльно, то есть два раза ссылку по сути открываем. Но работает!


#14

Нет, полная какая то лажа. Теперь при вызове скрипта ошибка. То есть даже вкладка новая не открылась.

There was an error in the forked process
No webdriver is bound to current thread: 1. You need to call open(url) first.
org.apache.maven.surefire.booter.SurefireBooterForkException: There was an error in the forked process
No webdriver is bound to current thread: 1. You need to call open(url) first.
        at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:656)
        at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
        at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
        at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
        at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
        at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:954)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
        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.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

(Vasiliy Rakshin) #15

Перезагрузите компьютер / почистите зависшие процессы хрома/драйвера.


#16

Так как ошибка плавающая, вполне может быть.


(asolntsev) #17

Что-то вы мутите. Можете скинуть полный код, воспроизводящий вашу проблему? Желательно мини-проектик на гитхабе.

Я попробовал написать тест по вашему описанию - он работает:

  @Test
  void canSwitchToNewTab() {
    open("https://google.com");

    String script = "window.open('"+ "https://yandex.ru/" +"','_blank');";
    executeJavaScript(script);
    switchTo().window(1);

    $("h1").shouldHave(text("Сейчас в СМИ"));
  }

P.S. Подозреваю, что проблема в том, что у вас TestNG и open вызывается не в самом тесте, а в методе @Before, а значит, в другом потоке. Если так, просто перенесите open() в тест.

P.P.S. Зачем вообще открывать новую вкладку в тесте? Как правило, это плохая идея.


#18

Да, TestNG и я делаю вызов open() в @BeforeMethod. Так а в чем тогда будет смысл этих методов testNG, если я буду в каждом тесте прописывать open()? Почему в 4 версии Селенида это работало?

TestNG версии 6.14.3 и она не менялась. Новую 7 версию не подрубаю, потому что она еще бета.


#19

Перезагрузил, тем самым убив все процессы WebDriver, сейчас работает в виде:

Однако нет никаких гарантий, что опять потоки перепутаются или еще что-то и снова будет падать затем ошибка.


(asolntsev) #20

Я не могу ответить на эти вопросы, не видя кода.

Можете скинуть полный код, воспроизводящий вашу проблему? Желательно мини-проектик на гитхабе.