IsElementPresent очень медленный, если элемент не существует.
Я использую ниже код для проверки элемента на моей веб-странице
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
catch (Exception e)
{
return false;
}
}
Мне нужно проверить свою программу, если конкретная область появляется в результате ниже
isElementPresent(By.xpath(".//*[@id='header']")));
Если это присутствует, эта функция выполняется быстро, но если выше нет, то она выполняется очень долго.
Может кто-нибудь, пожалуйста, помогите мне в решении этой проблемы, чтобы эта проверка могла быть выполнена быстро?
Ответы
Ответ 1
Здесь вам не хватает чего-то, поэтому он ждет, если нет элемента. findElement будет ждать элемента неявно заданного времени. поэтому вам нужно установить это время равным нулю в этом методе.
isElementPresent(WebDriver driver, By by) {
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
} finally {
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
}
Здесь происходит 4 важных события. В порядке:
-
Установка implicity_wait в 0, чтобы WebDriver не ожидал неявно.
-
Возврат True, когда элемент найден.
-
Захват исключения NoSuchElementException и возврат False, когда мы обнаруживаем, что этот элемент отсутствует, вместо того, чтобы остановить проверку с исключением.
-
Установка implicitly_wait назад до 30 после завершения действия, чтобы WebDriver неявно ожидал в будущем.
Ответ 2
По-видимому, он долго отправляет исключение, потому что ваш DOM большой, а xpath - не самый быстрый способ получить элемент. Но если вы хотите использовать xpath, попробуйте установить наилучший путь и избежать такой функции, где выполняется проверка подстроки.
Ваш фактический xpath: .//*[@id='header']
занимает так много времени, потому что вы проверяете все теги вашего DOM. Поэтому, если поместить тег в то, что вы ищете, например: вы хотите поймать ввод. ваш xpath должен начинаться как //input[@id='1234']
, и он будет короче, чем поиск всех тегов.