Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

java
webdriver
Теги: #<Tag:0x00007f7b69f8ad90> #<Tag:0x00007f7b69f8a868>

(pauloo89) #1

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

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

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

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


(Sergey Korol) #2

WebDriverWait + ExpectedConditons -> invisibilityOfElementLocated

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

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


(pauloo89) #3

Нужно проверить что в календаре отображается от сегодняшней даты не более 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();
        }

    }

(pauloo89) #4

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


(Sergey Korol) #5

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

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

driver.findElement
driver.quit
element.click

(pauloo89) #6

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


(Sergey Korol) #7

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


(pauloo89) #8

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


(Sergey Korol) #9

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


(pauloo89) #10

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


(pauloo89) #11
 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 + "']")));

(pauloo89) #12

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

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


(Sergey QA) #13

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

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

(Sergey Korol) #14

Еще раз… Зачем вам конкретная дата для поиска локатора?
Исходя из предложенной верстки, вам достаточно получить список дат через 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 применить.


(pauloo89) #15

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


(Sergey Korol) #16

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


(pauloo89) #17

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


(Sergey Korol) #18

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


(pauloo89) #19

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


(pauloo89) #20

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