org.openqa.selenium.TimeoutException: предоставленная функция могла остановить ошибку с использованием titleContains () с Selenium 4.0.0-alpha-5 и Java 11
В этот тайм-аут поиск в Google не дал ничего, кроме исходного кода, и мне кажется, что я не вижу никакой информации из журналов, просматривающих исходный код селена. Мне интересно, сталкивался ли кто-нибудь еще с этой проблемой с селеном
Мы ждали следующие условия
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(30));
wait.until(ExpectedConditions.titleContains("Find a doctor"));
org.openqa.selenium.TimeoutException: Supplied function might have stalled
Build info: version: '4.0.0-alpha-5', revision: 'b3a0d621cc'
System info: host: 'localhost', ip: '127.0.0.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0', java.version: '11.0.6'
Driver info: driver.version: unknown
at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:221)
at com.orderlyhealth.scraper.json.CaredashHelper.getSearchResultsFromProviderImpl(CaredashHelper.java:320)
at com.orderlyhealth.scraper.json.CaredashHelper.getSearchResultsFromProvider(CaredashHelper.java:294)
at com.orderlyhealth.scraper.json.CaredashHelper.runImpl(CaredashHelper.java:65)
at com.orderlyhealth.scraper.json.CaredashHelper.run(CaredashHelper.java:57)
at com.orderlyhealth.scraper.json.JsonController.runBatchImpl(JsonController.java:200)
at com.orderlyhealth.scraper.json.JsonController.executeBatch(JsonController.java:134)
at com.orderlyhealth.scraper.json.JsonController.preRunBatchImpl(JsonController.java:110)
at com.orderlyhealth.scraper.json.JsonController.runBatch(JsonController.java:86)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.webpieces.router.impl.services.ControllerInvoker.invokeController(ControllerInvoker.java:30)
at org.webpieces.router.impl.services.SvcProxyForContent.invokeAndCoerce(SvcProxyForContent.java:56)
at org.webpieces.router.impl.services.SvcProxyForContent.lambda$invokeMethod$1(SvcProxyForContent.java:49)
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.thenCompose(Unknown Source)
at org.webpieces.router.impl.services.SvcProxyForContent.invokeMethod(SvcProxyForContent.java:49)
at org.webpieces.router.impl.services.SvcProxyForContent.lambda$invoke$0(SvcProxyForContent.java:33)
at org.webpieces.util.futures.FutureHelper.syncToAsyncException(FutureHelper.java:169)
at org.webpieces.router.impl.services.SvcProxyForContent.invoke(SvcProxyForContent.java:33)
at org.webpieces.router.impl.services.SvcProxyForContent.invoke(SvcProxyForContent.java:19)
at com.orderlyhealth.serverutil.filters.InternalSvcValidationFilter.filter(InternalSvcValidationFilter.java:33)
at com.orderlyhealth.serverutil.filters.InternalSvcValidationFilter.filter(InternalSvcValidationFilter.java:13)
at org.webpieces.router.impl.loader.ChainFilters$ServiceFilterProxy.invoke(ChainFilters.java:29)
at org.webpieces.router.impl.loader.ChainFilters$ServiceFilterProxy.invoke(ChainFilters.java:17)
at org.webpieces.plugin.json.JacksonCatchAllFilter.filter(JacksonCatchAllFilter.java:44)
at org.webpieces.plugin.json.JacksonCatchAllFilter.filter(JacksonCatchAllFilter.java:28)
at org.webpieces.router.impl.loader.ChainFilters$ServiceFilterProxy.invoke(ChainFilters.java:29)
at org.webpieces.router.impl.loader.ChainFilters$ServiceFilterProxy.invoke(ChainFilters.java:17)
at com.orderlyhealth.serverutil.filters.JobAndBatchIdFilter.filter(JobAndBatchIdFilter.java:33)
at com.orderlyhealth.serverutil.filters.JobAndBatchIdFilter.filter(JobAndBatchIdFilter.java:13)
at org.webpieces.router.impl.loader.ChainFilters$ServiceFilterProxy.invoke(ChainFilters.java:29)
at org.webpieces.router.impl.loader.ChainFilters$ServiceFilterProxy.invoke(ChainFilters.java:17)
at org.webpieces.router.impl.routers.Endpoint.invoke(Endpoint.java:27)
at org.webpieces.router.impl.routeinvoker.ServiceInvoker.invokeService(ServiceInvoker.java:83)
at org.webpieces.router.impl.routeinvoker.ServiceInvoker.lambda$invokeSvc$0(ServiceInvoker.java:67)
at org.webpieces.util.futures.FutureHelper.syncToAsyncException(FutureHelper.java:169)
at org.webpieces.util.futures.FutureHelper.catchBlock(FutureHelper.java:104)
at org.webpieces.util.futures.FutureHelper.catchBlockWrap(FutureHelper.java:142)
at org.webpieces.router.impl.routeinvoker.ServiceInvoker.invokeSvc(ServiceInvoker.java:66)
at org.webpieces.router.impl.routebldr.RequestResponseStream.lambda$openStream$1(RequestResponseStream.java:57)
at org.webpieces.router.impl.routeinvoker.RequestStreamWriter2.handleCompleteRequestImpl(RequestStreamWriter2.java:86)
at org.webpieces.router.impl.routeinvoker.RequestStreamWriter2.processPiece(RequestStreamWriter2.java:68)
at org.webpieces.router.impl.routers.NonStreamingWebAppErrorProxy.lambda$processPiece$0(NonStreamingWebAppErrorProxy.java:41)
at org.webpieces.util.futures.FutureHelper.syncToAsyncException(FutureHelper.java:169)
at org.webpieces.util.futures.FutureHelper.catchBlock(FutureHelper.java:104)
at org.webpieces.router.impl.routers.NonStreamingWebAppErrorProxy.processPiece(NonStreamingWebAppErrorProxy.java:40)
at org.webpieces.router.impl.TxStreamWriter.processPiece(TxStreamWriter.java:24)
at org.webpieces.frontend2.impl.ProxyHttpStream$ProxyWriter.processPiece(ProxyHttpStream.java:161)
at org.webpieces.frontend2.impl.Layer2Http11Handler.lambda$processPiece$7(Layer2Http11Handler.java:210)
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.thenCompose(Unknown Source)
at org.webpieces.frontend2.impl.Layer2Http11Handler.processPiece(Layer2Http11Handler.java:210)
at org.webpieces.frontend2.impl.Layer2Http11Handler.lambda$null$4(Layer2Http11Handler.java:199)
at org.webpieces.util.futures.FutureHelper.syncToAsyncException(FutureHelper.java:169)
at org.webpieces.util.futures.FutureHelper.finallyBlock(FutureHelper.java:55)
at org.webpieces.frontend2.impl.Layer2Http11Handler.lambda$processData$6(Layer2Http11Handler.java:198)
at org.webpieces.util.locking.PermitQueue.processItemFromQueue(PermitQueue.java:82)
at org.webpieces.util.locking.PermitQueue.runRequest(PermitQueue.java:62)
at org.webpieces.frontend2.impl.Layer2Http11Handler.processData(Layer2Http11Handler.java:184)
at org.webpieces.frontend2.impl.Layer2Http11Handler.processCorrectly(Layer2Http11Handler.java:173)
at org.webpieces.frontend2.impl.Layer2Http11Handler.lambda$processWithBackpressure$3(Layer2Http11Handler.java:149)
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.thenCompose(Unknown Source)
at org.webpieces.frontend2.impl.Layer2Http11Handler.processWithBackpressure(Layer2Http11Handler.java:149)
at org.webpieces.frontend2.impl.Layer2Http11Handler.initialDataImpl(Layer2Http11Handler.java:72)
at org.webpieces.frontend2.impl.Layer2Http11Handler.initialData(Layer2Http11Handler.java:48)
at org.webpieces.frontend2.impl.Layer1ServerListener.lambda$initialData$1(Layer1ServerListener.java:62)
at org.webpieces.util.futures.FutureHelper.syncToAsyncException(FutureHelper.java:169)
at org.webpieces.util.futures.FutureHelper.catchBlock(FutureHelper.java:104)
at org.webpieces.util.futures.FutureHelper.catchBlockWrap(FutureHelper.java:142)
at org.webpieces.frontend2.impl.Layer1ServerListener.initialData(Layer1ServerListener.java:61)
at org.webpieces.frontend2.impl.Layer1ServerListener.incomingData(Layer1ServerListener.java:51)
at org.webpieces.asyncserver.impl.ProxyDataListener.incomingData(ProxyDataListener.java:26)
at org.webpieces.nio.impl.threading.ThreadDataListener$DataListeneRunanble.run(ThreadDataListener.java:54)
at org.webpieces.util.threading.SessionExecutorImpl$RunnableWithKey.run(SessionExecutorImpl.java:121)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.util.concurrent.TimeoutException: null
at java.base/java.util.concurrent.CompletableFuture.timedGet(Unknown Source)
at java.base/java.util.concurrent.CompletableFuture.get(Unknown Source)
at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:209)
... 80 common frames omitted
Любые идеи, как это исправить? С нами такое случается довольно часто.
3 ответа
Это сообщение об ошибке...
org.openqa.selenium.TimeoutException: Supplied function might have stalled
Build info: version: '4.0.0-alpha-5', revision: 'b3a0d621cc'
System info: host: 'localhost', ip: '127.0.0.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0', java.version: '11.0.6'
Driver info: driver.version: unknown
... подразумевает, что исключение TimeoutException произошло во время ожидания заголовка, содержащего строкуFind a doctor
.
Анализ
Я не вижу серьезных изменений в определении ExpectedConditions titleContains()
который определяется следующим образом:
/**
* An expectation for checking that the title contains a case-sensitive substring
*
* @param title the fragment of title expected
* @return true when the title matches, false otherwise
*/
public static ExpectedCondition<Boolean> titleContains(final String title) {
return new ExpectedCondition<Boolean>() {
private String currentTitle = "";
@Override
public Boolean apply(WebDriver driver) {
currentTitle = driver.getTitle();
return currentTitle != null && currentTitle.contains(title);
}
@Override
public String toString() {
return String.format("title to contain \"%s\". Current title: \"%s\"", title, currentTitle);
}
};
}
Однако TimeoutException, похоже, возникает из ExecutionException, что выглядит немного странно.
/**
* Repeatedly applies this instance's input value to the given function until one of the following
* occurs:
* <ol>
* <li>the function returns neither null nor false</li>
* <li>the function throws an unignored exception</li>
* <li>the timeout expires</li>
* <li>the current thread is interrupted</li>
* </ol>
*
* @param isTrue the parameter to pass to the {@link ExpectedCondition}
* @param <V> The function's expected return type.
* @return The function's return value if the function returned something different
* from null or false before the timeout expired.
* @throws TimeoutException If the timeout expires.
*/
@Override
public <V> V until(Function<? super T, V> isTrue) {
try {
return CompletableFuture.supplyAsync(checkConditionInLoop(isTrue))
.get(deriveSafeTimeout(), TimeUnit.MILLISECONDS);
} catch (ExecutionException cause) {
if (cause.getCause() instanceof RuntimeException) {
throw (RuntimeException) cause.getCause();
} else if (cause.getCause() instanceof Error) {
throw (Error) cause.getCause();
}
throw new RuntimeException(cause);
} catch (InterruptedException cause) {
Thread.currentThread().interrupt();
throw new RuntimeException(cause);
} catch (java.util.concurrent.TimeoutException cause) {
throw new TimeoutException("Supplied function might have stalled", cause);
}
}
Но driver.version: unknown
дает нам понять, что существует несовместимость между версиями используемых вами двоичных файлов.
Кроме того, в следующем выпуске Selenium конструктор WebDriverWait из selenium3 будет устаревшим.
@Deprecated
public WebDriverWait(WebDriver driver, long timeoutInSeconds) {
this(driver, Duration.ofSeconds(timeoutInSeconds));
}
Новый конструктор WebDriverWait, который будет использоваться в selenium4 (в настоящее время в Alpha):
public WebDriverWait(WebDriver driver, Duration timeout) {
this(
driver,
timeout,
Duration.ofMillis(DEFAULT_SLEEP_TIMEOUT),
Clock.systemDefaultZone(),
Sleeper.SYSTEM_SLEEPER);
}
Использование должно быть:
new WebDriverWait(driver, Duration.ofSeconds(10));
Java 11
Поскольку вы используете java.version: '11.0.6', Selenium по-прежнему несовместим с Java 11. Но как только Java 11 будет выпущена и Buck поддержит ее, набор инструментов будет изменен для поддержки Java 11.
Решение
Стратегическим решением будет установка последней версии JDK 8u251 и выполнение @Tests
Справка
Вы можете найти соответствующее подробное обсуждение в Невозможно импортировать org.openqa.selenium.WebDriver с использованием Selenium и Java 11.
Оказывается, когда у вас плохой прокси посередине, я заметил, что браузеры ЖДУТ на странице. Тогда это приведет к зависанию драйверов селена. Это была периодически возникающая проблема, поэтому ее трудно было сузить до проблемы с прокси.
он ясно говорит, т.е. TimeoutException, измените тайм-аут, вы указали 30 мс, но на самом деле нужно больше, чем это ... дайте ему больше 30, он будет работать гладко.