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

После выполнения browser.open() ошибка "No webdriver is bound to current thread"

cross-browser
java
webdriver
selenide
javascript
Теги: #<Tag:0x00007f21d997dce8> #<Tag:0x00007f21d997dba8> #<Tag:0x00007f21d997da68> #<Tag:0x00007f21d997d900> #<Tag:0x00007f21d997d7c0>

#1

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

Проблема заключается в том, что после открытия сайта по URL функцией open(), сразу же выпадает ошибка (смотрел по дебаггеру):

There was an error in the forked process
No webdriver is bound to current thread: 1. You need to call open(url) first.

Представляю код, здесь все вроде бы ясно. Делал в соответствие с примером на gitHub с сайта Selenide:

public class TestBase {

    private static SelenideDriver browser;
    private static SelenideConfig browserConfig;

    @BeforeMethod
    public void openBrowser() {
        openNoAuthPage(); // Открыть страницу неавторизованного пользователя
    }

    @BeforeTest
    public static void setUp() {
        System.setProperty("webdriver.chrome.driver", "./driver/chromedriver_win.exe");
        browserConfig = new SelenideConfig().browser("chrome").browserSize("1920x1080");
        browser = new SelenideDriver(browserConfig);
    }

    public static String siteUrl = PropertyLoader.loadProperty("site.url"); // URL сайт

    @Step("Открыть страницу неавторизованного пользователя")
    public static void openNoAuthPage() {
        browser.open(siteUrl, "", "Login", "Password"); // В аргументах метода логин и пароль для basic http авторизации
    }

После выполнения @beforeMethod (то есть нужный мне URL успешно открывается, сайт загружается) сразу же падает. Полный лог:

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)

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


(Алексей Чикпик) #2

Что вы тут вообще делаете? Зачем драйвер выносить в статичное поле? Используйте класс Selenide, и оттуда вызывайте нужные методы. Например Selenide.open("url").

        Dimension dimension = new Dimension(1920, 1080);
        Selenide.open("URL");
        WebDriverRunner.getWebDriver().manage().window().setSize(dimension);

Тоже самое что и у вас


(Алексей Чикпик) #3

И зачем явно указывать путь до драйвера? В Selenide настроен webdrivermanager, он автоматом скачает нужный драйвер для указанного браузера, и да хром стоит по умолчанию, так что если вы планируете использовать только его, то не нужно явно задавать.


#4

Ну вот как раз я и хотел создать два экземпляра браузера и к ним обращаться с разными задачами. Поэтому я не могу использовать статичный метод open(), потому что он работает только с одним браузером.


#5

Я использовал раньше старые версии Selenide и смотрел старые доки и советы, оттуда и перекочевало. Спасибо за подсказку!


(Алексей Чикпик) #6

А зачем тут статика? В примере что вы кидали, нету статики


(Vladislav Abramov) #7

вы хотите параллелизовать тесты или из 2 разных браузеров 1 тест выполнять?


#8

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

Раньше, в 4 версии Selenide я делал это через JSE вот таким образом:

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

Но при переходе на 5 версию, при открытии новой вкладки после некоторых действий вдруг WebDriver вылетает с ошибкой 

No webdriver is bound to current thread: 1. You need to call open(url) first.


(Алексей Чикпик) #9

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


(Алексей Чикпик) #10

Selenide.executeJs("SCRIPT")
Selenide.switchTo().window(index)
я это вижу так. вы явно что то мудрите с инстансом веб драйвера. ибо у меня спокойно Selenide переключается между вкладками, правда я не создаю себе посредством JS вкладку, но не думаю что это корень проблемы.


#11

А скиньте ваш пример, как вы несколько вкладок используете. Потому что если через JS, то 5-ый Selenide у меня падает в ошибку. До 4.10 все было хорошо.

Именно поэтому я и стал городить велосипед, который предлагает официальная документация. И он не работает: https://ru.selenide.org/2018/10/10/selenide-5.0.0/ - вот самое первое нововведение. Там есть ссылка на gitHub, она же есть у меня и в самой теме и я попытался сделать как там, создать два инстанса браузера.


(Алексей Чикпик) #12
SelenideWrapper.switchTo().window(0); - это вернуться в первую(главную) вкладку
SelenideWrapper.switchTo().window(1); - соответственно в новую

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


#13

И можно будет спокойно при переходе в новую вкладку вызвать open()?


(Алексей Чикпик) #14

Если вы переключитесь во вкладку, да.


#15

Хорошо, попробую такой вариант тогда. Даже не думал просто о нем, что можно переключиться в пустую вкладку. Думал, что можно переключиться только во вкладку, где уже открыта какая то страница, которую открыл UI, перейдя по ссылке, например.


#16

Погодите, ведь нету же SelenideWrapper никакого. Полез в IDE, набрал и нет.

С помощью стандартного Selenium переключился в другое окно просто так, но падает ошибка и новая вкладка не открывается. Вот так сделал:

ArrayList&lt;String&gt;&#32;tabs2&#32;=&#32;new&#32;ArrayList(getWebDriver().getWindowHandles());
getWebDriver().switchTo().window(tabs2.get(1));

Ну то есть стандартное переключение между вкладками.