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