IsElementPresent очень медленный, если элемент не существует. - программирование
Подтвердить что ты не робот

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']")));

Если это присутствует, эта функция выполняется быстро, но если выше нет, то она выполняется очень долго.

Может кто-нибудь, пожалуйста, помогите мне в решении этой проблемы, чтобы эта проверка могла быть выполнена быстро?

4b9b3361

Ответ 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'], и он будет короче, чем поиск всех тегов.