Утверждают, что вебемента нет - быстрое решение?

Мне нужно утверждать, что веб-элемент не существует несколько раз в моем тесте. Я уже искал это на сайте, и в ответах нашел то, что у меня уже есть в моем коде:

try{
    WebElement w = driver.findElement(By.id("warning"));
} catch (NoSuchElementException e){
    return true;
}
return false;

Мне было интересно, есть ли более быстрый способ? Потому что каждый раз, когда это запускается, когда элемент не существует, для перехвата исключения требуется много времени. Я знаю, что это потому, что веб-драйвер ищет элемент на всей странице, но все же... есть ли более быстрые способы?

Можно ли как-то использовать WebDriverWait с очень малым таймаутом?

Спасибо


person Chris    schedule 01.07.2013    source источник


Ответы (3)


Это связано с неявным ожиданием в WebDriver. Чтобы избежать этого ожидания, пока элемент не найден, вам нужно установить неявное время ожидания равным нулю перед проверкой вашего условия.

  • Установка implicity_wait на 0, чтобы WebDriver не ждал неявно.
  • Возвращает True, когда элемент найден. Перехват NoSuchElementException и возврат False, когда мы обнаружим, что элемент отсутствует, вместо остановки теста с исключением.
  • Установка implicitly_wait обратно на 10 после завершения действия, чтобы WebDriver неявно ждал в будущем.

См. это для реализации описанного выше процесса.

person Santoshsarma    schedule 01.07.2013
comment
Спасибо за ответ. Я пробовал это, но на самом деле это замедлило тест. После того, как вы попробовали вышеизложенное, потребовалось много времени, чтобы поймать исключение. Кроме того, более поздняя часть теста, которая обычно выполняется быстро, выполнялась медленнее. Будет ли здесь явное ожидание работать лучше? - person Chris; 01.07.2013
comment
Это сработало для меня. - person vitaliis; 21.12.2020

Другой вариант — найти список элементов, а затем проверить длину списка.

List<WebElement> warnings = driver.findElements(By.id("warning"));
if warnings.length() == 0 {
    return true;
} else return false;

Преимущество этого заключается в том, что вам не нужно ждать тайм-аута, указанного в вашем driver. Надеюсь, возможная альтернатива для вас.

person Mark Rowlands    schedule 01.07.2013
comment
вы можете сделать его короче, вернув warnings.length() == 0, однако это не решит проблему. - person vitaliis; 21.12.2020

Попробуйте эту функцию

boolean isElementExists(By elementSelector) {
      return driver.findElements(elementSelector).size() > 0;
}
person user2525437    schedule 01.07.2013
comment
Он также будет ожидать количество секунд, заданное implicity_wait(). - person vitaliis; 21.12.2020