Alhimik
Ты и ключ и значение проверяешь?
🦊 Лиса
🦊 Лиса
а
🦊 Лиса
ахахаха, там crlf
Alhimik
Бывает.
🦊 Лиса
спасибо
Pavel
Привет. Есть у кого-нибудь пример Dockerfile с установкой chromium для puppeteer'a?
Назар
Привет. Есть у кого-нибудь пример Dockerfile с установкой chromium для puppeteer'a?
я делал когда то. На самом деле легче отдельно браузер в докере держать, и отдельно папитир https://hub.docker.com/r/browserless/chrome
Назар
а как это вообще работает тогда? можно, пожалуйста, схему в двух словах
папитир может подключаться по ws к любому браузеру запущеному в девтулз режиме. Там в ридми докера хрома есть гайд как подключить папитир к нему.
Назар
запускаем докер хрома на 3000 порту, и подключаемся папитиром туда же. При этом можно ставить не puppeeteer, а puppeeteer-core, то есть чтоб он сам себе хромиум не качал
Назар
Назар
GamiD
https://chromedevtools.github.io/devtools-protocol/tot/Browser/#method-setWindowBounds
https://chromedevtools.github.io/devtools-protocol/tot/Browser/#method-setWindowBounds Как применить данную команду в puppeteer
GamiD
А хотя там не возможно указать координаты
GamiD
Возможно, через Bounds.
await browser._connection.send('Browser.setWindowBounds', { bounds: {windowState: 'minimized'}, windowId }) делается так но там координаты ни как не укажешь
GamiD
Но координатов нет=)
Alhimik
Но координатов нет=)
А left и top зачем тогда нужны? )
Alhimik
await browser._connection.send('Browser.setWindowBounds', { bounds: {windowState: 'minimized'}, windowId }) делается так но там координаты ни как не укажешь
const client = await page.target().createCDPSession(); await client.send('Browser.setWindowBounds', { windowId: 1, bounds: { left: 0, top: 0, width: 200, height: 200, }, });
Alhimik
Всё прекрасно работает.
1
Почему waitForSelector не видит селектор, хотя из селектора спокойно получаю данные если убираю waitForSelector?
Alhimik
Почему waitForSelector не видит селектор, хотя из селектора спокойно получаю данные если убираю waitForSelector?
> из селектора спокойно получаю данные если убираю waitForSelector Это как?
1
> из селектора спокойно получаю данные если убираю waitForSelector Это как?
Так получаю ошибку TimeoutError: waiting for selector await page.waitForSelector(sel); let text = await page.$eval(sel, el => el.textContent); console.log(text) так не получаю ошибку // await page.waitForSelector(sel); let text = await page.$eval(sel, el => el.textContent); console.log(text)
Alhimik
Вообще странная ситуация, мне кажется ты что-то ещё не учитываешь. Если page.$eval видит элемент, то и waitForSelector должен видеть.
1
Вообще странная ситуация, мне кажется ты что-то ещё не учитываешь. Если page.$eval видит элемент, то и waitForSelector должен видеть.
Логично, сам удивлён, поэтому решил спросить. Ошибка такая вылезает: (node:19040) UnhandledPromiseRejectionWarning: TimeoutError: waiting for selector body > table:nth-child(17) > tbody > tr:nth-child(1) > td > div > table:nth-child(1) > tbody > tr > td > strong > font failed: timeout 30000ms exceeded at new WaitTask at DOMWorld.waitForSelectorInPage at Object.internalHandler.waitFor at processTicksAndRejections (internal/process/task_queues.js:95:5) и т.д.
Британец
Ребят привет, я через API получаю JSON ответ ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36") Как убрать " " Чтобы было просто Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36
Британец
String.replace(/"/g, '')
Спасибо,решил проблему )
Alex
Есть что-то лучшее чем кластер? Есть очередь в редисе, нужно постоянно держать несколько инстансов и обрабатывать ее.
🅰️nimeCoder
String.replace(/"/g, '')
Вариант в прицнипе рабочий, но я бы лучше сделал что-то вроде `"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"`.split(/"(.+)"/)[1] Ну или slice: `"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"`.slice(1, -1)
1
При открытии страницы в обычном браузере около мыши крутится значок ожидания загрузки страницы, чем отслеживать в puppeteer? 1. waitUntil: 'load' 2. waitUntil: 'domcontentloaded' 3. waitUntil: 'networkidle0' 4. waitUntil: 'networkidle2'
🅰️nimeCoder
получить его можно чем то типа const cursor = await page.evaluate(() => { return new Promise(resolve => { document.addEventListener('mouseover', e => resolve(e.target.style.cursor), false) }) })
1
значек около мыши это css стили курсора
Параллельно на сайте крутится значок при загрузки страницы. Появляются и исчезают одновременно
🅰️nimeCoder
тогда по селектору
🅰️nimeCoder
если он в странице есть всегда и просто сыкрыт то waitFor + visible: false / true
1
если он в странице есть всегда и просто сыкрыт то waitFor + visible: false / true
При смене класса появляется значок на странице <div _ngcontent-dom-c10="" class="ngx-overlay" style="background-color: rgba(40, 40, 40, 0.8); border-radius: 0px;"> класс меняется с "ngx-overlay" (страница доступна) на "ngx-overlay loading-foreground" страница не доступна и появляется значок загрузки. Как отловить этот момент? Элемент в браузере показывается серым при классе "ngx-overlay" и при классе "ngx-overlay loading-foreground" элемент активный.
🅰️nimeCoder
Я бы инжектил в страницу код который бы за этим следил по эвентам если честно
🅰️nimeCoder
в прицнипе тож норм
🦋noteee
Нашёл такое решение
Советую добавить сюда ещё таймаут с завершением функции, чтобы не повисло бесконечно
Назар
Привет. Посоветуйте дешевый прокси
Bogdan
а номера для гугла где можно купить никто не знает?
1
Подскажите, что за ошибка при запуске? { TimeoutError: Navigation timeout of 30000 ms exceeded at Promise.then (/home/sdm/node_modules/puppeteer/lib/cjs/puppeteer/common/LifecycleWatcher.js:107:111) name: 'TimeoutError' }
1
ok google? https://ourcodeworld.com/articles/read/1106/how-to-solve-puppeteer-timeouterror-navigation-timeout-of-30000-ms-exceeded
Проблема не в этом, даже сам браузер не запускает, вылетает с этой ошибкой
Pavel
дак значит проблема с запуском браузера?
1
дак значит проблема с запуском браузера?
Ну да, до открытия страницы даже не доходит
Pavel
мало инфы, как браузер запускаешь
Pavel
?
Alhimik
Подскажите, что за ошибка при запуске? { TimeoutError: Navigation timeout of 30000 ms exceeded at Promise.then (/home/sdm/node_modules/puppeteer/lib/cjs/puppeteer/common/LifecycleWatcher.js:107:111) name: 'TimeoutError' }
Покажи весь стэк, чтобы понятнее было. Перед ошибкой проходит реально 30 секунд или она сразу выдаётся? Почему ты решил что проблема не в навигации?
Phil
Всем привет Помогите пожалуйста, как мне написать так, чтобы получить число найденных элементов? например, пытался написать - const read = (await page.waitForXPath("(//div[@class='inventory_item_name'])")).length Но на выходе получаю undefined пытался так - let value = await page.evaluate(read => read.length, read) Тоже самое - undefined вот тестирую на этом сайте - https://www.saucedemo.com/
Phil
А в evaluate первым аргументом идет селетор, вторым - коллбэк
у меня ошибку выводит, если так использую
Phil
let sel = '#links'; let arr = await page.evaluate(() => Array.from(document.querySelectorAll(sel, element => element.href)); console.log(arr.length);
спасибо большое но использовать вместе с xpath не выйдет, да?
Alhimik
спасибо большое но использовать вместе с xpath не выйдет, да?
Если нужно узнать актуальное количество элементов: const items = await page.$x("//div[@class='inventory_item_name']"); console.log(items.length); Если сначала нужно дождаться появления элементов: const xPathSelector = "//div[@class='inventory_item_name']"; await page.waitForXPath(xPathSelector); const items = await page.$x(xPathSelector); console.log(items.length);
Phil
Если нужно узнать актуальное количество элементов: const items = await page.$x("//div[@class='inventory_item_name']"); console.log(items.length); Если сначала нужно дождаться появления элементов: const xPathSelector = "//div[@class='inventory_item_name']"; await page.waitForXPath(xPathSelector); const items = await page.$x(xPathSelector); console.log(items.length);
Спасибо большое 👍 Буду теперь знать а чтобы не ждать долго ожидания элемента (по умолчанию стоит 30 секунд ожидания), то можно использовать await page.waitForXPath(xPathSelector, {timeout:3000}); ps: написал для новичков
Alhimik
Спасибо большое 👍 Буду теперь знать а чтобы не ждать долго ожидания элемента (по умолчанию стоит 30 секунд ожидания), то можно использовать await page.waitForXPath(xPathSelector, {timeout:3000}); ps: написал для новичков
Если элемент уже существует то ждать не придётся. Но если элемент не успеет появиться за 3 секунды, то будет ошибка. Так что обычно нет смысла уменьшать таймаут, кроме случаев, когда ты знаешь что элемента может не быть и ты обрабатываешь этот случай.
Bogdan
let sel = '#links'; let arr = await page.evaluate(() => Array.from(document.querySelectorAll(sel, element => element.href)); console.log(arr.length);
Не хочу быть занудой, но не пишите var и let в местах где мутировать данные не надо(почти везде) это ухудшает понимание чужого кода.
Bogdan
var в принципе писать нынче плохо
да в целом вообще мутация данных такое себе.
🅰️nimeCoder
Ну var это не только мутация, но и видимость не блочная
🅰️nimeCoder
Хотя с другой стороны условно от изменения объекта вас не спасёт никто, даже Object.freeze, тк все эти функции не могут в deep