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

Фотография

WaitForElementHidden приводит к ошибке типа "element not found"

selenium protractor js

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

#1 MissLeman

MissLeman

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

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 19 февраля 2018 - 15:00

Здравствуйте. Вопрос довольно специфический, одна надежда на любителей сложных задачек

 

Пишем на Protractor + Jasmine (т.е. js + selenium).

Есть функция типа WaitForElementPresentAndVisible, которая, соответственно, ждет, пока элемент не появится в DOM и не будет виден. Есть функция WaitForElementHidden, которая ждет, пока элемент пропадет.

 

И вот у меня в приложеньке есть всплывающее окно, которое ненадолго появляется после выполнения некоего действия, мол, "Успешно сохранено", всплываечка такая в левом углу, сама появляется и сама пропадает. Я, соответственно, пишу примерно так:

feedBackToast = element(by.xpath("//div[contains(@class,'toast-message')]"));

<some steps>
waitHelper.waitForElementPresentAndVisible(this.feedBackToast); 

waitHelper.waitForElementHidden(this.feedBackToast);
 
И вот загадка в том, что waitForElementPresentAndVisible отлично отрабатывает, а waitForElementHidden падает с ошибкой "Element is not found". Но этот метод основан на ожидании
ожидании исчезновения элемента из DOM! (вот здесь можно поискать по слову stalenessOf).

 

Понятно было бы, если бы тест падал с ошибкой таймаута, т.е. элемент не пропадал бы из DOM (а, например, торчал бы где-то в разметке, просто невидимый). И понятно было бы, если бы была ошибка в локаторе - в этом случае первая ждалка ждала-ждала бы, да и падала, т.к. элемент так и не появился. Но по факту первая ждалка дожидается элемента (что говорит о том, что он существует и видим), а вторая - почему-то его Not Found (выявлено методом исключения). Подскажите, пожалуйста, где я могу тупить :)


  • 0

#2 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 19 февраля 2018 - 15:50

Логика и ошибка говорят что waitForElementHidden подразумевает что элемент присутствует но скрыт.
сообщество предлагает либо ловить эксцепшен, либо искать не элемент, а элементы и ждать пока размер результата == 0
  • 0

#3 MissLeman

MissLeman

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

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 20 февраля 2018 - 06:06

Логика и ошибка говорят что waitForElementHidden подразумевает что элемент присутствует но скрыт.
сообщество предлагает либо ловить эксцепшен, либо искать не элемент, а элементы и ждать пока размер результата == 0

Element not found в тракторе означает именно "отсутствует в разметке".

Код ждалки

this.waitForElementHidden = function (el, timeout) {

if (!timeout) {
timeout = defaultTimeout;
}


return browser.wait(
EC.stalenessOf(el),
timeout,
el.locator().toString() + " is taking too long to hide in the DOM"
);
};

где stalenessOf означает

  
/** * An expectation for checking that an element is not attached to the DOM

* of a page. This is the opposite of 'presenceOf'.

stalenessOf(elementFinder: ElementFinder): Function {
    return this.not(this.presenceOf(elementFinder));
}

Т.е. ждалка должна ждать, чтобы элемент исчез, и при этом ругается именно на то, что он исчез (в приложении он исчезает, как положено, т.е. функционального бага нет).


  • 0

#4 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 20 февраля 2018 - 10:02

Похоже что presenceOf вместо false кидает трейсбек.
Погуглите, я когда вчера пробегался по вопросу - видел обсуждение на тему.
  • 0

#5 TatyanaV

TatyanaV

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

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


Отправлено 20 февраля 2018 - 12:21

У вас в процессе выполнения возможна ситуация, когда к моменту начала второго wait элемент успевает уже пропасть. 

Поэтому первый wait успешно проходит (элемент есть), а второй падает (его уже нет ещё до начала проверки). 

Так можно отхватить и экспешн, когда wait успеет найти элемент, но к началу проверки условия элемент успеет пропасть из DOM (StaleElementReferenceException, если правильно помню название).

Поэтому подобные ожидания и не рекомендуется использовать.

 

Помимо прочего может быть ситуация, когда обе проверки будут походить при запуске на Вашей машине, а потом при запуске на другой машине тест будет идти быстрее и на второй проверке начнет падать.

 

Эффективнее и надежнее искать, как написал Little_CJIOH - findElements и ждать пока кол-во находимых так элементов не станет равно 0. 

Элемент ещё не успел пропасть? Ок, кол-во больше 0 - тест ждёт.

Элемент успел пропасть ещё до начала проверки? Тоже ок, кол-во = 0 - тест идёт дальше.


  • 0

#6 MissLeman

MissLeman

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

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 20 февраля 2018 - 19:49

Похоже что presenceOf вместо false кидает трейсбек.
Погуглите, я когда вчера пробегался по вопросу - видел обсуждение на тему.

 

Спасибо, попробую!

 

У вас в процессе выполнения возможна ситуация, когда к моменту начала второго wait элемент успевает уже пропасть. 

Поэтому первый wait успешно проходит (элемент есть), а второй падает (его уже нет ещё до начала проверки). 

Так можно отхватить и экспешн, когда wait успеет найти элемент, но к началу проверки условия элемент успеет пропасть из DOM (StaleElementReferenceException, если правильно помню название).

Поэтому подобные ожидания и не рекомендуется использовать.

 

Помимо прочего может быть ситуация, когда обе проверки будут походить при запуске на Вашей машине, а потом при запуске на другой машине тест будет идти быстрее и на второй проверке начнет падать.

 

Эффективнее и надежнее искать, как написал Little_CJIOH - findElements и ждать пока кол-во находимых так элементов не станет равно 0. 

Элемент ещё не успел пропасть? Ок, кол-во больше 0 - тест ждёт.

Элемент успел пропасть ещё до начала проверки? Тоже ок, кол-во = 0 - тест идёт дальше.

Да, насчет того, что сочетание этих проверок ненадежно, вы пожалуй правы, перепишу через массив.

Но в данном конкретном случае таймаут обеих проверок примерно в 10 раз меньше времени отображения этой всплывайки (оно фиксированное), так что вряд ли. Видимо, Little_CJIOH прав. Спасибо большое!


  • 0



Темы с аналогичным тегами selenium protractor, js

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

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