Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2018, 03:43   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Selenium, ждать пока на странице прекратится любой JS

Здравствуйте.
Я гуглил подобный вопрос, везде рекомендуют "ждать завершения своей обработки", или "ждать нужные данные" всё такое.
Но у меня случаются ситуации, когда допустим нужно вытащить нужные данные как только страница была загружена (драйвер передаёт управление в пользовательский код). Но, это не всегда означает, что на странице ничего не происходит, тот же document.ready ...

Но если на него можно повесить Wait, то вот повесить всё тот же Wait для потоков, которые создаются в том же document.ready - уже не так то и просто, разве что парсить JS на списки функций, и под каждую создавать Wait (и каждый Wait выполнять в отдельном потоке программы). Сюда же можно добавить всё те же потоки, которые создаются в процессе работы с загруженной страницей - всё это только усложняет задачу.

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


Дальше пример, можно не читать ...

В последнем случае, который у меня возник, мне нужно было вытаскивать нужный текст, и самый простой способ - парсить PageSource, так как локаторы динамические, и их несколько одинаковых.
Так как на странице после загрузки продолжает что то меняться - парсинг исходника вызывает сдвиги по текстам, так как IndexOf даёт индекс строки, который тут же должен измениться при выбрасывании чего либо в исходник страницы из JS.
Так как в данном случае я на 100 % уверен в том, где и какие данные должны быть - я прописал ожидание совпадения с набором имеющихся данных (поиск по массиву всех возможных вариантов).
Но, раньше было и такое, что набора данных нет (или его нужно достать при помощи того же Selenium), сравнивать не с чем, и ошибочные выполнения приходилось заделывать руками, это при том, что в нужных местах прописывались слоновые задержки в 5-10 секунд, а это, к слову, только увеличивает время выполнения задачи, и увеличивает не оправдано.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 24.10.2018 в 03:46.
OmegaBerkut вне форума Ответить с цитированием
Старый 24.10.2018, 08:17   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
(и каждый Wait выполнять в отдельном потоке программы)
не нужны потоки, можно просто последовательно.

Если jQuery, то там есть колбеки для ожидания завершения всех ajax, и вроде $.active
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
парсинг исходника вызывает сдвиги по текстам, так как IndexOf
Парсите библиотекой типа HtmlAgilityPack.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.10.2018, 23:39   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Хех, итого что имеет то имеем ...
В селениуме походу просто нет такого как "ждать завершения любой активности", отсюда получаем такие вот вещи - под каждую задачу приходится тратить время на организацию ожидания уникальных условий, а в итоге
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
все необходимые "ожидания" прописаны только ближе к концу выполняемой задачи
Что же, пичалька, но жизнь продолжается =)
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 24.10.2018, 23:51   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так я ж сказал, просто парсите библиотеками для парсинга HTML, а не indexOf.

А активность может никогда не кончаться. Аналитика, таймеры, анимация, вебсокеты, ...
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.10.2018, 00:07   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А активность может никогда не кончаться. Аналитика, таймеры, анимация, вебсокеты, ...
Я тоже об этом думал, и первая мысль - "избирательная активность", при которой необходимо следить лишь за изменениями в исходном коде страницы. Но это совсем другая история. Например, каждую секунду складывать исходник в массив, и когда будет достигнуто условие последние N добавленных исходников одинаковые - тогда считаем что активность на данный момент закончилась. При этом N может быть в принципе любым.
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
просто парсите библиотеками для парсинга HTML, а не indexOf
А это уже моя лень изучать библиотеку прежде чем не получится так как уже умею, + на досуге поискать чего нибудь что могло бы мне помочь.
Так например я сначала думал парсить XML при помощи IndexOf, но при изучении встроенных методов и классов оказалось, что проще использовать их же; и опять же НО - как я понимаю, указанная вами библиотека не встроенная, отсюда добавляется ещё один повод для лени ... =)
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 25.10.2018, 07:56   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
и когда будет достигнуто условие последние N добавленных исходников одинаковые
на странице таймер, который показывает время какой-то акции. Страница меняется?
На странице слайдер, который крутит картинки. Страница меняется?
На странице счётчик, который показывает, сколько или кто сейчас онлайн через AJAX/Страница меняется?
На странице контент, который подгружается, по мере пролистывания (бесконечные страницы, а la vk.com). Страница меняется?
На странице кнопка, которая добавляет какие-то элементы по запросу пользователя. Страница меняется?
На странице кнопка поиска, которая добавляет какие-то элементы по запросу пользователя. Страница меняется?

Примеров достаточно?

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

Последний раз редактировалось Serge_Bliznykov; 25.10.2018 в 07:58.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.10.2018, 08:16   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
и опять же НО - как я понимаю, указанная вами библиотека не встроенная, отсюда добавляется ещё один повод для лени
Ну да, открыть NuGet и написать "html" это дико сложно.
И там по сути 2 функции: LoadHtml и SelectNodes/SelectSingleNode по XPath.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.10.2018, 10:26   #8
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну да, открыть NuGet и написать "html" это дико сложно.
И там по сути 2 функции: LoadHtml и SelectNodes/SelectSingleNode по XPath.
Я упираюсь в условный "барьер" под названием "лень" ... Дело не в "дико сложно", а в ситуации.
У меня в студии подтягивалка исходников/библиотек либо не работает, либо работает криво, и отказывается качать библиотеку из за каких то там проблем с совместимостью чего то там.
Я так себе ClosedXML не мог скачать. Пошёл в GitHub, скачал исходники, давай компилировать, а у меня было около 50 ошибок синтаксиса. На этом же Github скомпилированных решений я не встречал ни разу, не только в случае с ClosedXML. Либо плохо искал, либо этого там попросту нет.
В итоге я скачал готовую библиотеку с какого то левого сайта, и на этом мой путь по решению задачи "взять и скачать" named-бибиотеку закончился.
Вот теперь можно говорить о "дико сложно", как о том, что мне просто хотелось бы как то по проще, и желательно "из коробки".

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
задача может быть решена в каждом конкретном случае
Это я знаю, так вообще можно решить абсолютно любую задачу ... Но всё же, я ищу методы, сам их реализую, складирую и "на повторное использование". Одни и те же методы где-то могут использоваться, а где то не могут.
Например, приведённые вами примеры мне ещё не приходилось парсить на предмет каких либо собираемых данных, а сильно перегруженный интерфейс часто проще отпарсить всё тем же IndexOf+Substring, когда у меня в переменной string "снимок состояния", который кстати не меняется. Вот и решение: не нужно ждать завершения, нужно спереть исходник, и парсить уже его =).
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 25.10.2018 в 10:54.
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Selenium.WebDriver - Проверить наличие элемента на странице DedPerded C# (си шарп) 2 23.07.2018 13:41
Эвакуации - когда-нибудь научатся отделять мух от котлет или маскарад не прекратится? MihalNik Свободное общение 9 06.10.2017 23:24
Как заставить поток ждать пока браузер завершит свою работу bilibian Общие вопросы Delphi 4 10.11.2015 15:33
Интересная задача, реализация временных логик (любой логики), язык любой. Flyym Помощь студентам 1 05.01.2011 03:10