Как проверить отсутствие элемента на странице.

Как проверить что элемента действительно нет

try действие с отсутствующим элементом
catch ошибку
значит нет элемента

а если элемент появился, то в catch блок не зайдем и тест пройден.

пробовал добавить return false в try return true в catch, но при наличии элемента всеравно тест pass

WebDriverWait + ExpectedConditons → invisibilityOfElementLocated

П.С. Возможно не так понял условие. Элемент изначально присутствует, а потом исчезает? Или его в принципе нет, но может появится, и нужно его дождаться?

Так чего вы в итоге пытаетесь добиться? Зафейлить тест при любых раскладах? :slight_smile:

Нужно проверить что в календаре отображается от сегодняшней даты не более 45 дней, поэтому я сначала определяю дату, после к ней прибавляю 45 дней (получается 46), и кликаю на сгенерированный локатор, далее так как получается больше 45 дней падает ексепшн(так как такого локатора нет и быть не должно на странице) я его обрабатываю и кликаю на дату сегодня плюс 44 (получается 45,) если в блоке try сразу был локатор, то я закрывают драивер и далее падает тест в любом случае fail
я понимаю что так делать слишком сложно и можно сделать проще но не знаю как.

  public void date(int days, int days2) {
      String date = LocalDate.now().plusDays(days).format(DateTimeFormatter.ofPattern("yyy-MM-dd"));
        try {
            driver.findElement(By.cssSelector("[data-date='" + date + "']"));
            driver.quit();
            arrivCityInput.click();
        } catch (Exception ex) {
            String date2 = LocalDate.now().plusDays(days2).format(DateTimeFormatter.ofPattern("yyy-MM-dd"));
            driver.findElement(By.cssSelector("[data-date='" + date2 + "']")).click();
        }

    }

как зафейлить тест если он зашел в try и не зашел в catch

Считать последнюю отображаемую дату из календаря и заасертить, что она = expected?

П.С. Никогда так не делайте, и никому не показываете, что вы так умеете.

driver.findElement
driver.quit
element.click

я знаю что так плохо, поэтому и спросил((

Поэтому и ответил:

не могу в ассерте выбрать нужный метод

Показывайте код.

Дело в том что локаторы, на странице разные
тоесть я не могу взять последний элемент например по $(’.day’) , а если искать последний по конкретной дате, то я его найду и возможно после него будет елемент 45 + дней
поэтому я пробую кликнуть на последний, сам генерирую тот которого заведомо не должно быть и ловлю ексепшн

 public void date2(int days, int days2) {
        waitForAjaxToFinish();
        String date = LocalDate.now().plusDays(days).format(DateTimeFormatter.ofPattern("yyy-MM-dd"));
        String date2 = LocalDate.now().plusDays(days2).format(DateTimeFormatter.ofPattern("yyy-MM-dd"));
        Assert.assertEquals(driver.findElement(By.cssSelector("[data-date='" + date + "']")),driver.findElement(By.cssSelector("[data-date='" + date + "']")));

и еще изначально элемента нет на странице, он появляется после ввода городов.

получается надо делать ассерт на элемент которого нет, и если этот элемент есть то тест провален

Моя реализация - обычно для проверки наличия элемента делал такой общий метод-обертку, а потом уже проверял по ситуации

protected Boolean isElementPresented(By element){
        Boolean elementCondition = false;
        try{
            elementCondition = getDriver().findElement(element).isDisplayed();
        }
        catch (NoSuchElementException e){
            return  elementCondition;
        }
        return elementCondition;
    }

Еще раз… Зачем вам конкретная дата для поиска локатора?
Исходя из предложенной верстки, вам достаточно получить список дат через CSS + findElements, вытянуть последнюю из списка, а затем трансформировать в LocalDate для последующего ассерта:

LocalDate lastDate = findElements(css(".day:not(.disabled)")).stream()
                        .reduce((a, b) -> b)
                        .map(date -> LocalDate.parse(date, formatter))
                        .orElse(LocalDate.now());

П.С. Не помню точно, поддерживается ли not из коробки. Если нет, то можно JS’ом вытянуть, ну или xpath применить.

1 лайк

я такого способа не знал, сейчас попробую

Не знали, что можно вытянуть список элементов, вместо одного?

да, я плохо знаю css

А причем здесь CSS? Суть в использовании findElements для получения всего списка доступных дат, а не findElement с неопределенностью. Локатор можно сформировать как угодно - хоть CSS’ом, хоть XPath’ом, хоть Sizzle.

Чтобы использовать findElements, нужно универсальный локатор, я своими локаторами не мог получить список нужных элементов.

была идея получить все даты, и проверить кол-во элементов в списке если их больше чем 45 то тест провален.