можно как -нибудь при клике на элемент в браузере вытащить его уникальный селектор?
Shieldy
(4 + 4) @tarasvasilev, 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 1inch Network
Куча всего, начиная с заголовков и заканчивая одинаковым разрешением, айпи адресом. Могут использоваться куки, которые ты перед запросом не чистишь или какие-то значения из локал сторедж.
Вайпер
Привет всем, подскажите пожалуйста можно ли сделать такое, у меня есть страница с прогрессом, мне нужно получать определенные тэги их будет несколько, как только они будут появляться на странице.
Если не нравится подход с MutationObserver, то остаются обычные таймеры в цикле. Просто опрашивай нужные тебе элементы раз в несколько миллисекунд, к примеру.
Если цель получать тэги сразу же при изменении то нужно разобраться с MutationObserver.
Хотя и первый вариант может помочь в простейших случаях. Но, если элементов много, то менее производительней.
Вайпер
Да у меня ситуация следующая, есть страница, на ней сплошной текст через br, и появляются нужные мне тэги, мне от туда нужен только текст, я могу до них достучаться и найти текст который появится через waitForFunction, но мне этот текст нужно извлечь и выкинуть в телеграм бота, но waitForFunction не слушает параметр контекста самого бота
Не понимаю на каком этапе проблема.
1. Нужно заинжектить на страницу MutationObserver (он будет следить за контейнером)
2. Объявить exposeFunction в пространстве node.js, эта функция будет видна внутри страницы по указанному имени
3. Когда MutationObserver видит любое изменение внутри контейнера, он вызывает exposeFunction
А я решил уже задачу, просто сам тупил не мог понять метод MutationObserver, посидел по частям разобрал, вроде разобрался, но все равно спасибо, за помощь
Innerbloom
async function search () {
try {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.setViewport({width: 1280, height: 1300})
await page.goto(URL, {timeout: 10000});
await page.type(selectors.searchBox, randomValue);
await page.keyboard.press('Enter', {delay: 2000}); // ждет 5 секунд
for (let i = 0; i < 4; i++) {
const next = await page.$$(selectors.productLinks, {
timeout: 3000 // 8 секунд таймаут
});
await next[i].click({delay: 1000}); // клик по элементу первом
const helpful = await page.waitForSelector(selectors.helpful)
await helpful.click();
const back = await page.waitForSelector(selectors.back)
await back.click({delay: 5000}); // 5 сек возврат назад
await new Promise(r => setTimeout(r, 3000))
}
}catch (error) {
console.log(error)
}
}setInterval( () => {
search()
}, 5000);
Как сделать что б функция не открывала постоянно новое окно браузера ?
Если я все правильно понял, то ... окно браузера === вкладка
Соберите сначала все ссылки на странице, закройте текущую, а затем по очереди открывайте из массива собранных.
Хотя на практике, если надо много парсить, как раз наоборот, сразу открываешь несколько вкладок.
Captain Maslori
Приветствую, кто-нибудь может подсказать, чем это может быть вызвано? Компилю из es-модулей в commonjs, поэтому код выглядит после компиляции как на фото, но это вызывает ошибки puppeteer
> чем это может быть вызвано?
Могу предположить что дело в exposeFunction. Компилятор не знает что функция используется из контекста страницы. И, возможно, удаляет её. Если это так, добавь ложный вызов, который никогда не будет осуществлён, но так, чтобы компилятор не смог этого понять :)
Например:
if (Date.now() === 8640000000000000) { // maximum date
// call function
}
Ну или найди опцию, которая позволит не трогать функцию.
Я уже не помню деталей реализации. Вроде в ишью у них читал. Но сейчас посмотрел, там очень много ишью с exposeFunction. Так что точно не скажу. Надо проверять. Но, насколько я помню, проблема именно в том что у ноды и браузера отдельные контексты.