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

Фотография

Ожидание изменения текста в элементе

selenium java webdriver

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

#1 appmen

appmen

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

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 30 ноября 2015 - 14:12

Здравствуйте,

В одном из шагов нужно дождаться пока текст в элементе не изменится и продолжать тест. Использую

public static ExpectedCondition<java.lang.Boolean> textToBePresentInElement(WebElement element,
                                                                            java.lang.String text)

An expectation for checking if the given text is present in the specified element.

Parameters:
    element - the WebElement
    text - to be present in the element
Returns:
    true once the element contains the given text 

В этом элементе часто "1". Иногда тест фейлится на этом шаге и пишет, что "1" так и не поменялся, хотя там 10249. Если я правильно понял, то textToBePresentInElement использует не equals, а contains (написано в описании и логично получается при анализе работы теста). Т.е. у нас в 10249 всегда будет "1" и он всегда будет фейлиться.

Если я прав, то можно ли как-то изменить условие с contains на equals? Смотрю на refreshed, но, может, есть решение другое


  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 30 ноября 2015 - 14:28

Пробуй textToBePresentInElementLocated

 

textToBePresentInElement уже Deprecated

https://selenium.goo...va.lang.String-

 
  • 0

#3 appmen

appmen

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

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 30 ноября 2015 - 14:39

Ну, я использую тот, который не отключён + тот, который ты посоветовал имеет такое же описание:

Returns:

true once the first element located by locator contains the given text

 

А с рефрешем какая-то фигня получается, он принимает ExpectedCondition, но какое условие ему скормить - не знаю


  • 0

#4 appmen

appmen

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

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 30 ноября 2015 - 15:12

К стати, я тут порылся и там везде contains. Странно, может же быть такое, что текст поменяется с 2 на 22 и метод покажет, что изменений не было...


  • 0

#5 appmen

appmen

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

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 30 ноября 2015 - 15:48

В продолжении своего монолога - создал свой класс, запихнул туда этот метод и поменял условие. Теперь всё работает. Не знаю насколько это правильно.


  • 0

#6 Petrov.Sergey

Petrov.Sergey

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

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 30 ноября 2015 - 17:28

Предложение:

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

Повторюсь: не "элемент изменит текст на «...»", а "появится элемент с текстом «...»"

То есть достаточно в локатор передать дополнительное условие, что text() = '1', и использовать presenceOfElementLocated(By locator)

 

И не надо изобретать свои велосипеды — главное правильно задать вопрос.


  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).

#7 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 01 декабря 2015 - 09:33

Попробуйте сделать ожидание на существование элемента с конкретным текстом или значением.
Например - ждем ссылку с текстом Save. Для этого просто пишем соответствующий локатор (Как написал все, заметил что Petrov.Sergey это и предлагает :smile:):

WebDriverWait waitLinkSave = new WebDriverWait(driver, TimeSpan.FromSeconds(30));//Ждем 30 секунд, например
waitLinkSave.Until(ExpectedConditions.ElementExists(By.XPath(//a[contains(text(), 'Save')])));//Указываем что ждем ссылку с текстом "Save"

  • 0

:smile:


#8 appmen

appmen

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

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 01 декабря 2015 - 10:47

Предложение:

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

Повторюсь: не "элемент изменит текст на «...»", а "появится элемент с текстом «...»"

То есть достаточно в локатор передать дополнительное условие, что text() = '1', и использовать presenceOfElementLocated(By locator)

 

И не надо изобретать свои велосипеды — главное правильно задать вопрос.

Ну, возможно, я нечётко описал. У меня значения выдёргиваются из базы. Произвожу поиск, в основном, там 1 (но бывает 2 и 3). Элемент после первого появления есть всегда и не исчезает, меняю критерий, появляется большее число. Т.к. элемент не меняет никаких атрибутов, то я использую ожидания, чтобы убедиться, что поиск вернул результат, а потом проверяю. Время поиска 2-40 секунд.

mazik7, так не сработает


  • 0

#9 Petrov.Sergey

Petrov.Sergey

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

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 01 декабря 2015 - 18:05

 

Попробуйте сделать ожидание на существование элемента с конкретным текстом или значением.
Например - ждем ссылку с текстом Save. Для этого просто пишем соответствующий локатор (Как написал все, заметил что Petrov.Sergey это и предлагает :smile:):

WebDriverWait waitLinkSave = new WebDriverWait(driver, TimeSpan.FromSeconds(30));//Ждем 30 секунд, например
waitLinkSave.Until(ExpectedConditions.ElementExists(By.XPath(//a[contains(text(), 'Save')])));//Указываем что ждем ссылку с текстом "Save"

Хотите прикол? Вы ищете по ключевому слову contains(...)

Строка "10568" содержит строку "1".

То есть "10568".contains("1") = true

В Вашем примере ссылка с текстом "Save text" будет найдена (ожидание сработает), но это будет совершенно не тот элемент, который нужен.

 

Топикстартеру нужно точное совпадение.

 

Ну, возможно, я нечётко описал. У меня значения выдёргиваются из базы. Произвожу поиск, в основном, там 1 (но бывает 2 и 3). Элемент после первого появления есть всегда и не исчезает, меняю критерий, появляется большее число. Т.к. элемент не меняет никаких атрибутов, то я использую ожидания, чтобы убедиться, что поиск вернул результат, а потом проверяю. Время поиска 2-40 секунд.

 

1) "произвожу поиск, в основном, там 1 (но бывает 2 и 3)"

Вопрос: как производите поиск?

 

2) "Элемент после первого появления есть всегда и не исчезает. Меняю критерий, появляется большее число."

Вопрос: какой критерий меняете? На что? Откуда появляется большее число? На основании чего оно появляется?

 

3) "Т.к. элемент не меняет никаких атрибутов, то я использую ожидания".

Знаете, со стороны это звучит как "В огороде бузина, а в Киеве дядька"

 

4) "я использую ожидания, чтобы убедиться, что поиск вернул результат"

Ожидание может и не найти элемент, вылетев по таймауту. А точнее, по времени IMPLICITLYWAIT

 

5) "я использую ожидания, чтобы убедиться, что поиск вернул результат, а потом проверяю".

Что проверяете? Что поиск вернул результат? Так за Вас это уже сделало ожидание - либо вернёт найденный элемент (значит, результат есть), либо вылетет (значит, результата нет).

 

6) "Время поиска 2-40 секунд"

40 секунд время поиска?!  :shok:

Переписывайте тест!


  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).

#10 appmen

appmen

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

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 02 декабря 2015 - 09:36

Petrov.Sergey:

1. Ввожу критерий, который приходит из метода, который рандомным образом вытягивает данные

2. Меняю критерий поиска. Зна. поиск, который вернёт 100% больше результат. Данные в базе время от времени меняются и тот поиск, который возвращал 100 результатов завтра может возвращать 10

3. Не понял :(

4. Ожидание найдёт элемент с количеством результатов т.к. он уже есть после первого поиска

5. Да, тут вы правы, но пусть так будет

6. Не тест столько длится, а поиск


  • 0

#11 mazik7

mazik7

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

  • Members
  • Pip
  • 63 сообщений
  • ФИО:Мазик
  • Город:Красноярск

Отправлено 07 декабря 2015 - 06:04

 

 

Попробуйте сделать ожидание на существование элемента с конкретным текстом или значением.
Например - ждем ссылку с текстом Save. Для этого просто пишем соответствующий локатор (Как написал все, заметил что Petrov.Sergey это и предлагает :smile:):

WebDriverWait waitLinkSave = new WebDriverWait(driver, TimeSpan.FromSeconds(30));//Ждем 30 секунд, например
waitLinkSave.Until(ExpectedConditions.ElementExists(By.XPath(//a[contains(text(), 'Save')])));//Указываем что ждем ссылку с текстом "Save"

Хотите прикол? Вы ищете по ключевому слову contains(...)

Строка "10568" содержит строку "1".

То есть "10568".contains("1") = true

В Вашем примере ссылка с текстом "Save text" будет найдена (ожидание сработает), но это будет совершенно не тот элемент, который нужен.

 

Топикстартеру нужно точное совпадение.

Contains можно и не использовать. Я же просто пример привел ибо не нам же додумывать все за топикстартера и ему, и только ему известны все условия =)
И пример же банальный. Можно к примеру прописать путь типа "//div[@id='NuzhniyDiv']//a[contains(text(),'1')]" и счастье будет ближе.

 

Ну а с точным совпадением еще проще - если уж текст и известен к тому же "//div[@id='NuzhniyDiv']//a[text()=10568')]".

 

mazik7, так не сработает

Ужасно :cray: 
Но все же если вы ждете конкретного значения элемента, то нужно плясать как раз в сторону ожидания именно этого конкретного значения. А иначе StaleReferenceException будет преследовать в ночных кошмарах.

 

 

6. Не тест столько длится, а поиск

И вот именно поэтому нужно переписывать. Правда не тест - а поиск. И я так понимаю по истечении 40 секунд он просто вылетает по исключению?

 

Кстати времени много прошло - проблему решили? 


  • 0

:smile:


#12 appmen

appmen

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

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 07 декабря 2015 - 08:36

Так я "проблему решил" ещё вначале топика в 5м сообщении. Текст разный всегда, часто сначала есть "1", но не всегда.

Да, вылетает, но это нормально (типа). Поиск не должен так долго работать в том месте. Но это тестовое окружение, которое не всегда используется только мной.

Если Алексей Баранцев сюда заглянет, то хотелось бы узнать почему именно так реализованы ожидания. :unknw:


  • 0

#13 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 871 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 07 декабря 2015 - 09:27

Можно чуть более подробно описать ситуацию, когда ожидание работает "слишком долго", я из предыдущей переписки не понял, в каком случае это происходит?


  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#14 appmen

appmen

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

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 07 декабря 2015 - 14:48

не-не-не, к вам вопрос не в том. Мне интересно знать почему в ExpectedConditions для проверки текста в элементе используется contains, а не equals.


  • 0

#15 TatyanaV

TatyanaV

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

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


Отправлено 08 декабря 2015 - 11:08

А если попробовать:

1. Найти элемент и сохранить его значение (oldValue).

2. Произвести действия, в рез-те которых значение должно поменяться.

3. wait.until найдется элемент с тем же локатором, значение которого НЕ будет равно oldValue


  • 0

#16 appmen

appmen

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

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 08 декабря 2015 - 13:11

А если попробовать:

1. Найти элемент и сохранить его значение (oldValue).

2. Произвести действия, в рез-те которых значение должно поменяться.

3. wait.until найдется элемент с тем же локатором, значение которого НЕ будет равно oldValue

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

Пример: выдало 1 результат поиска, я обновил поиск и выдало 123 результатов. Ожидание будет думать, что количество не поменялось. Это происходит из-за условия contains.


  • 0

#17 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 871 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 08 декабря 2015 - 13:52

не-не-не, к вам вопрос не в том. Мне интересно знать почему в ExpectedConditions для проверки текста в элементе используется contains, а не equals.

 

Исторически так сложилось :)

 

Долго ли своё ожидание написать? В языках, где поддерживаются лямбда-выражения (включая Java 8), это вообще полстрочки кода.


  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#18 TatyanaV

TatyanaV

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

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


Отправлено 08 декабря 2015 - 14:52

 

А если попробовать:

1. Найти элемент и сохранить его значение (oldValue).

2. Произвести действия, в рез-те которых значение должно поменяться.

3. wait.until найдется элемент с тем же локатором, значение которого НЕ будет равно oldValue

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

Пример: выдало 1 результат поиска, я обновил поиск и выдало 123 результатов. Ожидание будет думать, что количество не поменялось. Это происходит из-за условия contains.

 

А, вероятно я не так понимаю, что именно у вас происходит и что с чем вы сравниваете.

Вы проверяете значение поля с количеством найденных записей?


  • 0



Темы с аналогичным тегами selenium, java, webdriver

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

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