Gerrra
А в чём преимущество?
Не в чем. Наоборот лучше гораздо в js самом это делать, но я когда доки читал - услыхал что простой клик мышью убрали для безопастности
Alhimik
Все клики на месте вроде бы. )
Gerrra
потому что для страницы нет селектора чтоб кликнуть по нему, тк это встроенное видео с ютуба
Alhimik
потому что для страницы нет селектора чтоб кликнуть по нему, тк это встроенное видео с ютуба
Видео же не в вакууме находится. Оно в iframe. Ты можешь с iframe работать как с любой страницей.
Gerrra
Тааакс, я гуглить
Alhimik
for (const frame of page.frames()) { // frame и есть page await frame.click(selector); }
Alhimik
Только нужный фрэйм выбери.
Gerrra
Alhimik
Пум пурурум. Оно что то не фурычит.
Всё там работает. Просто там внутри фрэймов ещё фрэймы есть. Нужно использовать frame.childFrames(): for (const frameLvl1 of page.frames()) { for (const frame of frameLvl1.childFrames()) { if (!frame.url().startsWith("https://www.youtube.com")) { continue; } // работа с iframe ютуба } }
Alhimik
// работа с iframe ютуба не оч понимаю что тут надо делать?
Так же как со страницей работаешь. Можешь найти кнопку плэй и нажать на неё.
Alhimik
const playBtn = await frame.waitForXPath("//button[contains(@class, 'ytp-large-play-button')]", { timeout: 3000 }); await playBtn.click();
artem
ребята а можно как-то проверить активен ли чекбокс
artem
пупетиром
artem
и если неактивен то щелкать по нем
artem
Можно
подскажите пожалуйста
Pavel
подскажите пожалуйста
Ах, ну это уже другой вопрос, на который я сходу не могу ответить :D
artem
😢
Alhimik
Alhimik
У чекбокса есть свойство checked.
artem
так ну это я вроде знаю
artem
а что дальше
artem
как проверить то его
artem
await по слектору
Alhimik
как проверить то его
А как обычно проверяется булево свойство?
artem
не я не могу поянть как получить дом
artem
тип const dom = (await page.waitForSelector()).checked
artem
или как
artem
или может там eval надо
artem
чтобы document сделать
Alhimik
Внутри evaluate что-то вроде: if (!el.checked) { el.checked = true; }
artem
э
artem
чио
artem
так можно разве?
artem
это как-то нелегально выглядит
artem
например когда textarea так заполнить пытался гугл ее обнулял
artem
пришлось имитировать нажатия клавиатуры
Alhimik
это как-то нелегально выглядит
Это единственный способ поменять состояние чекбокса из JS. Всегда так работало. Если хочешь имитации пользователя то просто сделай клик по нему.
Alhimik
"Реальный" клик всегда лучше. Потому что на изменение состояния может быть повешан обработчик, который выполняет какую-то логику.
artem
а вот что можно делать если у гугла кнопки дырявые
artem
т.е даже мне человеку по два раза нажимать приходится
artem
иногда
artem
а пупетиру еще сложнее
artem
клик каунт на 10 ставить?
artem
ну если с первого не получилось может с десятого получится
artem
Зачем? )
тень ну че такое ты так и не объяснил как мне дом элемент получить пупетиром это не работает 😢
artem
хотя если просто законсол ложить внутри евала то я получу что хочу но только в браузерной консоли само собой
Alhimik
тень ну че такое ты так и не объяснил как мне дом элемент получить пупетиром это не работает 😢
evaluate возвращает только сериализуемые данные. Зачем ты пытаешься промис вернуть? Просто верни document.querySelector(selector).checked.
artem
там вроде когда наводишься написано
artem
что промисом надо
artem
ну ладно
artem
щас попробую
Alhimik
что промисом надо
Промис это сам evaluate, а я тебе про внутренний промис, который ты пытаешься вернуть со страницы.
Alhimik
ну я вот на это посмотрел и подумал что так надо
Это не важно, у них-то простое значение. А у тебя DOM-элемент. И у тебя нет внутри асинхронных задач.
Alhimik
undefined
Ты снова DOM-элемент возвращаешь, верни свойство.
artem
так если
artem
это заработает то почему
artem
я не могу просто дом элемент вернуть
Alhimik
Как-то так: const isChecked = await page.evaluate(() => { return document.querySelector("<SELECTOR>").checked; }); if (!isChecked) { await page.click("<SELECTOR>"); }
Alhimik
я не могу просто дом элемент вернуть
Потому что это объект, принадлежащий странице. Его нельзя сериализовать и передать в контекст Node.js.
artem
так же андефайнд
Alhimik
тень это не помогло
Судя по имени селектора, это псвевдо-чекбокс. У него может быть и нету такого свойства. Мы же говорили про обычный checkbox.
Alhimik
да не я вроде смотрел в браузере был
Если бы он был, то он бы вернул булево значение true или false.
artem
ну да ты прав
artem
туту какая-то муть
artem
а не чекбокс
artem
и как быть?
artem
aria-checked делать?
Alhimik
Искать признак активности чекбокса и проверять по нему. Остальное так же.