|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
24.10.2018, 03:43 | #1 |
Спокойный псих
Участник клуба
Регистрация: 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. |
24.10.2018, 08:17 | #2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
не нужны потоки, можно просто последовательно.
Если jQuery, то там есть колбеки для ожидания завершения всех ajax, и вроде $.active Парсите библиотекой типа HtmlAgilityPack.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
24.10.2018, 23:39 | #3 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Хех, итого что имеет то имеем ...
В селениуме походу просто нет такого как "ждать завершения любой активности", отсюда получаем такие вот вещи - под каждую задачу приходится тратить время на организацию ожидания уникальных условий, а в итоге Что же, пичалька, но жизнь продолжается =)
Подпись ? Не, не слышал ...
|
24.10.2018, 23:51 | #4 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Так я ж сказал, просто парсите библиотеками для парсинга HTML, а не indexOf.
А активность может никогда не кончаться. Аналитика, таймеры, анимация, вебсокеты, ...
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
25.10.2018, 00:07 | #5 | |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Цитата:
А это уже моя лень изучать библиотеку прежде чем не получится так как уже умею, + на досуге поискать чего нибудь что могло бы мне помочь. Так например я сначала думал парсить XML при помощи IndexOf, но при изучении встроенных методов и классов оказалось, что проще использовать их же; и опять же НО - как я понимаю, указанная вами библиотека не встроенная, отсюда добавляется ещё один повод для лени ... =)
Подпись ? Не, не слышал ...
|
|
25.10.2018, 07:56 | #6 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
На странице слайдер, который крутит картинки. Страница меняется? На странице счётчик, который показывает, сколько или кто сейчас онлайн через AJAX/Страница меняется? На странице контент, который подгружается, по мере пролистывания (бесконечные страницы, а la vk.com). Страница меняется? На странице кнопка, которая добавляет какие-то элементы по запросу пользователя. Страница меняется? На странице кнопка поиска, которая добавляет какие-то элементы по запросу пользователя. Страница меняется? Примеров достаточно? p.s. имхо, задача не имеет решения в общем случае, нет универсального инструмента, но задача может быть решена в каждом конкретном случае - изучив конкретную страницу, её код и что нужно сделать, чтобы получить то, что нужно именно Вам. Последний раз редактировалось Serge_Bliznykov; 25.10.2018 в 07:58. |
|
25.10.2018, 08:16 | #7 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Цитата:
И там по сути 2 функции: LoadHtml и SelectNodes/SelectSingleNode по XPath.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
|
25.10.2018, 10:26 | #8 | |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Цитата:
У меня в студии подтягивалка исходников/библиотек либо не работает, либо работает криво, и отказывается качать библиотеку из за каких то там проблем с совместимостью чего то там. Я так себе ClosedXML не мог скачать. Пошёл в GitHub, скачал исходники, давай компилировать, а у меня было около 50 ошибок синтаксиса. На этом же Github скомпилированных решений я не встречал ни разу, не только в случае с ClosedXML. Либо плохо искал, либо этого там попросту нет. В итоге я скачал готовую библиотеку с какого то левого сайта, и на этом мой путь по решению задачи "взять и скачать" named-бибиотеку закончился. Вот теперь можно говорить о "дико сложно", как о том, что мне просто хотелось бы как то по проще, и желательно "из коробки". Это я знаю, так вообще можно решить абсолютно любую задачу ... Но всё же, я ищу методы, сам их реализую, складирую и "на повторное использование". Одни и те же методы где-то могут использоваться, а где то не могут. Например, приведённые вами примеры мне ещё не приходилось парсить на предмет каких либо собираемых данных, а сильно перегруженный интерфейс часто проще отпарсить всё тем же IndexOf+Substring, когда у меня в переменной string "снимок состояния", который кстати не меняется. Вот и решение: не нужно ждать завершения, нужно спереть исходник, и парсить уже его =).
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 25.10.2018 в 10:54. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |