Назар
а то что линтер не дает менять параметр то это бред. Типа чистая функция. Если все же нужно без комента, но 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
папетир всех быстрее)
Pavel
Alexander
8
Alexander
чет бот задумчивый немног)
Ansar
Попытка #2
Anonymous
Какие технологии и методы использовать, чтобы парсить динамический сайт(рулетку), которая записывает крайние игры в LAST GAMES, хочу на выходе получить, чтобы скрипт считал последовательность меньше х2, если она например равна 4 , то мне подается уведомление или сигнал.
Просмотрел bs4 и requests, но не уверен,что их можно приспособить к динамическому сайту, и постоянное обновление запросов. Или осуществимо?
P.S. на фото.
Вообщем есть строка LAST games , к которой каждый раз по совершении игры прибавляется еще одно значение.(рандомное от 2x до 100x)
Чекал и селениум, но суть в том, что я не знаю, как обновлять постоянно запросы, и чекание последовательностей
Anonymous
Anonymous
Понял, что через папитр можно сделать, но как сделать так, чтобы он брал новое значение каждый раз сам?
Anonymous
Да он так и работает
Anonymous
Придется обрабатывать это число в сравнении, не равно ли оно предыщему и точно ли новое значение
Владимир
Всем привет. Hairline Feature: missing - можете подсказать почему этот тест не проходит?
Alexey
Придется обрабатывать это число в сравнении, не равно ли оно предыщему и точно ли новое значение
еще можно попробовать "внедрить" на страницу скрипт, который создаст MutationObserver, который подпишется на изменения эл-та с этой строкой.
https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
и через него ловить события изменения этого эл-та, а потом "отправлять" на сторону процесса папетира, через функцию-колбек, которую также предварительно зарегистрировать на странице через page.exposeFunction(...)
volond
Доброго времени суток
Есть такой вопрос
Есть Веб версия 1С
Если с ней работать через обычный браузер то там при первом запуске нужно отключить блокировщик всплывающих окон Как это сделать ето через Puppeter
Gambit501
Gambit501
args: ["--disable-popup-blocking", "--allow-popups-during-page-unload"],
Gambit501
но это будет работать вроде как только для режима Headless: False
volond
Gambit501
для True не работает вроде, т.к сам браузер не заточен
Gambit501
https://github.com/puppeteer/puppeteer/issues/5250
volond
Мне все равно
Задача стоит потом
Открыть отчет вставить данные
Сформировать и сохранить локально в Ексель
#свободуНавальному
Привет, как можно фейкнуть порядок HTTP заголовков запроса, что бы воспринимали не как бота?
Gambit501
#свободуНавальному
MC
I don't know. Sorry
Alexander [не давайте мне в долг]
Подскажите основную тактику ожидания загрузки элемента страницы, пожалуста. Есть яркий пример: ожидание загрузки комментариев на youtube. Как только не исхитрялся. Какие-то тонкие ожидания элемнтов и прокрутки на магическое число пикселей вниз - ничего не помогает, как только сеть отказывается работать быстро, кукольник сообщает, что лимит ожидания страницы в 30К превышен 😭 Куда копать-то? Мне, например, не мешает, если страница будет загружена хоть через две минуты, но как это объяснить машине?
Назар
Gambit501
Gambit501
Поставить туды значение - 0
Gambit501
А потом page.waitForSelector() и он будет ждать вечность, нужный селектор
Alexander [не давайте мне в долг]
Gambit501
Gambit501
Можно поставить любое
Gambit501
либо - 0
Gambit501
тогда будет ожидать бесконечное время
Gambit501
Alexander [не давайте мне в долг]
Да, да. Вроде супер, теперь даже на заниженной скорости или забитом канале не выпадает. Хз, почему я делал setDefaultNavigationTimeout. Там же два метода! 🙈
Alex*
Всем привет!
Вопрос такой - Как можно идентифицировать экземпляр кукольника в списке процессов?
Да, там можно увидеть путь к скрипту, но мне надо еще один идентификатор.
Например проверить не остались ли в памяти запущенные экземпляры и убить нужный мне.
Или наоборот, не запускать еще один экземпляр уже запущенного.
Надеюсь не сильно путанно объяснил. )
Alexey
Всем привет!
Вопрос такой - Как можно идентифицировать экземпляр кукольника в списке процессов?
Да, там можно увидеть путь к скрипту, но мне надо еще один идентификатор.
Например проверить не остались ли в памяти запущенные экземпляры и убить нужный мне.
Или наоборот, не запускать еще один экземпляр уже запущенного.
Надеюсь не сильно путанно объяснил. )
привет! ну это зависит от того, как именно папетир запускать. Если, например, прога на ноде и папетир запускать в отдельном новым процессе через child_process.fork, то он вернет объект, у которого можно спросить pid.
вообще, независимо от задачи, в операционке ты так или иначе запускаешь процесс, который однозначно идентифицируется его pid-ом.
и один из подходов, как не запускать еще один процесс "задачи" - это чтобы она (или тот процесс который ее запускает) сразу после запуска записала в какой то файл свой pid. А перед попыткой запустить еще одну "задачу" нужно проверить что в этом файле, и если он есть, то проверить, жив ли еще в операционке процесс с таким pid-ом.
Alex*
привет! ну это зависит от того, как именно папетир запускать. Если, например, прога на ноде и папетир запускать в отдельном новым процессе через child_process.fork, то он вернет объект, у которого можно спросить pid.
вообще, независимо от задачи, в операционке ты так или иначе запускаешь процесс, который однозначно идентифицируется его pid-ом.
и один из подходов, как не запускать еще один процесс "задачи" - это чтобы она (или тот процесс который ее запускает) сразу после запуска записала в какой то файл свой pid. А перед попыткой запустить еще одну "задачу" нужно проверить что в этом файле, и если он есть, то проверить, жив ли еще в операционке процесс с таким pid-ом.
Да, уже смотрю
util.inspect(module, ...
и
const {snapshot } = require("process-list");
snapshot('pid', 'name', 'path', 'cmdline');
надеюсь все получится.
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
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
Bogdan
Проверил еще раз, если убираю зависимости у imported_module1 и imported_module2 - то все работает.
Bogdan
Есть у кого-нибудь мысли как решить? 🙂
maxOn
всех с наступившим НГ 😁
Есть страница, загружаю через папитир, когда кликаю на авторизацию, появляется frame. Как мне выбрать этот фрейм и делать события в рамках только этого frame???
Alex
maxOn
maxOn
получается выбирать потом именно этот фрейм из масива и все событие уже будут дальнейшие в нем происходить?
maxOn
нужно как то с ним работать же, например как с page
Назар
скорее всего нет. Любая страница это фрейм. Нужно будет вместо page писать frame.
maxOn
верно?
Назар
я думаю да