Alhimik
aria-checked делать?
Если подходит то да.
artem
Если подходит то да.
а как его достать то?
artem
что-то это выглядит не надежно
artem
да так достать точно не получится(
artem
ура ура я смог
artem
камелкейсом надо было
artem
ребята
artem
я хочу приладить к пупетиру прокси
artem
какие прокси брать?
artem
ipv 6
artem
или ipv 4
Andrey
ipv6 многие сайты не поддерживают
Alexander
Был ли у кого-то опыт тестирования веб и десктопного приложения на electron с кукловодом, можете подсказать плюсы и минусы?
Gerrra
вторая страница берется от сюда: const pages = await bro.pages(); const secondPage = pages[2];
Alhimik
Обычно первой (индекс 0) не пользуются, поэтому у него первая это с индексом 1, а вторая с индексом 2.
Alhimik
вторая страница берется от сюда: const pages = await bro.pages(); const secondPage = pages[2];
У тебя же там вторая страница открывается по клику вроде бы. Тебе нужно ждать момента когда она откроется через page.once('popup', cb).
Alhimik
element - элемент, по которому делают клик, чтобы открыть страницу: const [popup] = await Promise.all([ new Promise(resolve => page.once('popup', resolve)), element.click(), ]);
Gerrra
Я не могу просто await другая страница.waitFor()?
Gerrra
серьезно? не знал
Хром сразу с 1 страницей открывается.
Alhimik
серьезно? не знал
По умолчанию страница одна уже открыта, и после newPage() получается что пользуются второй (индекс 1). Чтобы пользоваться первой (индекс 0) нужно сделать так: const [page] = await browser.pages();
Alhimik
Я не могу просто await другая страница.waitFor()?
Можешь, но ты же не знаешь открылась она уже или нет.
Alhimik
page - та страница, с которой ты это открываешь?
Да. А popup будет открытой страницей.
Gerrra
Такс
Gerrra
function seeAdd(myBtn, r) { const [popup] = Promise.all([ new Promise(resolve => page[r].once('popup', resolve)), myBtn.click(), ]); for (const frameLvl1 of popup.frames()) { for (const frame of frameLvl1.childFrames()) { if (!frame.url().startsWith("https://www.youtube.com")) { continue; } const playBtn = frame.waitForXPath("//button[contains(@class, 'ytp-large-play-button')]", { timeout: 3000 }); playBtn.click(); } } } async function getPic(r) { const bro = await puppeteer.launch({headless: false}); page[r] = await bro.newPage(); //const pages = await browser.pages(); await page[r].goto('https://aviso.bz/work-youtube'); await page[r].waitFor(2000); // const pages = await bro.pages(); await page[r].evaluate(() => { const btns = [...document.querySelectorAll('.work-serf .serf-text')] .filter(el => el.innerText.includes('10 сек')) .map(el => el.parentNode.parentNode.previousElementSibling.querySelector('div > span')); i = 0; for (const btn of btns) { if (i < 1) { i++; seeAdd(btn, r); } } }) } Так вроде норм, но чет кидает непонятные ошибки и не работает.
Gerrra
throw new Error('Evaluation failed: ' + helper_js_1.helper.getExceptionMessage(exceptionDetails)); ^ Error: Evaluation failed: ReferenceError: seeAdd is not defined at puppeteer_evaluation_script:13:9 at ExecutionContext._evaluateInternal (C:\Users\User\node_modules\puppeteer\lib\cjs\puppeteer\common\ExecutionContext.js:221:19) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async ExecutionContext.evaluate (C:\Users\User\node_modules\puppeteer\lib\cjs\puppeteer\common\ExecutionContext.js:110:16) at async getPic (C:\Users\User\Desktop\Test\scrape.js:60:3) Вообще не понимаю на что оно жалуется
Gerrra
функция для того, чтобы выполнялось все одновременно
Alhimik
Ты пытаешься внутри evaluate вызвать функцию seeAdd, которая находится в контексте Node.js.
Gerrra
Такс
Gerrra
А так?
Gerrra
await page[r].evaluate(() => { const btns = [...document.querySelectorAll('.work-serf .serf-text')] .filter(el => el.innerText.includes('10 сек')) .map(el => el.parentNode.parentNode.previousElementSibling.querySelector('div > span')); }) i = 0; for (const btn of btns) { if (i < 1) { i++; seeAdd(btn, r); } }
Gerrra
Как мне сделать btns глобальным для функции?
Alhimik
Как мне сделать btns глобальным для функции?
Я не понимаю что ты хочешь сделать.
Alhimik
// Находишь кнопку const btn = await page.waitForXPath("<SELECTOR>"); // Делаешь клик и ждёшь открытия новой страницы const [popup] = await Promise.all([ new Promise(resolve => page.once('popup', resolve)), btn.click(), ]); // Работа с открытой страницей await popup.waitForXPath("<SELECTOR>");
Alhimik
Дальше всё как обычно.
Alhimik
Так у меня не одна такая кнопка
И что? Ты одновременно жмёшь на все кнопки? Или по одной?
Gerrra
И что? Ты одновременно жмёшь на все кнопки? Или по одной?
с небольшой задержкой, чтобы не кидало в проверку на бота
Alhimik
с небольшой задержкой, чтобы не кидало в проверку на бота
Я к тому что в конкретный момент времени у тебя есть одна кнопка и одно открытие страницы. Тебе это нужно делать в контексте ноды а не в контексте страницы. Зачем ты кнопки ищешь внутри evaluate?
Alhimik
Так сказали делать )
В общем случае так можно делать, но тебе нужно ловить момент открытия страницы, поэтому в данном случае только в контексте ноды.
Gerrra
Без кого?
без await page[r].evaluate(() => {
Alhimik
Например через waitForXPath, waitForSelector и другие.
Gerrra
Например через waitForXPath, waitForSelector и другие.
так у каждой кнопки разный селектор
Gerrra
#start-ads-203227 > span:nth-child(1)
Gerrra
Номер разный
Gerrra
for (const frameLvl1 of needPage.frames()) выкидывает так же ошибку
Alhimik
Номер разный
Например так можно: await page.waitForSelector("//div[starts-with(@id, 'start-ads-')]/span[2]");
Gerrra
const btn = await page.waitForXPath("//div[starts-with(@id, 'start-ads-')]/span[2]"); ^ TypeError: page.waitForXPath is not a function
Alhimik
const btn = await page.waitForXPath("//div[starts-with(@id, 'start-ads-')]/span[2]"); ^ TypeError: page.waitForXPath is not a function
Ну ты проверь что у тебя в page лежит. Очевидно что там что-то другое. Потому что у дефолтной page есть метод waitForXPath.
Gerrra
Не работает
Gerrra
Оно не кликает на кнопки
Gerrra
await page[r].evaluate(() => { const btns = [...document.querySelectorAll('.work-serf .serf-text')] .filter(el => el.innerText.includes('10 сек')) .map(el => el.parentNode.parentNode.previousElementSibling.querySelector('div > span')); for (const btn of btns) { btn.click(); btn.click(); btn.click(); } })
Gerrra
Вот эта штука работала ксати
Gerrra
но она с evaluate
Gerrra
А это не удобно
artem
подскажите пожалуйста какие прокси нужны пупетиру
artem
почему все прокси которые я купил выглядят так
Светлана
Возможно потому что в коде Тени page это твоё page[r]?
Светлана
Светлана
Если угадала - не благодари
Alhimik
https://t.me/puppeteer_ru/6504
artem
та я вот сам не знаю
artem
сначала 1 купил коекак биткоином
artem
7к потратил пока конвертировал
artem
и их для апи нельзя использовать
artem
😅
artem
потом другие
artem
дешевые
artem
вроде разобрался