У меня есть следующий фрагмент кода, который я использую для создания веб-драйверов для приложения весенней загрузки.
public RemoteWebDriver createDriver() {
ChromeOptions options = new ChromeOptions();
URL containerLocator;
try {
URI containerIdentifier = new URI(this.driverSocket);
containerLocator = containerIdentifier.toURL();
}
catch (URISyntaxException | MalformedURLException e) {
this.logService.createInfoLog(this.messageService.createChapterURLExceptionMessage(this.driverSocket));
return null;
}
this.logService.createInfoLog(this.messageService.getLoggingInfoChapterCreatedDriver());
return new RemoteWebDriver(containerLocator, options);
}
Этот код используется для создания драйверов всякий раз, когда я вызываю службу весенней загрузки, например, для анализа селена -
@Async
public CompletableFuture startParsingTask(String sessionId) {
RemoteWebDriver driver = this.createDriver();
if (driver.getSessionId() != null) {
this.logService.createInfoLog(this.messageService.getLoggingInfoActiveSessionFound());
driver.quit();
driver = this.createDriver();
}
else {
this.logService.createInfoLog(this.messageService.getLoggingInfoNoActiveSessionFound());
}
// Try to parse and quit the driver after the attempt
try {
this.doParsingTask(driver, sessionId);
this.logService.createInfoLog(this.messageService.getLoggingInfoParseSucceeded());
driver.quit();
this.logService.createInfoLog(this.messageService.getLoggingInfoQuitDriver());
}
...
}
Меня не интересует второй блок кода. Моя проблема в том, что из-за асинхронного характера моих сеансов Selenium в некоторых случаях задача выдает исключение и ошибку. В результате контейнер селена, к которому подключается драйвер, застрянет в середине сеанса и не будет завершен должным образом. Если серверная часть Spring Boot затем попытается запустить задачу, требующую драйвера, она просто зависнет на этой строке из первого блока кода -
return new RemoteWebDriver(containerLocator, options);
Я протестировал свою программу и определил, что именно здесь мои асинхронные задачи застревают, но я не знаю, как это исправить с помощью первого блока кода. Я проверил аналогичные сообщения в Stack Overflow, но все они дают решения, которые требуют, чтобы сначала был создан экземпляр объекта веб-драйвера, который я не могу использовать, потому что программа зависает при создании экземпляра.
Есть ли способ изменить первый блок кода для создания сеанса веб-драйвера, не застревая из-за зависания сеанса в контейнере селена?
Для дальнейшего контекста, вот команда docker, которую я использую для создания контейнера:
docker run -d -p 4444:4444 -p 7900:7900 --shm-size="2g" selenium/standalone-chrome:136.0-20251101
Подробнее здесь: https://stackoverflow.com/questions/798 ... k-in-the-m