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

Фотография

Одна такая мегаглавная проблема 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 871 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


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

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

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

#3 TatyanaV

TatyanaV

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

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


Отправлено 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 772 сообщений
  • ФИО:Роман

Отправлено 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
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 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 772 сообщений
  • ФИО:Роман

Отправлено 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
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 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 871 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 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
  • 388 сообщений
  • ФИО:Воробьева Татьяна


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

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

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

 

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

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

 

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

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


  • 0

#12 SergeyQA

SergeyQA

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

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

Отправлено 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



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

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

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