Я пытаюсь использовать Selenium, чтобы дождаться появления и исчезновения индикатора выполнения, что указывает на то, что результат поиска запущен, а затем выполнен.
Когда индикатор выполнения отсутствует, документ выглядит что-то вроде этого:
<html lang="en-US">
<body class="appian-body">
<a id="skip-to-content"></a>
<div id="aDiv"></div>
<div id="anotherOne"></div>
<div id="OneMore"></div>
...
</body>
</html>
Когда начинается поисковый вызов, он выглядит следующим образом:
<html lang="en-US">
<body class="appian-body">
<a id="skip-to-content"></a>
<div id="aDiv"></div>
<div id="anotherOne"></div>
<div id="OneMore"></div>
...
<div id="appian-working-indicator-hidden" style="display: none;"></div>
</body>
</html>
Обратите внимание, что появился <div id="appian-working-indicator-hidden" style="display: none;"></div>
, что также происходит, когда появляется индикатор выполнения. Конечно, когда поиск будет завершен, он исчезнет, и мы вернемся к исходному документу.
Вот некоторые попытки, которые я предпринял для ожидания этого элемента:
Попытка 1
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[4]")));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("/html/body/div[4]")));
Результат: Исключение тайм-аута на visibilityOfElementLocated
(то есть оно никогда не отображается).
Попытка 2
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/div[4]")));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("/html/body/div[4]")));
Результат: Выполнение проходит через presenceOfElementLocated
и invisibilityOfElementLocated
без ожидания вообще.
Итак, что еще можно сделать, чтобы этот элемент появился и исчез?
Обновление
Я создал следующие рекурсивные методы:
public void waitForProgressBarToStart() {
List<WebElement> progressBarList = driver.findElements(By.xpath("//div[@id='appian-working-indicator-hidden']"));
if(progressBarList.size() == 0) {
waitForProgressBarToStart();
} else {
//for timestamping when the element is found
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
Date date = new Date();
System.out.println(String.format("%s: Progress Bar started", dateFormat.format(date)));
}
}
public void waitForProgressBarToFinish() {
List<WebElement> progressBarList = driver.findElements(By.xpath("//div[@id='appian-working-indicator-hidden']"));
if(progressBarList.size() > 0) {
waitForProgressBarToFinish();
} else {
//for timestamping when the element is gone
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
Date date = new Date();
System.out.println(String.format("%s: Progress Bar done", dateFormat.format(date)));
}
}
public void waitForResults(){
waitForProgressBarToStart();
waitForProgressBarToFinish();
}
После использования временных меток в методах я вижу, что метод waitForProgressBarToFinish
занимает на 10-13 секунд больше, чем фактический прогресс бар. Однако waitForProgressBarToStart
, похоже, находит элемент в нужное время.
Почему waitForProgressBarToFinish
займет больше времени и как это исправить?