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

.day - весь список дат;
.day:not(.disabled) - весь список без задизейбленных;
//*[contains(@class,'day') and not(contains(@class,'disabled'))][last()] - вообще вернет только последнюю дату, т.е. даже не нужно вытягивать весь список.

Я конечно не видел вашей полной верстки, но вариантов решения - масса. Не уверен, что все будет работать, ввиду древности xpath / css движков в драйвере, но при желании можно найти оптимальное решение.

Расскажите пожалуйста что делают строки reduce, map, orElse

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

Вариант получать последний элемент “.day:not(.disabled):last-child”, возвращает последний день недели, а не просто последний день

Это Java 8 streams API. Вкратце: получение последнего элемента, трансформация оного в LocalDate, возврат текущей даты, если на предыдущих степах ничего не было найдено. Если не вкратце, то подойдет чтение любой статьи 2+ летней давности о “нововведениях” Java 8.

П.С. Правда я там по ходу дела забыл еще одну трансформацию: WebElement -> String через getText. Но считайте это псевдо-кодом. На практике там может что-то быть подкорректировано, ибо писал без IDE.

Вчера ваш вариант не смог запустить, реализовал вот так

public void checkDate(int days) throws Exception {
        waitForAjaxToFinish();
        int one = driver.findElements(By.cssSelector(".day:not(.disabled)")).size();
        if (one != days)
            throw new Exception();
    }

Это плохой вариант?

C использованием Selenide всё выглядело бы гораздо красивее.

$$(".day:not(.disabled)").shouldHaveSize(days);

1 лайк

Да, плохой, ибо вы бросаете пустой exception прямо из пейджи, вместо вызова assert’а в тесте.

А как то через ассерт это можно реализовать, или лучше ваш вариант все-таки сделать рабочим?

Мой вариант ничего не ассертит. Он просто находит последнюю дату и преобразовывает ее к LocalDate. Тем не менее, я все равно не совсем понимаю вашей проблемы с ассертами. В чем именно загвоздка? Тут же элементарная проверка двух чисел на равенство.

Попробовать его найти через find_elements.
Если количество найденных элементов будет равно нулю, значит элемента нет.

   @Step("Проверка максимально доступной даты")
    public void checkDate(int expectedsDays) {
        waitForAjaxToFinish();
        int actualsDays = driver.findElements(By.cssSelector(".day:not(.disabled)")).size();
       Assert.assertEquals(expectedsDays,actualsDays);

Вот так правильно?

Что касается ассерта - похоже на правду. Только вот он используется в неверном месте. Проверки должны быть частью тестов, а не пейджей.

а где почитать как это правильно делать?

Посмотри вот это видео, здесь показываются 4 способа как проверить, что элемент отсутствует (причём без таймера) https://youtu.be/EoRHq5mhxxQ

Ну дела.
findElement оборачиваете в try block, если выпадет ElementNotFoundException, возвращаете false флаг вашего вспомогательного метода.

Господа, остановитесь!
Вы что, какие try-catch, какие 4 способа? Всё же просто:
$(".error").shouldNot(exist);

1 лайк

До конца посмотри, там не только этот способ использован, и вообще можно оператор try-catch не использовать.

А на шарпе так можно? И если можно, то по подробнее пожалуйста.

Букварь :slight_smile:

Большое спасибо! Я даже сохранил себе в заметки.