Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Selenium+Selenide. Тест падает когда элемент имеет свойство displayed:false

webdriver
selenide
selenium
Теги: #<Tag:0x00007fedb96cb4a8> #<Tag:0x00007fedb96cb2c8> #<Tag:0x00007fedb96cb0e8>

(Роман Васин) #1

Есть элемент
<label class="CI-MultiplePickerList-column-name-img_logout CI-MultiplePickerList-LAB" style="display: inline;"/>

с CSS локатором


.CI-MultiplePickerList-column-name-img_logout.CI-MultiplePickerList-LAB

Этот элемент может иметь два статуса - когда виден пользователю и когда не виден.

Проблема: После нажатия по этому элементу, когда он имеет статус displayed:false (т.е. когда не виден пользователю), тест падает и появляется ошибка:

Element should be visible {.CI-MultiplePickerList-column-name-img_logout.CI-MultiplePickerList-LAB}
Element: '<label class="CI-MultiplePickerList-column-name-img_logout CI-MultiplePickerList-LAB" displayed:false></label>'

Я пытался отловить ошибку через exception:

try {
        $(By.cssSelector(".CI-MultiplePickerList-column-name-img_logout.CI-MultiplePickerList-LAB")).click();
    }
    catch (ElementNotFound e){
        System.out.print("Not logged in profile");
    }

но это не помогло.

Как можно решить эту проблему так, чтобы тест не падал при нажатии на элемент со свойством displayed:false?


(Остап Олексин) #2

А зачем вам кликать на елемент который не виден пользователю?


(Роман Васин) #3

Это необходимая проверка перед тестом. Если елемент не виден, то не выполняем действие, выводим ошибку и идем дальше по коду.
Пробовал реализовать аналогично через оператор if

 if ($(By.cssSelector(".CI-MultiplePickerList-column-name-img_logout.CI-MultiplePickerList-LAB")).isDisplayed()){
            $(By.cssSelector(".CI-MultiplePickerList-column-name-img_logout.CI-MultiplePickerList-LAB")).click();
     }
        else {
            System.out.print("Not logged in profile");
    }

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


(Mr Ds Low) #4

А зачем тебе проверять работоспособность/видимость элемента кликами? Используй Assert (assertThat, assertTrue, assertEquals и т.д.).

catch ошибки “nosuchelementexception”?


(Остап Олексин) #5

То есть метод isDisplayed() возвращает false когда елемент явно видимый? Я правильно понял?


(Дмитрий Кравчук) #6

Чтобы решить эту задачу, на мой взгляд, нужно понять, что происходит с элементом “когда не виден”. При этом его вообще нет в DOM, или style="display: none; или быть может какой еще вариант. И уже отслеживать эти изменения.


(Роман Васин) #7

Когда элемент не виден, он находится в DOM и имеет display: none. Когда виден - display: inline.


(Роман Васин) #8

Да, “if” получает isDisplayed - false, когда элемент имеет статус display: inline.


(Остап Олексин) #9

Ну тогда методом getAttribute() проверяйте аттрибут display и исходя из значения делайте что вам нужно.


(Дмитрий Кравчук) #10

Вот еще на есть метод в селениде shouldBe. Почитайте про него в документации.
http://ru.selenide.org/documentation.html
Пример:

$("input").shouldBe(visible);

Возможно это то, что вам нужно.


(Роман Васин) #11

Его пробовал, и если элемент имеет dispay:none, то тест падает с ошибкой Element should be visible. А exception его не перехватывает. (Интересно почему?). Причем в других проверках, где нет свойства display, метод shouldBe работает. Тут есть какая-то особенность связанная с display и я не могу пока понять какая именно.


(Роман Васин) #12

Попробовал реализовать
Через getAttribute проверил, что элемент в статусе display: none получает “null”
Вписал проверку в условие if:

if($(By.cssSelector(".CI-MultiplePickerList-column-name-img_logout.CI-MultiplePickerList-LAB")).getAttribute("display").equals("null")) {
            System.out.print("Ignored");
        }
        else{
            System.out.print("Else, click it");
            $(By.cssSelector(".CI-MultiplePickerList-column-name-img_logout.CI-MultiplePickerList-LAB")).click();
        }

В итоге, появляется ошибка:
java.lang.NullPointerException


(Остап Олексин) #13

Зачем вы проверяете на null? Вы же сами сказали что элемент у вас либо display: inline либо display: none.
Я немного не так выразился в предыдущем посте, display это не атрибут, а css пропертя, вам нужен атрибут style который вам вернет уже display пропертю.


(Роман Васин) #14

Null поставил, т.к. это значение мне сначала вернул getAttribute на display (что было не верно). Исправил на style

 if($(By.cssSelector(".CI-MultiplePickerList-column-name-img_logout.CI-MultiplePickerList-LAB")).getAttribute("style").equals("display: none;")) {
            System.out.print("Ignored");
        }
        else{
            System.out.print("Else, click it");
            $(By.cssSelector(".CI-MultiplePickerList-column-name-img_logout.CI-MultiplePickerList-LAB")).click();
        }

И Ура! Заработало! Большое спасибо вам за помощь!