t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

locators
java
selenide
webdriver
Теги: #<Tag:0x00007fb2f6927150> #<Tag:0x00007fb2f6927010> #<Tag:0x00007fb2f6926ed0> #<Tag:0x00007fb2f6926d90>

(Sergey Korol) #21

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

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


(pauloo89) #22

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

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

(pauloo89) #23

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


(Sergey Korol) #24

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

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


(pauloo89) #25

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

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

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


(Pavel Ponomaryov) #26

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

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


(Sergey Korol) #27

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


(pauloo89) #28

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


(Sergey Korol) #29

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


(Сергей Блохин) #30

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


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

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


(Sergey Korol) #32

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


(pauloo89) #33

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


(Влад Богер) #34

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


(Dmytro Kryshtopenko) #35

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


(asolntsev) #36

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


(Влад Богер) #37

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


(Влад Богер) #38

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


(Salciuc Vitalie) #39

Букварь :slight_smile:


(Влад Богер) #40

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