Перейти к содержимому

Фотография

isDisplayed=true но ElementNotFound


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 15

#1 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 11 июля 2016 - 11:57

Столкнулся с регрессией. Компонент визуально скрыт, но WebDriver упорно отвечает, что isDisplayed=true, а при попытке .click() соответственно валится с ElementNotFound. Вот сам элемент

 

http://pastebin.com/bsVVTS9R

 

Сейчас переводим приложение на React, часть ещё на Angular, так что периодически всплывают такие вот интересные аномалии... 

Когда элемент виден, добавляется класс "show-dates", но, честно говоря, переделывать везде ожидание видимости на проверку наличия класса... это не наш метод. Да и не гарантирует он видимость-невидимость. Что делать, ребята? Пинать девелопера? Он клянётся, что всё работает как раньше на ангуляре, но по факту - нет.


  • 0

#2 DennisM

DennisM

    Новый участник

  • Members
  • Pip
  • 55 сообщений
  • ФИО:Dennis M
  • Город:Ralegh NC, USA

Отправлено 11 июля 2016 - 13:57

Столкнулся с регрессией. Компонент визуально скрыт, но WebDriver упорно отвечает, что isDisplayed=true, а при попытке .click() соответственно валится с ElementNotFound. Вот сам элемент

 

http://pastebin.com/bsVVTS9R

 

Сейчас переводим приложение на React, часть ещё на Angular, так что периодически всплывают такие вот интересные аномалии... 

Когда элемент виден, добавляется класс "show-dates", но, честно говоря, переделывать везде ожидание видимости на проверку наличия класса... это не наш метод. Да и не гарантирует он видимость-невидимость. Что делать, ребята? Пинать девелопера? Он клянётся, что всё работает как раньше на ангуляре, но по факту - нет.

 

Жди элемента по примеру:

 

import org.openqa.selenium.support.ui.ExpectedConditions;

import org.openqa.selenium.support.ui.WebDriverWait;

 

new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(ElementLocator));

 

или

 

new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(ElementLocator));

 

 

или проверяй boolean из

boolean visible = ExpectedConditions.visibilityOfElementLocated(ElementLocator);

 

не поможет, смотри другие проверки из ExpectedConditions


  • 0

#3 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 11 июля 2016 - 14:26

 

Столкнулся с регрессией. Компонент визуально скрыт, но WebDriver упорно отвечает, что isDisplayed=true, а при попытке .click() соответственно валится с ElementNotFound. Вот сам элемент

 

http://pastebin.com/bsVVTS9R

 

Сейчас переводим приложение на React, часть ещё на Angular, так что периодически всплывают такие вот интересные аномалии... 

Когда элемент виден, добавляется класс "show-dates", но, честно говоря, переделывать везде ожидание видимости на проверку наличия класса... это не наш метод. Да и не гарантирует он видимость-невидимость. Что делать, ребята? Пинать девелопера? Он клянётся, что всё работает как раньше на ангуляре, но по факту - нет.

 

Жди элемента по примеру:

 

import org.openqa.selenium.support.ui.ExpectedConditions;

import org.openqa.selenium.support.ui.WebDriverWait;

 

new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(ElementLocator));

 

или

 

new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(ElementLocator));

 

 

или проверяй boolean из

boolean visible = ExpectedConditions.visibilityOfElementLocated(ElementLocator);

 

не поможет, смотри другие проверки из ExpectedConditions

 

Вы, видимо, невнимательно прочитали, что я написал. isDisplayed=true. Все эти ExpectedConditions внутри используют этот же самый метод, так что... Ожидание тут бесполезно, это я пробовал в дебаггере. Хоть тыщу лет жди, всё равно возвращает true.


  • 0

#4 Lzk

Lzk

    Специалист

  • Members
  • PipPipPipPipPip
  • 504 сообщений
  • ФИО:Олег
  • Город:Мск

Отправлено 11 июля 2016 - 14:42

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

например

@isEnabled='true',

@isEnabled='false',

@checked='checked'(для чекбоксов),

и тд


  • 0

#5 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 11 июля 2016 - 14:42

Вы привели код только самого элемента.

К примеру, если есть элемент А, который лежит внутри Б, который лежит внутри С. При этом вы дали код элемента А, а "невидимым" все этот блок делается в рамках С.

Можно попробовать посмотреть элементы выше по иерархии.

Плюс, как Вам уже писали выше, попробуйте использовать ExpectedConditions, но не видимость ожидайте, а кликабельность (elementToBeClickable).


  • 1

#6 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 11 июля 2016 - 14:54

Сомневаюсь, что проблема в scope. Конкретно этот элемент приведён полностью. Выше по иерархии уже более общий div, где куча других компонентов. Мне всё таки интересно, почему нативный isDisplayed() врёт. Сейчас убедил девелопера добавить атрибут, попробует завтра. Может поможет.. посмотрим. Не хотелось бы изобретать костыли для того, что должно работать "из коробки". 


  • 0

#7 Vad1m198

Vad1m198

    Активный участник

  • Members
  • PipPip
  • 115 сообщений
  • ФИО:Вадим


Отправлено 12 июля 2016 - 13:25

Я сомневаюсь, что selenium вам "врет"

Как сказано на w3c https://w3c.github.i...-displayedness 

 

"The element displayed algorithm is a boolean state where true signifies that the element is displayed and false signifies that the element is not displayed. To compute the state on element:
    1. If the attribute hidden is set, return false.
    2. If the computed value of the display style property is "none", return false."
 
А скрыть елемент можно и другими способами css. Тогда елемент будет невидим для глаза, но isDisplayed() == true.

  • 1

#8 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 12 июля 2016 - 14:02

 

Я сомневаюсь, что selenium вам "врет"

Как сказано на w3c https://w3c.github.i...-displayedness 

 

"The element displayed algorithm is a boolean state where true signifies that the element is displayed and false signifies that the element is not displayed. To compute the state on element:
    1. If the attribute hidden is set, return false.
    2. If the computed value of the display style property is "none", return false."
 
А скрыть елемент можно и другими способами css. Тогда елемент будет невидим для глаза, но isDisplayed() == true.

 

Об этом собственно и речь. Спеку эту уже третий день мурыжу без толку. Написал сейчас временно костыль, который пытается кликать и ловит exception, так как пока это единственный надёжный способ проверить реальную видимость.


  • 0

#9 DmitriyQA

DmitriyQA

    Постоянный участник

  • Members
  • PipPipPip
  • 183 сообщений
  • ФИО:Коваленко Дмитрий Владимирович
  • Город:Tel Aviv

Отправлено 13 июля 2016 - 10:52

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

http://www.w3schools...pos_z-index.asp


  • 0

Senior QA/ Wix.com / qaacademy.net


#10 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 13 июля 2016 - 13:24

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

http://www.w3schools...pos_z-index.asp

Удивительно, что вы это упомянули, с z-index'ом я уже пытался повозиться, но получал значение auto (то есть значение не указано) независимо от того, скрыт элемент под другим или нет, поэтому толку нет.


  • 0

#11 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 13 июля 2016 - 13:45

Об этом собственно и речь. Спеку эту уже третий день мурыжу без толку. Написал сейчас временно костыль, который пытается кликать и ловит exception, так как пока это единственный надёжный способ проверить реальную видимость.


Вы ведь так и не попробовали ExpectedConditions.elementToBeClickable...

Метод специально сделан для случаев, когда недостаточно дождаться "видимости" элемента, необходимо ещё и дождаться, чтобы он был в том состоянии, когда по нему можно кликнуть (что Вам и требуется, судя по первому посту).

Если Вам вместо того, чтобы попробовать заменить бесполезное почти всегда isDisplayed на гораздо более надежное ExpectedConditions.elementToBeClickable, проще написать "костыль пытающийся кликать"... Ну дело ваше.


  • 0

#12 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 13 июля 2016 - 13:54

 

Об этом собственно и речь. Спеку эту уже третий день мурыжу без толку. Написал сейчас временно костыль, который пытается кликать и ловит exception, так как пока это единственный надёжный способ проверить реальную видимость.


Вы ведь так и не попробовали ExpectedConditions.elementToBeClickable...

Метод специально сделан для случаев, когда недостаточно дождаться "видимости" элемента, необходимо ещё и дождаться, чтобы он был в том состоянии, когда по нему можно кликнуть (что Вам и требуется, судя по первому посту).

Если Вам вместо того, чтобы попробовать заменить бесполезное почти всегда isDisplayed на гораздо более надежное ExpectedConditions.elementToBeClickable, проще написать "костыль пытающийся кликать"... Ну дело ваше.

 

Нет, мне не нужно ждать чтобы элемент был clickable. Мне нужно лишь проверить, виден элемент или нет. 

Опытным путём выяснил, что значение css свойства "top", когда элемент виден, всегда равно 60px, поэтому теперь проверка выглядит так (используется Selenide)

public static boolean datesAreVisible() {
        return $(".header-dates-container").has(cssClass("show-dates"))
                && $(".header-dates-container").getCssValue("top") == "60px";
    }

Пока что работает. Время покажет насколько надёжно.


  • 0

#13 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 13 июля 2016 - 13:56

Значит я не так поняла то, что Вы написали в первом посте про click.

Кстати, на этом форуме уже есть тема с аналогичной проблемой - там тоже есть варианты решения различные.

 

п.с.: немного оффтопа, если позволите: у Вас ведь selenide? Если у меня большой проект уже - мне ведь нет необходимости ВСЕ переписывать, если я хочу попробовать selenide? Достаточно просто что-то "новое" сделать с его использованием?


  • 0

#14 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 13 июля 2016 - 14:02

Значит я не так поняла то, что Вы написали в первом посте про click.

Кстати, на этом форуме уже есть тема с аналогичной проблемой - там тоже есть варианты решения различные.

 

п.с.: немного оффтопа, если позволите: у Вас ведь selenide? Если у меня большой проект уже - мне ведь нет необходимости ВСЕ переписывать, если я хочу попробовать selenide? Достаточно просто что-то "новое" сделать с его использованием?

Можно переводить постепенно. Не обязательно переписывать сразу всё. Или просто начать писать новое с selenide


  • 0

#15 vinogradoff

vinogradoff

    Новый участник

  • Members
  • Pip
  • 72 сообщений
  • ФИО:Alexei Vinogradov
  • Город:Dormagen


Отправлено 13 июля 2016 - 22:27

 

 

п.с.: немного оффтопа, если позволите: у Вас ведь selenide? Если у меня большой проект уже - мне ведь нет необходимости ВСЕ переписывать, если я хочу попробовать selenide? Достаточно просто что-то "новое" сделать с его использованием?

Можно конечно только "новое" писать, никаких проблем.


  • 0

#16 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 15 июля 2016 - 08:25

Я сомневаюсь, что selenium вам "врет"
Как сказано на w3c https://w3c.github.i...-displayedness 

w3c на гитхабе? ^_^

https://www.w3.org/T...t-displayedness

The visibility of an element is guided by what is perceptually visible to the human eye. In this context, an element's displayedness does not relate to the visibility or display style properties.


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных