Назар
а то что линтер не дает менять параметр то это бред. Типа чистая функция. Если все же нужно без комента, но evaluate подойдет
Назар
вот так
Sander
await page.$eval( titleSelector, (element: any, value) => { // eslint-disable-next-line no-param-reassign element.value = value }, postTitle, )
Sander
не сработало, заголовок не появился
Sander
приложение то SPA, я думаю ты так его не вставишь
Alexey
мне тут интересную статейку показали: https://blog.checklyhq.com/puppeteer-vs-selenium-vs-playwright-speed-comparison/amp/?__twitter_impression=true
Alexey
папетир всех быстрее)
Alexander
8
Alexander
чет бот задумчивый немног)
Ansar
Попытка #2
Pavel
чет бот задумчивый немног)
бывает иногда глючит, еще спамеры иногда настраивают прохождение капчи.
Anonymous
Какие технологии и методы использовать, чтобы парсить динамический сайт(рулетку), которая записывает крайние игры в LAST GAMES, хочу на выходе получить, чтобы скрипт считал последовательность меньше х2, если она например равна 4 , то мне подается уведомление или сигнал. Просмотрел bs4 и requests, но не уверен,что их можно приспособить к динамическому сайту, и постоянное обновление запросов. Или осуществимо? P.S. на фото. Вообщем есть строка LAST games , к которой каждый раз по совершении игры прибавляется еще одно значение.(рандомное от 2x до 100x) Чекал и селениум, но суть в том, что я не знаю, как обновлять постоянно запросы, и чекание последовательностей
Anonymous
Anonymous
Понял, что через папитр можно сделать, но как сделать так, чтобы он брал новое значение каждый раз сам?
Alexey
Понял, что через папитр можно сделать, но как сделать так, чтобы он брал новое значение каждый раз сам?
что если так попробовать: - открыть страницу - потом в цикле (ну через setTimeout) с какой то периодичностью получать обновленное содержимое эл-та, который содержит эту строку LAST GAMES (найти эл-т по селектору) но это будет работать, если логика сайта такая, что он сам дергает в фоне сервер и обновляется
Anonymous
Да он так и работает
Anonymous
Придется обрабатывать это число в сравнении, не равно ли оно предыщему и точно ли новое значение
Владимир
Всем привет. Hairline Feature: missing - можете подсказать почему этот тест не проходит?
Alexey
Придется обрабатывать это число в сравнении, не равно ли оно предыщему и точно ли новое значение
еще можно попробовать "внедрить" на страницу скрипт, который создаст MutationObserver, который подпишется на изменения эл-та с этой строкой. https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver и через него ловить события изменения этого эл-та, а потом "отправлять" на сторону процесса папетира, через функцию-колбек, которую также предварительно зарегистрировать на странице через page.exposeFunction(...)
volond
Доброго времени суток Есть такой вопрос Есть Веб версия 1С Если с ней работать через обычный браузер то там при первом запуске нужно отключить блокировщик всплывающих окон Как это сделать ето через Puppeter
Gambit501
args: ["--disable-popup-blocking", "--allow-popups-during-page-unload"],
Gambit501
но это будет работать вроде как только для режима Headless: False
Gambit501
для True не работает вроде, т.к сам браузер не заточен
Gambit501
https://github.com/puppeteer/puppeteer/issues/5250
volond
Мне все равно Задача стоит потом Открыть отчет вставить данные Сформировать и сохранить локально в Ексель
#свободуНавальному
Привет, как можно фейкнуть порядок HTTP заголовков запроса, что бы воспринимали не как бота?
MC
I don't know. Sorry
Alexander [не давайте мне в долг]
Подскажите основную тактику ожидания загрузки элемента страницы, пожалуста. Есть яркий пример: ожидание загрузки комментариев на youtube. Как только не исхитрялся. Какие-то тонкие ожидания элемнтов и прокрутки на магическое число пикселей вниз - ничего не помогает, как только сеть отказывается работать быстро, кукольник сообщает, что лимит ожидания страницы в 30К превышен 😭 Куда копать-то? Мне, например, не мешает, если страница будет загружена хоть через две минуты, но как это объяснить машине?
Gambit501
Поставить туды значение - 0
Gambit501
А потом page.waitForSelector() и он будет ждать вечность, нужный селектор
Alexander [не давайте мне в долг]
Alexander [не давайте мне в долг]
https://pptr.dev/#?product=Puppeteer&version=v3.0.0&show=api-pagesetdefaulttimeouttimeout
Хм... Не подскажите, что делает setDefaultNavigationTimeout? У меня была логика, как у этого парня https://stackoverflow.com/questions/55112690/puppeteer-setdefaultnavigationtimeout-to-0-still-times-out
Gambit501
Можно поставить любое
Gambit501
либо - 0
Gambit501
тогда будет ожидать бесконечное время
Alexander [не давайте мне в долг]
для вот этих методов
Да, да. Вроде супер, теперь даже на заниженной скорости или забитом канале не выпадает. Хз, почему я делал setDefaultNavigationTimeout. Там же два метода! 🙈
Alex*
Всем привет! Вопрос такой - Как можно идентифицировать экземпляр кукольника в списке процессов? Да, там можно увидеть путь к скрипту, но мне надо еще один идентификатор. Например проверить не остались ли в памяти запущенные экземпляры и убить нужный мне. Или наоборот, не запускать еще один экземпляр уже запущенного. Надеюсь не сильно путанно объяснил. )
Alexey
Всем привет! Вопрос такой - Как можно идентифицировать экземпляр кукольника в списке процессов? Да, там можно увидеть путь к скрипту, но мне надо еще один идентификатор. Например проверить не остались ли в памяти запущенные экземпляры и убить нужный мне. Или наоборот, не запускать еще один экземпляр уже запущенного. Надеюсь не сильно путанно объяснил. )
привет! ну это зависит от того, как именно папетир запускать. Если, например, прога на ноде и папетир запускать в отдельном новым процессе через child_process.fork, то он вернет объект, у которого можно спросить pid. вообще, независимо от задачи, в операционке ты так или иначе запускаешь процесс, который однозначно идентифицируется его pid-ом. и один из подходов, как не запускать еще один процесс "задачи" - это чтобы она (или тот процесс который ее запускает) сразу после запуска записала в какой то файл свой pid. А перед попыткой запустить еще одну "задачу" нужно проверить что в этом файле, и если он есть, то проверить, жив ли еще в операционке процесс с таким pid-ом.
Bogdan
Всем привет! Не подскажите как вернуть объект из page.evaluateHandle() Нужно получить, елемент вместе с контекстом(value), Полученный результат позже нужно будет отправить в page.evaluate() простой пример: page.evaluateHandle((value) => { const els = document.querySelectorAll(‘some field’) return els.map(el => {return {element: el, value: value}}) }, value)
Shieldy
(6 + 2) @bo_one, please, send the solution to the arithmetic operation provided within the time amount specified to this group, otherwise you will be kicked. Thank you! (60 sec) Powered by Todorant
Bogdan
8
Bogdan
Пробовал, возвращал все елменты, но они не enumerable
Bogdan
может какой-нибудь Array.from(els) нужно сделать?
Назар
а оно вообще может вернуть несколько элементов?
Bogdan
const allElements = await page.evaluateHandle( () => [...document.querySelectorAll('*')] );
Bogdan
вот нашел, что-то такое, сейчас попробую...
Bogdan
Нифига не получилось 🙁
Назар
я в доке не видел, чтоб им получали коллекцию через evaluateHandle.
Bogdan
Можно по другому решить задачу, внутри page.evaluate() Но проблема с разбивкой по модулям, я импортирую модули через await frame.addScriptTag({ path: “./path/module.js” });
Bogdan
ну и через require тоже делаю импорт, однако жалуется что такой функции не существует в итоге
Назар
так а оно помечает что тип модуль у импорта?
Bogdan
Evaluation failed: ReferenceError: textarea_engine is not defined at <anonymous>:15:11
Bogdan
До этого я импортировал так модули, но там получается был основной модуль на nodejs и через него я вызвал несколько модулей которые были завернуты в page.evaluate()
Bogdan
А сейчас я изменить хочу структуру таким образом: const imported_module1 = require("./imported_module1.js); const imported_module2 = require("./imported_module2.js”); await page.addScriptTag({ path: "./engine/imported_module1.js" }); await page.addScriptTag({ path: "./engine/imported_module2.js" }); await page.evaluate((a) => { imported_module1(a) imported_module2(a) }, a)
Bogdan
То есть наоборот из page.evaluate я вызываю несколько сторонних модулей.
Bogdan
imported_module1 и imported_module2 - также импортируют внутри другие модули. Nested import.
Bogdan
Проверил еще раз, если убираю зависимости у imported_module1 и imported_module2 - то все работает.
Bogdan
Есть у кого-нибудь мысли как решить? 🙂
maxOn
всех с наступившим НГ 😁 Есть страница, загружаю через папитир, когда кликаю на авторизацию, появляется frame. Как мне выбрать этот фрейм и делать события в рамках только этого frame???
maxOn
page.frames() returns: <Array<Frame>> An array of all frames attached to the page. я бы попробовал с этого
да, но возвращяет массив, а тут есть вот такие методы conten(), focus()
maxOn
получается выбирать потом именно этот фрейм из масива и все событие уже будут дальнейшие в нем происходить?
maxOn
нужно как то с ним работать же, например как с page
Назар
скорее всего нет. Любая страница это фрейм. Нужно будет вместо page писать frame.
maxOn
скорее всего нет. Любая страница это фрейм. Нужно будет вместо page писать frame.
воооот, да я именно об этом. Получается юзаю frames(), а после беру из масива который мне нужен и уже пишу что-то аля frame.click('selector")
maxOn
верно?
Назар
я думаю да