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

Фотография

Как быстро подсчитать количество всех элементов на странице?


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

#1 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

Добрый день, коллеги!

 

Пишу на java тесты с использованием Selenium Webdriver.

Мне нужно подсчитать количество всех элементов на странице.

Если использовать driver.findElements(By.cssSelector("*")).size(), то эта функция отрабатывает примерно за 4-5 секунд, когда количество элементов около 3000.

5 секунд для меня - очень много, т.к. приходится использовать эту функцию много раз.

Из Selenium IDE подсчет такого же количества элементов занимает на порядок меньше.

 

Готов предположить, что java вначале формирует массив со всеми этими 3000 вебэлементами, а затем уже вычисляет размер этого массива.

Из-за этого и такая "тормознутость".

 

Вопрос: можно ли как-то существенно ускорить подсчет количества элементов на странице, когда не надо знать, что это за элементы, а просто важно их количество?

Я здесь вижу лишнюю для себя операцию - формирование массива со всеми элементами. Хочу этого избежать.


  • 0

#2 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

В Selenium IDE подсчет 2753 элементов занимает 16 миллисекунд.

Java тратит время на два порядка(!!!) больше.

 

Я хочу, чтобы Java считала так же быстро, как и Selenium IDE.


  • 0

#3 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

Сейчас только подсчитал и ужаснулся. В тесте мне нужно выполнить такой подсчёт примерно 1500 раз. Общее время выполнения задачи в Selenium IDE составило бы 30 секунд. Это не время на такой объём.

А Java потратит на это 3000 секунд или 50 минут. Катастрофа :(


  • 0

#4 barancev

barancev

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

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


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

Если проблема именно в том, что массив элементов слишком большой, тогда поможет такой способ:

 

driver.executeScript("return document.querySelectorAll('*').length")

 

Но нужно иметь в виду, что WebDriver (на Java) общается с браузером по сети, так что всё равно такой скорости, как в Selenium IDE, добиться не удастся никак.


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

#5 asolntsev

asolntsev

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

  • Members
  • Pip
  • 64 сообщений
  • ФИО:Андрей Солнцев
  • Город:Таллинн

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

Можно посчитать количество элементов не в java, а на стороне браузера с помощью JavaScript.

Типа int count = executeJavascript("return $('*').length;");

НО
У меня возникает большущий вопрос: НАФИГА? Я думаю, что это плохая идея, и вашу задачу надо решать по-другому.
  • 0

#6 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

Можно посчитать количество элементов не в java, а на стороне браузера с помощью JavaScript.

Типа int count = executeJavascript("return $('*').length;");

НО
У меня возникает большущий вопрос: НАФИГА? Я думаю, что это плохая идея, и вашу задачу надо решать по-другому.

 

Попытаюсь для начала ответить на вопрос "НАФИГА", потому что, надеюсь, что вы мне подскажите другое решение.

Есть сайт, который работает на Ajax-запросах. У меня проблемы с корректным ожиданием конца загрузки popup-окон.

Нажимается кнопка, страница не перегружается, элементы остаются прежними, просто появляется всплывающее сообщение не в виде отдельного окна или alert-окна, а в виде появления на странице нового div, который содержит сообщение и который имеет соответствующий стиль.

Я не знаю, как мне дождаться полного формирования этого элемента.

Ориентироваться по появлению определённого элемента внутри всплывающего окна - это неверное решение. Я пробовал. Потому что этот элемент может появиться раньше, чем догрузятся остальные элементы всплывающего окна. И если, допустим, мне нужно нажать на кнопку "ОК", то этого нажатия не происходит, потому что Selenium пытается кликать на "ОК" до того, как полностью догрузится всплывающее окно.

Ожидать конца загрузки страницы бесполезно, т.к. страница не перегружается.

 

Я поступаю тупо: я пишу функцию, которая тупа ждёт, когда количество элементов на странице устаканится.

 

Вот так:

        int NUMOFITEM = 0;    

        while (NUMOFITEM != driver.findElements(By.cssSelector("*")).size()) {
            NUMOFITEM = driver.findElements(By.cssSelector("*")).size();
            Thread.sleep(300);            
        }

 

Подскажите, пожалуйста, как ещё мне подождать конца загрузки всплывающего окна?

Если, допустим, я хочу написать одну функцию ожидания на все случаи жизни.


  • 0

#7 aksas

aksas

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

  • Members
  • PipPip
  • 130 сообщений
  • Город:Харьков

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

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

Нужна кнопка "ОК" - ждите пока она появиться, нужено еще что-то - ждите пока появится.

 

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


  • 0

#8 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

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

Нужна кнопка "ОК" - ждите пока она появиться, нужено еще что-то - ждите пока появится.

Не вариант, пробовал миллион раз. Не всегда срабатывает. В основном кнопка "ОК" нажимается, но бывает, что не нажимается. А мне нужна стабильность!

Причём это касается даже самых простых окон (текст и одна кнопка "ОК").

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


  • 0

#9 TatyanaV

TatyanaV

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

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


Отправлено 24 декабря 2015 - 12:49

Стиль - точно также, как и айдишник или класс - можно учитывать в селекторах.

Например.

Если Вы дожидаетесь элемента #element (css), но его стиль не успевает измениться, к примеру на 'newstyle' - попробуйте изначально ждать не #element, а #element[style*='newstyle'].

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

 

прим.: *= аналог contains. [style*='newstyle'] найдет и элементы со стилем строга равным указанному, так и элементы, у которых этот текст ПРИСУТСТВУЕТ в стиле, например со стилем вроде 'field-newstyle-selected'.


  • 0

#10 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

В общем, не получилось у меня привязаться к определённому элементу.

Пример: есть всплывающее окно о запросе удаления элемента с кнопками "Да" и "Нет". Я привязался к кнопке "Да". В результате при выводе всплывающего окна кнопка "Да" действительно нажималась, но при этом выдавалась ошибка о том, что нет удаляемого элемента. Как оказалось, после вывода всплывающего окна ещё передвигался фокус на нужный элемент.

Вручную удаление проходило корректно. Если поставить ожидание в секунду, удаление также завершалось успешно.

Но если привязываться только к кнопке "Да", то удаления не происходило, т.к. фокус не успевал передвигаться на нужный элемент.

 

И таких случаев десятки самых разных. Описывать их все - нереально.

Поэтому этот вариант отпал.

 

Потом оказалось, что всплывающие сообщения могут появиться в любом месте. Например, есть форма с кучей полей, у каждого поля всплывающая подсказка.

Поэтому остаётся только первоначальный вариант с подсчитыванием элементов на всей странице.

 

Воспользовался советом из сообщения #4. Результат меня порадовал. Максимум 30 миллисекунд на подсчёт всех элементов на странице.

Это 45 секунд на выполнение 1500 таких подсчётов.

 

Время меня устраивает, поэтому пока оставлю так. :)

        JavascriptExecutor js = (JavascriptExecutor) driver;
        long NUMOFITEM = 0;
        
        while (NUMOFITEM != (Long) js.executeScript("return document.querySelectorAll('*').length;")) {    
            NUMOFITEM = (Long) js.executeScript("return document.querySelectorAll('*').length;");
            Thread.sleep(500);    
        }


  • 0

#11 serjb9

serjb9

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

  • Members
  • Pip
  • 68 сообщений

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

 

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

Нужна кнопка "ОК" - ждите пока она появиться, нужено еще что-то - ждите пока появится.

Не вариант, пробовал миллион раз. Не всегда срабатывает. В основном кнопка "ОК" нажимается, но бывает, что не нажимается. А мне нужна стабильность!

Причём это касается даже самых простых окон (текст и одна кнопка "ОК").

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

 

 

А каким образом пробовали? 


  • 0

#12 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

 

 

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

Нужна кнопка "ОК" - ждите пока она появиться, нужено еще что-то - ждите пока появится.

Не вариант, пробовал миллион раз. Не всегда срабатывает. В основном кнопка "ОК" нажимается, но бывает, что не нажимается. А мне нужна стабильность!

Причём это касается даже самых простых окон (текст и одна кнопка "ОК").

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

 

 

А каким образом пробовали? 

 

 

Тестирую формы Oracle ADF. Допустим есть кнопка "Удалить запись", надо нажать на неё, а затем, когда выдастся всплывающее сообщение, подтвердить удаление нажатием на кнопку "Да".

Допустим, последовательность такая:

1) Кликнуть на "Удалить запись"

2) Подождать, когда появится кнопка "Да"

3) Кликнуть на кнопку "Да".

Запускаю тест. Тест падает на 3-м действии. Пытаюсь повторить тест вручную - все хорошо, ошибки нет. Ставлю паузу между 2-м и 3-м действиями - ошибки нет.

Получается, что ошибка возникает, когда кнопка "Да" уже существует. Значит, происходит "ещё что-то". Возможно, что дело не в стилях, а в ещё чем-то.

 

Или ещё пример: нужно завести клиента.

Последовательность действий:

1) Нажимаем "Создать запись"

2) Ждём, когда появится всплывающее окно с выбором типа клиента

3) Нажимаем на ссылку с нужным типом клиента.

Запускаю тест - все хорошо отрабатывает.

Запускаю тест в пяти параллельных окнах (использую JMeter), половина тестов отваливается на третьем действии - открывается кривая форма.

 

И все такие проблемы появляются именно во всплывающих окнах.

В других местах, например, в раскрывающемся меню - там достаточно "подождать" появления следующего элемента.

 

Элементов на странице много - около 3000. Поэтому даже при появлении маленького всплывающего окна мне сложно отследить, какие изменения происходят в системе.

Пока нашёл "тупое" решение.

Со временем, надеюсь, удастся исследовать проблему подробнее. Например, удастся поймать "событие", которое происходит в конце всех всплывающих окон.


  • 0

#13 TatyanaV

TatyanaV

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

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


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

А как вы проверяете наличие кнопки "да", на которую надо нажать?

Тут может быть несколько вариантов.

1. По выбранному вами локатору в какой-то момент может быть найден другой элемент (возможно - скрытый).

2. Элемент не успевает "найтись".

 

Вы пробовали ждать кнопку через ExpectedConditions (имею ввиду elementToBeClickable)?


  • 0

#14 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

А как вы проверяете наличие кнопки "да", на которую надо нажать?

Тут может быть несколько вариантов.

1. По выбранному вами локатору в какой-то момент может быть найден другой элемент (возможно - скрытый).

2. Элемент не успевает "найтись".

 

Вы пробовали ждать кнопку через ExpectedConditions (имею ввиду elementToBeClickable)?

Нет, в ближайшее время попробую. О результатах обязательно отпишусь - вдруг, поможет.


  • 0

#15 serjb9

serjb9

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

  • Members
  • Pip
  • 68 сообщений

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

Вы пробовали ждать кнопку через ExpectedConditions (имею ввиду elementToBeClickable)?

 

 

Также можно попробовать ExpectedConditions.visibilityOfElementLocated


  • 0

#16 TatyanaV

TatyanaV

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

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


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

 

Вы пробовали ждать кнопку через ExpectedConditions (имею ввиду elementToBeClickable)?

 

 

Также можно попробовать ExpectedConditions.visibilityOfElementLocated

 

Он ведь подозревает, что не успевают отрисоваться стили. Visibility можно только если в локаторах, по которым будут искаться элементы - учтены нужные стили, иначе элемент "найдется" видимым (но возможно - недоступным) раньше, чем надо. И потом, visibility еще не гарантирует, что элемент можно использовать.


  • 0

#17 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

Доброе утро, ребята!

 

С Наступающим!

 

Вчера столкнулся с новыми проблемами.

У меня есть меню:

- Пункт А

- Пункт Б

...

У каждого пункта есть признак "свернуть/развернуть", позволяющий понять, свернуто меню или нет.

Задача: развернуть пункт А и вычислить следующий за ним Пункт С, который может появиться, а может и нет.

Как делаю я: кликаю на пункт А, жду, когда у пункта А признак сменится на "свернуть" (значит, пункт меню раскрылся), а затем вычисляю следующий пункт.

Проблема в том, что при таком подходе у меня неизменно следующим пунктом вычисляется пункт Б. Если же я поставлю задержку хотя бы на секунду, то уже следующий пункт вычисляется правильно - пункт С.

 

Включил инструменты разработчика и увидел, что из сервера ко мне приходит следующий код:

<partial-response>
<changes>
<update id="xxx">
</update>
<update id="xxx">
</update>
***
</changes>
</partial-response>

 

Как я понимаю, браузер получает задание перестроить элементы с определёнными id. В моём случае - id всего div, который отвечает за меню.

В этом полученном коде я вижу "новый" признак "свернуть" пункта А, а также новый пункт меню С, следующий за А.

 

Я не могу понять, как действует мой браузер. Есть несколько вариантов:

1) Удаление старого div с id="xxx" и вставка нового.

Этот пункт отметается сразу, иначе я не получал бы в качестве следующего пункта пункт Б (он бы тупо удалился перед тем, как появился бы А с новым признаком).

2) Вставка нового div с id="xxx" целиком и полностью.

Этот пункт также отметается, потому что я бы получал в качестве следующего пункта пункт С, т.к. он есть в этом новом div.

 

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

 

Ориентироваться по появлению пункта С нельзя, т.к. я не знаю, появится он или нет. Мне нужно именно дождаться полного раскрытия пункта меню А, а дальше уже анализировать результаты, какими бы они ни были.

Ставить паузу в секунду - не вариант, т.к. это "трата времени". К тому же возможен вариант, когда браузер будет тормозить на компе по каким-либо причинам. И тогда этой секунды может не хватить.

Даже моя функция устаканивания - плохой вариант, т.к., опять же, браузер может тормозить и в течении определённого времени число всех элементов на странице может оставаться неизменным.

 

Можно ли как-то проанализировать, что мы получили от сервера? Исходя из этой инфы уже можно было бы построить корректное ожидание.

Есть ли какие-то стандартные функции ожидания, позволяющие понять, что наш браузер закончил построение страницы, после того, как получил от сервера задание её перестроить?


  • 0

#18 ArtemKorsakov

ArtemKorsakov

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

  • Members
  • Pip
  • 50 сообщений
  • ФИО:Артём
  • Город:Москва

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

Извиняюсь, в вышеописанном случае я наврал.

Подмена старого div на новый происходит полностью.

Ставлю на ожидание появления признака "свернуть" у пункта А и тогда корректно вычисляется следующий пункт.

 

В предыдущих случаях у меня не получалось выставить корректное ожидание, видимо, потому, что от сервера приходит требование на обновление нескольких элементов:

<partial-response>
<changes>
<update id="x1">
</update>
<update id="x2">
</update>
***
</changes>
</partial-response>

 

И если мне нужно нажать на кнопку, которая находится внутри элемента с id="x1" и я жду появление этого элемента и кликаю на него, то это происходит после обновления id="x1" в тот момент, когда браузер пытается обновить элемент id="x2", в результате чего и возникают ошибки.

 

В общем, продолжаю исследовать дальше.

 

Пока остаётся открытым очень важный вопрос:

Можно ли как-то проанализировать, что мы получили от сервера?

 

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

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


  • 0


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

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