Nikolai
Хотя не, чёт я гусей погнал. Думаю...
1
a.js export page; b.js import page from 'a.js' page.screenshot();
С этим проблем нет, функция экспортируется. Но вот ошибка самого puppeteer, что не найдена страница.
1
Получается подключенный модуль В никак не связан с запущенным браузером в модуле А.
1
Вот так выглядит
1
Не понял, как её указать? Можно пример, чтобы лучше понять? Схему упрощённую показал. Смысл такой, что каждый модуль должен отвечать за свои задачи на странице, один модуль занимается авторизацией, второй модуль обработкой данных со странице, третий модуль управляет страницей и модуль А который последовательно запускает другие модули. Всё происходит на одной странице.
1
Модуль В запускаем в модуле А, предполагаю, что страница должна видна. Но, скорее всего так не работает.
1
Не соображу, что именно необходимо передать из модуля А в модуль В, чтобы в модуле А запустился браузер, а в модуле В зашёл на какую-нибудь страницу?
1
Спасибо за подсказку, сейчас попробую таким образом.
1
Вроде работает, теперь понятно, что саму страницу надо передавать. Спасибо 👍
Anonymous
Новости
Pavel
Вопрос на засыпку, как дотянуться до обьектов в другом скоупе? У меня есть страница в пупетере, в ней скрипт, мне нужно его похачить, что бы сделать правильные скриншоты. Таких страниц очень много, и в каждой нужно сделать скрин.
Андрей
Привет. ребят, Почему puppeteer js при парсинге не дожидается селектора, который отображается в браузере? https://qna.habr.com/q/707345
Gambit501
Может надо страницу суть вниз опустить
Gambit501
Попробуй время ожидания больше
Андрей
Спасибо. Попробую, только этот элемент достаточно высоко.
Gambit501
Поставь handless или как там его на false
Gambit501
И посмотри что происходит во время выполнения
Андрей
он и так на фолсе
Андрей
И я все вижу
Gambit501
Pavel
Да, я уже так же решил делать, просто вставкой сорцов в нужное место, спасибо.
Pavel
Это не работает для объектов которые объявлены в своем споупе и не привязаны к window, из-за соображений безопастности в браузерах.
1
Как извлечь переменную с массивом со страницы? Если в консоли браузера набрать: window.myArray или window.top.myArray то выводится массив, а как в puppeteer не пойму, пробовал так: const myArray = await page.evaluate(() => window.myArray) соответственно его не находит const myArray = await page.evaluate('typeof myArray')
1
В данный момент реализовано так. Задача, реализовать в puppeteer
1
В данный момент реализовано так. Задача, реализовать в puppeteer
Оказывается, wrappedJSObject только в Firefox, а для Chrome используется javascript:window.myArray в консоли браузера работает. Но, в puppeteer не работает почему-то.
Anonymous
Оказывается, wrappedJSObject только в Firefox, а для Chrome используется javascript:window.myArray в консоли браузера работает. Но, в puppeteer не работает почему-то.
Попробуй evaluate. На прямую из паппатира выполнить js не возможно. Поэтому существуют функции типа evaluate в различных фреймворках. Ты выполняешь код в месте где твоего массива нет.
1
Попробуй evaluate. На прямую из паппатира выполнить js не возможно. Поэтому существуют функции типа evaluate в различных фреймворках. Ты выполняешь код в месте где твоего массива нет.
Не понял, а как выполнить код там, где есть массив? Выполняя const myArr = await page.evaluate(() => myArray); ничего не находит. Пробовал const myArr = await page.evaluate(() => myArray in window); тоже ничего не находит.
1
Тут такой же пример. Вроде всё тоже самое, но не видит массив. добавлял await page.waitForFunction(() => 'myArray' in window);
Pavel
// save page body from target page let targetBody = ''; let targetUrl = 'http://127.0.0.1:8080/examples/loader_mmd_audio.html'; await page.goto(targetUrl, { waitUntil : 'domcontentloaded' }); await page.setRequestInterception(true); page.on('request', req => req.continue()); page.on('response', async (resp) => { if (resp.url().includes('.html')) { targetBody = await resp.text(); } }); await page.goto(targetUrl, { waitUntil : 'domcontentloaded' }); // make a new request and inject timer in page body page.close(); page = await browser.newPage(); await page.setViewport({ width: 800, height: 600 }); await page.setRequestInterception(true); page.on('console', msg => console.log('PAGE LOG:' + msg.text())); page.on('request', req => { if (req.url() == targetUrl) { req.respond({ status: 200, contentType: 'text/html; charset=UTF-8', body: targetBody.replace( '../build/abc.module.js', "../build/abc.module.js';" + timerInjection + ";'" ) }); } else { req.continue(); } }); await page.goto(targetUrl); примерно вот так можно перехватывать реквесты и заменять тело ответа, но я таки обошелся одной строчкой с page.evaluateOnNewDocument(script);
Pavel
Ага, все классы опирались на отрытые обьекты зацепленные к window
1
В консоле браузера выполняя window.myArray показывает данные массива
1
Создать локальный файл file.html <script type="text/javascript"> var myArray = new Array(); myArray['item1'] = true; myArray['item2'] = true; myArray['item3'] = true; </script> и протестировать. В консоли браузера показывает.
1
Массив полностью выводит. Вот этот код в Firefox полностью массив создаёт, а тоже самое в puppeteer не пойму как сделать.
1
const arr = await page.evaluate(() => myArray); возвращает объект, но он пустой: console.log(Object.keys(arr).length); 0 Можно пример, как из file.html: <script type="text/javascript"> var myArray = new Array(); myArray['item1'] = true; myArray['item2'] = true; myArray['item3'] = true; </script> всё же получить массив/объект? Полдня ломаю голову и никак не могу понять.
1
Спасибо за пример, но у меня всё равно пустой объект. file.html: <script type="text/javascript"> var myArray = new Array(); myArray['item1'] = 1; myArray['item2'] = 2; myArray['item3'] = 3; </script>
1
Объект создаётся на странице: <script type="text/javascript"> var myArray = new Array(); myArray['item1'] = 1; myArray['item2'] = 2; myArray['item3'] = 3; </script> необходимо с этой страницы получить объект myArray. Как создать массив или объект знаю )).
1
Это не я создаю массив, а захожу на сайт и на странице он создаётся в таком виде.
1
Вот кусок, остальное обрезал. В браузере в консоле выводит объект по window.myArray
1
В Firefox через расширение iMacros отлично работает такая схема, а как в puppeteer не пойму.
1
вот часть кода
1
typeof myArray // "object" Array.isArray(myArray) // true
1
Прохожусь по ключам, но всё равно пустой
1
Всё, дошло, надо было внутри evaluate выполнять. Спасибо. Буду дальше разбираться.
1
true true true ....
1
Понятно, а я думал, что массив сразу передаётся.
1
Спасибо, буду дальше изучать )
Gambit501
Привет всем
Gambit501
Делаю неск скриншотов
Gambit501
в цикле
Gambit501
'ktvtyns dblys dct jr
Gambit501
эл видны все ок
Anonymous
🤦‍♂
Gambit501
но некоторые он делает тупо белый скриншот
1
Подскажите, как из evaluate использовать найденные селекторы с checkbox, чтобы можно было после логики, не внутри evaluate, нажать на один из checkbox. Возвращаются данные из evaluate, как пустые object.
1
Мне в последствии с этими селекторами ещё не один раз придётся работать. Например, внутри evaluate нажат, какой-то Checkbox, в последствии надо проверять, нажат ли он, если не нажат, то снова логика и нажимается другой Checkbox.
Pavel
Мне в последствии с этими селекторами ещё не один раз придётся работать. Например, внутри evaluate нажат, какой-то Checkbox, в последствии надо проверять, нажат ли он, если не нажат, то снова логика и нажимается другой Checkbox.
Нельзя, оборачивай все в evaluate, если нужно внутри страницы внешние переменные пробрасывай в evaluate их отдельно. Можно только через ивенты, но это гемор.
1
После каждого действия приходится проверять жива страница или нет. Т.е. нажал Чекбокс, проверил страницу отдельной функцией, выполняем следующее действие, после опять проверяем состояние страницы. Затем снова проверяем Чекбокс, нажат или нет. А так придётся в evaluate делать. Дополнительно с Чекбокс проверяются другие данные относящиеся к этому Чекбокс. Былобы очень удобно вытащить один раз все селекторы и работать с ними по одному. Думал через evaluate их можно вытащить. Пока не придумал логику, как эффективней всё это организовать.
1
Сайт часто перегружен и выдаёт соответствующее сообщение, которое необходимо отловить, далее перезагрузка страницы, и снова все этапы, на каждом этапе приходится проверять состояние страницы. Каждый раз могут быть разные сообщения. Пока дошёл до такого алгоритма: Действие 1 Проверка страницы Действие 2 Проверка страницы Ошибка на странице Перезагрузка страницы Действие 1 Проверка страницы Проверка страницы отдельной функцией
1
Необходимо отловить момент ошибки, чтобы начать сначала, т.к. только сообщение появляется, что что-то недоступно.
1
А как лучше всего ожидать изменения в элементе в теле evoluate, например активности кнопки? Тупо через цикл проверять с интервалом, скажем, 0.5 сек когда изменится атрибут?
1
Спасибо, пойду читать, что это такое.
1
Подскажите, для отладки есть ли возможность вручную переключать шаги, чтобы скрипт ждал подтверждения следующего шага? Например, поставить метку, что тут ждём. Есть slowMo, не подходит. Можно ставить паузы waitFor, тоже не подходит.
John
Так в ide и пользуйся отладкой
1
Тоже такая мысль приходила по событию, например, нажатие Enter. Думал встроенный инструмент есть.
Anonymous
Добрый день
Anonymous
Кто может помочь с puppet
Anonymous
Понял спасибо
Anonymous
После переустановки системы,при прогоне скриптом, puppet качает ключ успешно,но с этим ключём и именем не может подвязаться на сервер так как такой комп с таким ключом уже там есть
Anonymous
У нас своя Корп сеть
Anonymous
Спасибо
Maksim
Привет! Может кто-то в курсе. Как можно сделать пока отработает Ajax-запрос после нажатия на кнопку? скажем такой код: await page.click('button.addToCart') await page.waitForNavigation( { waitUnitl: [ "networkidle0" ] } ) Не работает
Maksim
Суть простая - мне нужно сделать добавление товара в корзину. Страница не перезагружается. Но прежде чем нажать вторую кнопку, мне нужно дождаться, пока первое нажатие отработает, отправит данные на сервер и получит результат.
Maksim
при этом на странице изменения минимальны, поэтому не получится использовать waitForSelector