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

Есть элемент
<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 лайка

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

1 лайк

Это необходимая проверка перед тестом. Если елемент не виден, то не выполняем действие, выводим ошибку и идем дальше по коду.
Пробовал реализовать аналогично через оператор 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. При этом, если написать нажатие напрямую без условных операторов, то все будет видно и нажатие произойдет.

1 лайк

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

catch ошибки “nosuchelementexception”?

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

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

1 лайк

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

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

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

1 лайк

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

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

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

1 лайк

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

Попробовал реализовать
Через 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

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

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();
        }

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