artem
я просто докинул await к isValid и заработало как швейцарские часы
artem
и еще вопрос
Anonymous
ну и хорошо, что помогло
Anonymous
Хотя, я бы все-равно сделал функцию, тк для меня так удобнее было
artem
вот так isValid выглядит внутри я не стал получать весь контент со тсраницы а решил сделать просто awaitXpath
artem
и если оно не дожидается его в течении одной секунды
artem
то сессия считается невалидной
artem
насколько такое решение надежное
artem
на маленьком колличестве сессий показывает себя нормально
artem
или стоит лучше получить контент страницы и искать там мой селектор?
Anonymous
не могу прям так сказать
Anonymous
затести лучше
artem
вроде все отлично
artem
но я не могу понять когда начинает отсчитываться этот таймаут
artem
после полной загрузки страницы или сразу после редиректа
artem
вроде поставил на 100 мс
artem
все работает также как и с 1с
artem
значит всетаки после полной загрузки?
Назар
после полной загрузки страницы или сразу после редиректа
смотря что в navigate указано. Там есть. waitUntil параметр
Andrey
page.goto у тебя всё делает
artem
т.е все отлично
artem
можно оставить так?
artem
просто я не понимаю зачем тогда waitForNavigation
artem
если page.goto дожидается загрузки
artem
вот это сюда докинул
Andrey
просто я не понимаю зачем тогда waitForNavigation
goto открывает указанный url и ждет окончания прогрузки, а waitForNavigation просто ждет окончания загрузки, например, когда ты программно кликнул на ссылку на сайте
artem
разобрался
artem
спасибо
Alhimik
т.е все отлично
Если искомый элемент сразу присутствует в теле страницы - да. Но если он добавляется/модифицируется после загрузки страницы с помощью JS, то нет. Это нужно смотреть на конкретной странице уже.
artem
объясните в чем проблема, у меня простенький скрипт который открывает сессии по очереди если не дожидается определенного селекторо то закрывает вкладку с ошибкой и переходит к следующей сессии, где-то после десятка итераций начинают дублироваться вкладки браузера
artem
что понятное дело никчему хорошему не приводит
artem
artem
еще есть проблема с тем что вкладка не всегда может прогружаться
artem
и она падает в ошибку
artem
а мне очень важно чтоб каждая вкладка прогружалась
Andrey
в первом catch браузер закрывай
artem
че-то я жестко затупил
Andrey
return там тоже без результата, но не вижу как код вызывающий написан
artem
писал быстро, не ругайтесь сильно
artem
а можно как-то решить проблему с вкладками которые не загружаются?
artem
например трай кетчем
artem
если при попытке перейти на мой юрл пупетир получил ошибку то мы закрываем браузер и снова пытаемся перейти по юрл
Andrey
много чего можно написать... в is valid я бы все падающее обернул в try/catch/finally. Браузер столько раз перезапускать - дорогая операция, посмотри в сторону createIncognitoBrowserContext.
Andrey
а можно как-то решить проблему с вкладками которые не загружаются?
смотря почему не загружаются - таймаут или несколько попыток
artem
смотря почему не загружаются - таймаут или несколько попыток
не таймаутом там не поможешь она сразу в ошибку падает
artem
как нет соединения
Andrey
console.log для исключения e и от этого уже плясать
artem
можно как-то перезагрузить вкладку в пупетире?
Andrey
page.reload
artem
вау там метод есть даже
artem
я думал только если джаваскрип в evaluete выполнять
Alhimik
Зачем ты используешь метку во втором catch? Она же ничего не делает.
Alhimik
Перед page.setUserAgent() поставь await, так как возвращается промис.
Alhimik
Ну и вместо: const page = await browser.newPage(); Можно использовать (уже открытую вкладку): const [page] = await browser.pages();
artem
а можно как-то сделат ьтак чтоб эта первая вкладка не открывалась вместе с браузером?
artem
почему когда я вписываю в консоль $x(мой селектор) я получаю нужный мне массив объектов
artem
а когда делаю тоже пупетиром получаю ничего 😢
artem
Runker
Привет! Столкнулся с такой проблемой. Если передаю в хедере токен сессии, то при открытии страницы ничего не рендерится, в нетворке видно как каждые пару секунд переоткрывается вебсокет-соединение. Пробовал без токена, заполнять форму авторизации, после нее страница нормально загружается.
Runker
Сталкивался кто-то с таким?
Runker
Токен пропихиваю через page.setExtraHTTPHeaders
Runker
Спасибо, попробую
Andrey
Под socks5 с авторизацией какое решение рабочее есть? puppeteer-page-proxy с https пока не получается завести
🦋noteee
Получится ли использовать socks5/4/http(s) прокси как с авторизацией как и без? Слышал, что могут быть проблемы с соксами
Andrey
вчера только наладил
Andrey
нет проблем
Andrey
puppeteer-page-proxy для браузера, socks-proxy-agent для запросов
Tofa
Здравствуйте, подскажите пожалуйста, как мне правильно запарсить список
Alhimik
Здравствуйте, подскажите пожалуйста, как мне правильно запарсить список
const links = await page.evaluate(() => { const nodes = [...document.querySelectorAll("ol.media-list > li > a")]; return nodes.map(n => ({ href: n.href, title: n.textContent })); });
Roman
Ребят, есть спецы по puppeteer в связке mongo, node-scheduller и Docker? Нужно определить в каком месте происходит утечка памяти. У меня запущены 4 парсера основных, 3 из которых парсят HTML. И 1 основной парсер . Который парсит результаты работы указанных 4 сервисов. Даже если подчисту рестартануть Docker и зачистить базы, то через несколько часов начинаются дикие тормоза. Ищу консультанта, который за печеньки смог бы прояснить ситуацию.
Привет. Решился вопрос? На днях в команде решали проблему с дублированием записей в Mongo при использовании findAndUpdate. Оказалось, что эту функцию не нужно использовать с async/await. Может быть в твоём случае причина схожа. Node Scheduler использовали раньше.. но нашли более удобным поднять Jenkins и староовать контейнеры с помощью Sheduled Job
Виктор
Доброй ночи, кто то может подсказать, как подключится к android устройству через puppeteer например в chrome по chrome://inspect/#devices я вижу устройство и могу подключится. Но особо не понимаю как это сделать через puppeteer, где брать ws адрес или что то еще.. Было бы лучше если я заранее еще видел список устройств к которым могу подключится, и выбирать потом.
Alhimik
Потом можно работать как и обычно через connect(), указав эндпонит. Но я сейчас попробовал, не удаётся подключиться именно из puppeteer. Хотя если подключаться напрямую через CDP или через playwright, то всё работает. Вероятно что-то изменилось в новых версиях.
Alhimik
Нашёл 2 ишью, в которых упоминается такая же проблема, и разработчик отвечает что работа с андроидом не является приоритетной. 1. https://github.com/puppeteer/puppeteer/issues/2067 (2018-2019) 2. https://github.com/puppeteer/puppeteer/issues/4937 (2019-2020) Если это действительно нужно, придётся найти проблему самому. Или использовать playwright.