Поток Java не работает, если создается экземпляр Selenium WebDriver

У меня есть кнопка JavaFX, которая выполняет следующий код (упрощенный)

Task<List<PubListEntry>> theTask = new Task<List<PubListEntry>>() {
    @Override
    protected List<PubListEntry> call() {
        dh = (DataHandler) selectedSource.getSourceClass().newInstance();
        return dh.extractInformation(...);
    }
};
Thread t= new Thread(theTask );
t.start();

Он создаст новый экземпляр класса в зависимости от выбранной записи ComboBox, а затем вызовет метод. В одном из классов я хочу использовать Selenium для управления окном браузера.

public class Source1 implements DataHandler {
    public Source1 () {
        Browser.start();
    }
    @Override
    public List<PubListEntry> extractInformation(...) {...}
}

А статический метод start выглядит так.

static void start() {
    if (driver == null) {
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
}

Но задача не удастся, если я создам экземпляр Source1. Я думаю, что это как-то связано с Selenium, но я не могу понять, что это такое. Раньше класс Browser был абстрактным, и мне пришлось расширить Source1. Все хорошо работало с абстрактным классом. Теперь я предпочитаю, чтобы это был независимый класс. Кто-нибудь знает, почему поток / задача не работает?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
154
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не надо изобретать велосипед. Вот несколько прошлых ссылок, которые у меня были: https://groups.google.com/forum/m/#!topic/webdriver/cw_awztl-IM

Может ли Selenium использовать многопоточность в одном браузере?

Надеюсь, поможет.

Я не хочу использовать многопоточность с WebDriver, и WebDriver не взаимодействует с разными потоками. Я создаю поток из-за пользовательского интерфейса, иначе он зависнет. Итак, мои намерения: (1) запустить поток, (2) WebDriver выполняет свою работу в потоке и (3) WebDriver завершает работу, закрывает браузер, и поток тоже закрывается. Это связано с тем, что WebDriver будет использоваться только в методе extractInformation. Мне просто интересно, почему это сработало, когда класс Browser был абстрактным, а теперь (как статический класс) нет?

JumbleGee 08.04.2018 21:14

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

tsumit 08.04.2018 21:22

Это не из-за WebDriver, а из-за других возможных классов, которые не используют Selenium. Классы, которые не используют Selenium, получат информацию через вызов API. Эти классы будут замораживать пользовательский интерфейс во время вызова. Поскольку я отношусь к каждому классу, реализующему DataHandler, одинаково (первый пример кода выше), каждый DataHandler получит новую угрозу. И поскольку все возможные DateHandler находятся в ComboBox, будет создан только один класс.

JumbleGee 08.04.2018 21:34

Проблема, вероятно, связана со статическим WebDriver. Поскольку он не создается, он не будет вызываться в одном потоке. Спасибо, в любом случае.

JumbleGee 08.04.2018 22:10

Другие вопросы по теме