Null
не встречал такого что после рандом запроса CDP страница намертво виснет?
Нет, с CDP вообще проблем не припомню. Все ситуации которые видел с зависаниями, это либо некорректная обработка waitForDebuggerOnStart у Target.setAutoAttach + Runtime.runIfWaitingForDebugger, либо гонки в вызовах Fetch.continueRequest/Fetch.failRequest (ну или устаревший Network.continueInterceptedRequest) при перехвате запросов.
Sektor
еще иногда ответ не приходит на этот запрос почему-то и все крашится, если повторно слать
Null
ку а проблему с айфреймами на cdp как то решается. кроме как через evulate кликать не как не получится
Конечно решается. Просто нужно написать нормальный алгоритм обхода элементов. Т.е. тебе нужно посчитать оффсеты по x и y самого iframe относительно родительской страницы, и потом внутри iframe посчитать оффсеты x и y, относительно внутренней страницы. И когда сложишь эти оффсеты, получишь глобальные x и y элемента. И тогда уже производишь клик через Input.dispatchMouseEvent/Input.dispatchTouchEvent. Хоть 10 вложений iframe будет, всё работает как надо.
Sektor
а как отслеживать загрузку страницы самым правильным образом? Page.loadEventFired иногда почему-то не срабатывает
Null
а как отслеживать загрузку страницы самым правильным образом? Page.loadEventFired иногда почему-то не срабатывает
Если страница загрузилась то событие сработает. Если не грузится, в браузере будет постоянно индикатор загрузки страницы идти, значит разработчики сайта что-то накосячили и страница не завершает свою загрузку, но пользоваться ей можно. Там обычно нужно цепляться на какой-то запрос или появление нужного элемента. Ну это редкие кейсы, и нужно смотреть по месту.
Null
И то, если тайматы стоят, то будет ошибка, а если ты таймауты отключил, то можно никогда не дождаться окончания. Поэтому таймауты лучше выставлять разумные.
Null
да таймауты ставлю конечно
Ну ещё бывает что страница висит на каком-нибудь заблокированном ресурсе, обычно какой-нибудь js-скрипт или шрифт, который браузер вытянуть не может, если они тебе не нужны и это систематически происходит, то можно заблокировать их загрузку изначально, или возвращать локальную копию ресурса или пустую заглушку, если не хочется портить порядок загрузки страницы.
Null
Я, к примеру, раньше блокировал все картинки, и в большинстве случаев это работало, но некоторые сайты на событие onerror при загрузке картинок выполняют какие-то действия, репорты шлют или ещё что. Я теперь вместо блокировки отдаю пустые картинки-заглушки и проблем больше не возникает.
Null
вот кстати при блокировке, ты fetch каждый раз точечно врубаешь/вырубаешь? или с ним можно не заморачиваться врубить и все
Всегда работает перехват. Я многие вещи именно на перехват запросов вешаю, а не на появление элементов на странице. Так надёжнее.
Null
в многопотоке лагов никаких нет?
Нет. Да и не понятно откуда им взяться там. Даже если бы браузер выполнял сотни запросов в секунду, там же всего лишь проверка URL обычно идёт. И только если URL совпадает с нужным, уже можно тело ответа запрашивать.
Sektor
дада точно там же patterns шлется, это не network.enable где хреначит сразу все подряд, наверное попроще должно быть
Sektor
просто заморачиваюсь, у меня стойкое ощущение что при программироовании надо сразу стараться все правильно и четко делать чтобы в дальнейшем проблем избежать
Null
Хотя, может ты параллельно много страниц запускаешь в одном браузере. Я так не делаю. У меня браузер ведёт себя так же как ведёт себя обычный юзер, работает с одной вкладкой за раз. Если нужно много страниц обработать, то запускаю много браузеров.
Sektor
Хотя, может ты параллельно много страниц запускаешь в одном браузере. Я так не делаю. У меня браузер ведёт себя так же как ведёт себя обычный юзер, работает с одной вкладкой за раз. Если нужно много страниц обработать, то запускаю много браузеров.
да тоже, только вот единственно когда с одной страницей тухло могу новую открыть вкладку, но это не всегда. Правда почему-то заметил когда делаю Page.close почему-то весь браузер закрывается...
Null
Добавь проверку, если осталась одна страница, то не закрывать её.
Sektor
Если это последняя страница, то он закрывает его.
не, первая по идее, логика такая что я по ws именно к странице коннекчусь, затем если есть необходимость делаю Target.createTarget и получаю targetId от ws новой страницы, соответственно на текущем соединении делаю Page.close и затем реконнект к новому урлу
Sektor
или это колхозный метод? правильным будет сразу коннектиться ко всему браузеру а страницами через sessionId управлять?
Null
да тоже, только вот единственно когда с одной страницей тухло могу новую открыть вкладку, но это не всегда. Правда почему-то заметил когда делаю Page.close почему-то весь браузер закрывается...
Так я тоже открываю несколько вкладок, просто перед тем как сделать что-то на странице - "переключаюсь" на неё. А некоторые откроют 10 вкладок и в каждой параллельно что-то делают. На каких-то сайтах можно и так, но не всегда будет корректно работать.
Sektor
старое отключил новое подключил
Null
ну вот разные ws соединения и все))
Так если ты делаешь клик, и в это время открывается новая страница, как ты узнаешь что она создалась?
Sektor
Так если ты делаешь клик, и в это время открывается новая страница, как ты узнаешь что она создалась?
ну я делаю запрос Target.createTarget, ловлю на него ответ - паршу targetId, если он спарсился страница создалась
Null
ну я делаю запрос Target.createTarget, ловлю на него ответ - паршу targetId, если он спарсился страница создалась
Это когда сам создаёшь, а если код на странице откроет окно/вкладку?
Sektor
Это когда сам создаёшь, а если код на странице откроет окно/вкладку?
ну в моей кконкретной ситуации нету такого, никакие кнопки не открывают код, да и страницу если я новую открываю значит старая не загрузилась или грузится долго, такое бывает, значит есть смысл попробовать снова на новой вкладке открыть
Sektor
просто помоему если во время загрузки страницы делал переход на новый урл в этой же вкладке то исключения были какие-то. поэтому я решил проще новую открывать в таких случаях
Null
Нужно делать автоаттач + вэйт фор дебаггер, потом цепляешь нужные скрипты и континуэ делаешь. И у паппитира и плэйрайта так сделано, насколько помню. Это позволяет перехватить всё и подменить тот же user-agent или запросы со страницы гарантированно до первого запроса с самой страницы. А иначе есть риск проскальзывания запросов в обход перехватчика.
Sektor
а для чего они (автоаттач + вэйт фор дебаггер)? вот я руками плюсик нажимаю вкладка открывается. Помоему Target.createTarget это тоже самое, открытие вкладки разве не достаточно?
Sektor
Ну если сам открываешь то не надо.
не, я имею ввиду что Target.createTarget идентично тому если бы я сам открыл вкладку руками. А тут еще зазоры какие-то оказывается))
Null
А вообще: 1. Ты повесил перехватчик на основную страницу и потом делаешь переход, в итоге все запросы попадут в перехватчик 2. На странице происходит клик и открывается новая вкладка, или из кода страницы открывается новое окно 3. К моменту когда ты подключишься к странице, может пройти несколько миллисекунд и страница успеет отправить запрос в обход перехватчика
Null
Именно поэтому делается автоаттач с ожиданием дебаггера. Страница гарантированно ничего не сможет отправить. И после того как ты повесишь перехватчики, можно делать континуэ.
Null
И дело не только в перехватчиках запросов, ещё, к примеру, тебе нужно подменить клaсс WebSocket, тебе нужно выполнить свой код до кода страницы. Тот же алгоритм.
Sektor
В моем случае перехватчик как раз перед переходом на целевой урл включается, то есть сначала определяется нужна ли вкладка, если нужна то открывается, а потом уже включается перехватчик (если новая вкладка то по новому ws)
Sektor
а автоаттач и дебагер позволяют делать так что если сама вкладка открывается или при нажатии кнопки чтобы не было "зазора" да?
Null
не открываются слава богу)
Ещё поди и iframe-ы не создаются на странице? :)
Sektor
Ещё поди и iframe-ы не создаются на странице? :)
да вроде все хорошо с фреймами, не знаю не замечал проблем
Null
Тепличные условия. 😄
Sektor
с фреймами как раз у пупетира морока
Sektor
а тут хорошо у каждого фрейма свой ws url
Null
Опять же, если не нужно перехватывать ничего и подменять код, то не проблема.
Sektor
цепляйся и делай что хочешь
Null
а тут хорошо у каждого фрейма свой ws url
Так а в какой момент ты к ним цепляешься?
Sektor
Так а в какой момент ты к ним цепляешься?
ну вот например я знаю что после нажатия кнопки на странице начнет грузиться фрейм с элементами которого мне нужно манипуляции провести я паршу список ws адресов у браузера - там появляется урл нужного фрейма - я коннекчусь - делаю свои дела
Null
ну вот например я знаю что после нажатия кнопки на странице начнет грузиться фрейм с элементами которого мне нужно манипуляции провести я паршу список ws адресов у браузера - там появляется урл нужного фрейма - я коннекчусь - делаю свои дела
Т.е. порядок такой: 1. Создаётся фрэйм 2. Ты цепляешься к нему Значит у тебя будет та же проблема, между 1 и 2 будет зазор, в который страница может делать что-то, чего ты не увидишь. Опять же, это в конкретном случае может не быть проблемой. Зависит от задачи.
Sektor
какая разница коннекчусь я к cdp или нет
Sektor
урл фрейма все равно появится
Sektor
когда будет фрейм
Null
Да, но если цель прехватить управление страницей/фрэймом и внедрить в них код или повесить перехватчик, то нужно делать это до того как хоть один скрипт запустится на странице. А гарантировать ты это сможешь только с паузой для дебага.
Null
какая разница коннекчусь я к cdp или нет
Разница в порядке выполнения.
Sektor
Разница в порядке выполнения.
ну разница в том что в случае cdp если мне нужен перехватчик я могу проебаться, а если мне он не нужен то все заебись. Ну как я понял
Null
Например, ты знаешь что код на странице лезет в какой-нибудь канвас апи и что-то проверяет. Чтобы это обойти, тебе нужно что-то одно: 1. Повесить перехватчик на запрос, и когда страница его сделает, нужно будет перехватить отправляемые данные и подменить их, но если используется какое-то шифрование/обфускация, тебе придётся весь клубок распутывать, чтобы знать что подменить и как правильно всё пошифровать 2. Подменить вызов канвас апи и сразу вернуть то что должно возвращаться, для этого нужно внедрить свой код в страницу до того как выполнится первый код на странице
Sektor
Ну это уже высший пилотаж)) мне бы для начала просто узнать что сайт в каком-то месте лезет в канвас апи или куда-то
Null
Ну это уже высший пилотаж)) мне бы для начала просто узнать что сайт в каком-то месте лезет в канвас апи или куда-то
Для этого, очевидно, тоже нужно внедрить свой JS в страницу до того как страница попытается выполнить свой код :)
Sektor
Для этого, очевидно, тоже нужно внедрить свой JS в страницу до того как страница попытается выполнить свой код :)
А для этого надо в js хорошо шарить чтобы свой код написать которое будет палить такое)
Лешка
а ну мне проще я на ноде)
Sektor
да на других языках прришлось бы вникаать с нуля
Sektor
а тут я хоть ккакието знаю моменты базовые
Sektor
всякие методы как что делать
Null
А для этого надо в js хорошо шарить чтобы свой код написать которое будет палить такое)
Погугли что-то вроде js function/class wrapper. Можно через Proxy, можно напрямую.
Sektor
Спасибо
Null
Вообще там просто всё, сохраняешь ссылку на оригинальную функцию, потом пишешь свою и подменяешь оригинал. При вызове враппера, делаешь свои задачи, а потом вызываешь оригинальную функцию.
Null
Ну а дальше опыт только. Потому что существуют способы как коду на странице понять что его дурят и что ему подсовывают врапер а не оригинал. Но есть способы и это спрятать от кода страницы. Можешь начать с стэлс плагина.
Null
https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth