У меня есть кнопка 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. Все хорошо работало с абстрактным классом. Теперь я предпочитаю, чтобы это был независимый класс. Кто-нибудь знает, почему поток / задача не работает?




Не надо изобретать велосипед. Вот несколько прошлых ссылок, которые у меня были: https://groups.google.com/forum/m/#!topic/webdriver/cw_awztl-IM
Может ли Selenium использовать многопоточность в одном браузере?
Надеюсь, поможет.
Почему webdriver зависнет, если вы не поместите его в отдельный поток? Ваш экземпляр драйвера статичен?
Это не из-за WebDriver, а из-за других возможных классов, которые не используют Selenium. Классы, которые не используют Selenium, получат информацию через вызов API. Эти классы будут замораживать пользовательский интерфейс во время вызова. Поскольку я отношусь к каждому классу, реализующему DataHandler, одинаково (первый пример кода выше), каждый DataHandler получит новую угрозу. И поскольку все возможные DateHandler находятся в ComboBox, будет создан только один класс.
Проблема, вероятно, связана со статическим WebDriver. Поскольку он не создается, он не будет вызываться в одном потоке. Спасибо, в любом случае.
Я не хочу использовать многопоточность с WebDriver, и WebDriver не взаимодействует с разными потоками. Я создаю поток из-за пользовательского интерфейса, иначе он зависнет. Итак, мои намерения: (1) запустить поток, (2) WebDriver выполняет свою работу в потоке и (3) WebDriver завершает работу, закрывает браузер, и поток тоже закрывается. Это связано с тем, что WebDriver будет использоваться только в методе
extractInformation. Мне просто интересно, почему это сработало, когда классBrowserбыл абстрактным, а теперь (как статический класс) нет?