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

Практикум по тест-дизайну 2.0
онлайн, начало 20 cентября
Python для начинающих
онлайн, начало 25 сентября
Первый Онлайн ИНститут Тестировщиков
онлайн, начало 23 сентября
Тестирование REST API
онлайн, начало 23 сентября
Фотография

Одна такая мегаглавная проблема Selenium Webdriver, Selenium - отстой?

Selenium webdriver тестирование автотесты

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

#1 Stormer

Stormer

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Gig Igor


Отправлено 08 Декабрь 2017 - 11:07

Всем привет, кто-нибудь может мне внятно объяснить, почему selenium-овский wait.until не может найти элемент на странице в течение 5/10/60/300 секунд, если элемент с таким локатором по факту на странице присутствует?

 

Я постоянно вижу, как все с этим воюют.

 

Почему конструкция вида

while (true) {
elements = driver.findElements(локатор).first

if (elements.size > 0)
 break
else
 sleep полсекунды
}

преспокойно найдёт элемент, когда он появится на странице, а стандартный wait.until нет? Хоть каждый wait.until в проекте переписывай этой конструкцией. При этом даже в лог он пишет что-то вроде:

tried to find element for 60 seconds with 500 ms interval.

 

Т.е. он должен быть идентичен ПОЛНОСТЬЮ конструкции выше (если только в ней условие сделать while (пока не прошло 60 секунд) ).

А по факту нет.

 

Неужели так сложно переписать wait.until и сделать нормальную реализацию. Или я чего-то просто не понимаю. Пожалуйста, объясните.

Ибо такая проблема далеко не только у меня.


  • 0

#2 barancev

barancev

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

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


Отправлено 08 Декабрь 2017 - 11:36

Реальный пример такой страницы, элемента, локатора и неудачного использования конструкции wait.until покажете?
И уточните, о реализации Selenium на каком языке идёт речь.

  • 0

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


#3 TatyanaV

TatyanaV

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

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


Отправлено 08 Декабрь 2017 - 12:15

Wait.until в принципе не должен быть идентичен driver.findElements(локатор).first. По определению.

driver.findElements(локатор).first просто ищет по локатору (в каком состоянии этот элемент без разницы, главное, чтобы локатору соответствовал). В wait.until - есть ещё какое-нибудь (неуказанное Вами в сообщении) условие.

 

К примеру, если Вы ждётё, пока элемент станет кликабельным - вполне может быть так, что сам элемент на странице уже есть (driver.findElements(локатор).first его найдет), но кликабельным он так и не становится, т.к., к примеру, перекрыт другим элементом (wait.until его кликабельности может и не дождаться).

 
Хотя пожелание есть и у меня - чтобы в джавовской реализации elementToBeClickable не падал с ошибкой "other element would recieve...". Я знаю, что other element, я и хочу ожиданием elementToBeClickable дождаться, пока по элементу кликнуть можно. Вне зависимости от того, по какой причине этого сделать нельзя до какого-то момента.
Либо, чтобы "other element would recieve..." было отдельным экспешеном (который можно было бы добавить к игнорируемым), а не общим WebDriverException.

  • 0

#4 Spock

Spock

    Гуру

  • Members
  • PipPipPipPipPipPip
  • 1 537 сообщений
  • ФИО:Роман

Отправлено 08 Декабрь 2017 - 12:48

 

Хотя пожелание есть и у меня - чтобы в джавовской реализации elementToBeClickable не падал с ошибкой "other element would recieve...". Я знаю, что other element, я и хочу ожиданием elementToBeClickable дождаться, пока по элементу кликнуть можно. Вне зависимости от того, по какой причине этого сделать нельзя до какого-то момента.

Либо, чтобы "other element would recieve..." было отдельным экспешеном (который можно было бы добавить к игнорируемым), а не общим WebDriverException.

иногда веб-драйвер "промахивается" с координатами из-за того что страница прорисовывается

 

например элемент отобразился и кликабелен но ещё "не на своём месте", функция вернула значение (определила координаты элемента), а элемент тут же подвинулся на своё место в процессе прорисовки страницы. Но клик будет по старым координатам - можно увидеть это на скриншоте по координатам из "other element would recieve..."

 

помогает "скрольнуть" страницу через вызов джаваскрипта


  • 0

#5 TatyanaV

TatyanaV

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

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


Отправлено 08 Декабрь 2017 - 13:06

 

 

Хотя пожелание есть и у меня - чтобы в джавовской реализации elementToBeClickable не падал с ошибкой "other element would recieve...". Я знаю, что other element, я и хочу ожиданием elementToBeClickable дождаться, пока по элементу кликнуть можно. Вне зависимости от того, по какой причине этого сделать нельзя до какого-то момента.

Либо, чтобы "other element would recieve..." было отдельным экспешеном (который можно было бы добавить к игнорируемым), а не общим WebDriverException.

иногда веб-драйвер "промахивается" с координатами из-за того что страница прорисовывается

 

например элемент отобразился и кликабелен но ещё "не на своём месте", функция вернула значение (определила координаты элемента), а элемент тут же подвинулся на своё место в процессе прорисовки страницы. Но клик будет по старым координатам - можно увидеть это на скриншоте по координатам из "other element would recieve..."

 

помогает "скрольнуть" страницу через вызов джаваскрипта

 

У меня именно "Other element" - дизейблится все, а сверху окошко "Подождите" или "Загрузка". Т.е. я о ситуации, когда элемент никуда не двигается, а на самом деле временно перекрыт другим.

Скролл то к элементу у меня есть.


  • 0

#6 Spock

Spock

    Гуру

  • Members
  • PipPipPipPipPipPip
  • 1 537 сообщений
  • ФИО:Роман

Отправлено 08 Декабрь 2017 - 13:23

 

У меня именно "Other element" - дизейблится все, а сверху окошко "Подождите" или "Загрузка". Т.е. я о ситуации, когда элемент никуда не двигается, а на самом деле временно перекрыт другим.

Скролл то к элементу у меня есть.

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


  • 0

#7 Stormer

Stormer

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Gig Igor


Отправлено 08 Декабрь 2017 - 13:46

 

Реальный пример такой страницы, элемента, локатора и неудачного использования конструкции wait.until покажете?
И уточните, о реализации Selenium на каком языке идёт речь.

 

Пример страницы показать не могу, т.к. это пишется под страницы во внутренней локальной сети.

Но версии скажу: selenium под ruby. Версии: 2.53.4, 3.0.0, 3.0.0.beta.2.1,

ruby 2.2.0.

 

Локаторы в общем стандартные - где-то xpath, где-то css. Максимально короткие. В которые в качестве параметра подставляется, к примеру, текст. Или имя класса.

Это я к тому, что нет такого, что в многоэтажном локаторе что-то изменилось, а я не заметил.

 

Извиняюсь, я мб сгустил краски тем, что не написал, что падает в таких случаях все же не чаще одного из 10 раз. А то и реже. Но, тем не менее, может упасть.

 

Татьяна, wait.until я как раз делаю на visibility, например так:

element = @wait.until {
   element = @driver.find_elements(css: "td>a, td>span").
      select{|e| e.displayed? && e.text == menu_text}.first
        ....
}

Алексей, ну вот например такой код. Если этот wait.until бывало менял по схеме, описанной выше, то после такого уже всегда железно находился элемент.

Такое ощущение, что wait.until берет какой-то самый начальный "снимок" страницы и пытается в нём искать в течение всего таймаута.


  • 0

#8 TatyanaV

TatyanaV

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

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


Отправлено 08 Декабрь 2017 - 13:59

Татьяна, wait.until я как раз делаю на visibility, например так:

element = @wait.until {
   element = @driver.find_elements(css: "td>a, td>span").
      select{|e| e.displayed? && e.text == menu_text}.first
        ....
}

Visibility отнюдь не гарантирует, что с элементом можно работать.

В моём примере - элемент виден, но кликнуть в него нельзя, т.к. все элементы страницы заблокированы элементом "Загрузка" (хотя визуально он маленький - по факту перекрывает всю страницу).

Я вообще не использую ожидание, пока элемент станет виден, т.к. это можно произойти раньше, чем с ним можно будет начать работать. Собираюсь кликать/редактировать - так и жду пока можно будет кликнуть.


  • 0

#9 barancev

barancev

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

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


Отправлено 08 Декабрь 2017 - 14:45

Во-первых, говорить про умозрительные "внутренние страницы" нет смысла. Сделайте на https://jsbin.com/ пример страницы, на котором проблема воспроизводится, или найдите где-то на публичном сайте такой пример, на котором можно продемонстрировать проблему.
 
Во-вторых, версия 3.0.0 вышла два года назад, с тех пор были сотни багов исправлены, может быть и ваша проблема в их числе.
 
В-третьих, несложно посмотреть, как именно реализована функция wait.until -- там внутри именно такой цикл, как Вы описали: https://github.com/S.../common/wait.rb
 
Поэтому рассуждения в стиле "неужели нельзя нормально сделать" не имеют смысла. Оно и так "нормально сделано". Если что-то не работает -- давайте конкретный пример и будем разбираться, почему именно он не работает.

  • 2

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


#10 Stormer

Stormer

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Gig Igor


Отправлено 08 Декабрь 2017 - 15:49

 

Во-первых, говорить про умозрительные "внутренние страницы" нет смысла. Сделайте на https://jsbin.com/ пример страницы, на котором проблема воспроизводится, или найдите где-то на публичном сайте такой пример, на котором можно продемонстрировать проблему.
 
Во-вторых, версия 3.0.0 вышла два года назад, с тех пор были сотни багов исправлены, может быть и ваша проблема в их числе.
 
В-третьих, несложно посмотреть, как именно реализована функция wait.until -- там внутри именно такой цикл, как Вы описали: https://github.com/S.../common/wait.rb
 
Поэтому рассуждения в стиле "неужели нельзя нормально сделать" не имеют смысла. Оно и так "нормально сделано". Если что-то не работает -- давайте конкретный пример и будем разбираться, почему именно он не работает.

 

 

Алексей, спасибо за ответы! Хорошо, если воспроизведу, отпишусь. Но если и правда реализовано, как я описал, то, видимо, это у нас с кодом что-то не то.

Татьяна, ну да, такие спаны я обхожу ожиданием, пока этот спан исчезнет. Вроде норм.

 

А конкретно у нас шаги бывало сваливались, когда выбираешь меню, выдвигается подменюшка. И в этой подменюшке надо что-то выбрать.

Так вот она выдвигается очень быстро всегда. Но бывали случаи, когда тормознула, по-видимому, больше, чем на полсекунды. Это даже реже, чем 1 из 100 раз.

 

Но было как-то. И вот после такого, у меня wait.until не смог найти на выдвинутой менюшке item как-то раз. Не встречали такое?

Или в таких ситуациях одним wait.until нельзя обходиться?


  • 0

#11 TatyanaV

TatyanaV

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

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


Отправлено 09 Декабрь 2017 - 22:02

Но было как-то. И вот после такого, у меня wait.until не смог найти на выдвинутой менюшке item как-то раз. Не встречали такое?

Или в таких ситуациях одним wait.until нельзя обходиться?

 

То, что Вы пишите выглядит примерно как "у меня проблема с машиной, в чем причина?".

Из такого сообщения не понятно, что за проблема? Не заводится / заводится, но не едет / едет, но странные звуки из двигателя идут и т.п.

 

Что означает "wait.until не смог найти"? Там ведь много различных эксепшенов.

Wait.until = это ожидание определенного состояния. Из Вашего сообщения сложно предположить, какое именно состояние Вы ожидали, какой локатор использовали, с какой ошибкой в итоге упал скрипт. И т.д.


  • 0

#12 SergeyQA

SergeyQA

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

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Пронякин Сергей
  • Город:Москва

Отправлено 11 Декабрь 2018 - 16:26

Коллеги, всем здравствуйте!
Слишком много времени потерял на решение проблемы. Увидел, что тема очень похожая и решил напиать.
Проблема такая: вебдрайвер не может найти на странице элемент, если функция отрабатывает не в первый раз. 
Поясню.
Есть страница интернет магазина с категориями товаров: https://www.auchan.r.../kosmetika.html
На этой странице есть подкатегории. Мне нужно кликнуть любую из них (я кликаю первую для простоты). http://joxi.ru/52aBL6lt47xo7A
Далее идет оформление заказа.
Есть тест с набором тесткейсов. Первый тесткейс проходит успешно. То есть я захожу в категорию и кликаю первую попавшуюся подкатегорию.
После оформления заказа на дом, мне нужно сделать заказ в магазин - это второй тесткейс.
Так вот на втором тесткейсе драйвер не может найти подкатегорию! Сценарии абсолютно идентичны до перехода на чекаут! Локатор тот же самый.
Я уже перепробовал все, что можно. И по CSS искал, и по XPATH,  и find_elements, и  find_element,  и waint.until(presence_of_element_located, и даже искал все, а потом кликал рандомный - все работает в первый раз, но отваливается по таймауту во второй раз (если wait использовать) или сразу падает с эсепшеном, что не может найти элемент (если использовать find_element)...
Если принудительно обновить страницу, то сразу же элемент находится. Но при этом, на странице подкатегории он уже не может перейти в карточку товара. Если обновить, то найдет.. и так до конца сценария! 
Хочу заметить, что иногда (1 раз из 20 может), элемент все же находится и во второй раз.
Вот один из примеров кода:

self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div[class="category__item-title"] a'))).click()

webdriver chrome 2.45 (пробовал откатывать до версий 2.44, 2.43, 2.42 - все тоже самое)
chrome  71.0.3578.80 (Официальная сборка), (64 бит)
python 3.5

В чем же может быть дело? Раньше такого не наблюдал - это как-то сломалось и я не смог отследить в какой момент. Предполагаю, что это после смены версии браузера..


  • 0


Инструменты тестировщика: Командная строка
онлайн
Практикум по тест-дизайну 2.0
онлайн
Программирование на Phyton для тестировщиков
онлайн
Тестирование производительности (JMeter)
онлайн




Темы с аналогичным тегами Selenium, webdriver, тестирование, автотесты

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

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

Яндекс.Метрика
Реклама на портале