Alhimik
waitFor is deprecated and will be removed in a future release - можно это как то убрать из консоли?
Загляни в документацию, этот метод устаревший, вместо него используй что-то более конкретное.
Andrey
видимо это)
🦋noteee
Что значит просто ждать?
await page.keyboard.type в headless: true работает не всегда правильно, вводит текст неправильно, не всегда, а где-то в 50% случаев, а в headless: false всегда правильно
🦋noteee
Не подскажете как исправить?
Alhimik
await page.keyboard.type в headless: true работает не всегда правильно, вводит текст неправильно, не всегда, а где-то в 50% случаев, а в headless: false всегда правильно
Что угодно может быть. Слишком неопределённо. Используй таймаут, например, как советуют выше (хотя это не решение обычно, а костыль), ну или разберись детальней в проблеме и предоставь больше информации.
Alhimik
Вообще первый раз слышу чтобы вводил текст неправильно. )
🦋noteee
Информация которую он вводит
🦋noteee
Изменилась концовка
🦋noteee
Путает цифры местами что ли
Andrey
так и начала нет
🦋noteee
так и начала нет
Да, начало он тоже пропустил. а в headless: false всегда все нормально
Alhimik
Путает цифры местами что ли
Это из-за того что в такого рода формах часто используются валидаторы и автоматическое перекидывание фокуса на следующее поле.
Andrey
for() { puppeteer.launch // code browser.close(); }
вот //code надо смотреть
🦋noteee
Alhimik
Да, все правильно. Фокус сам перекидывается на следующее поле. Такое только в headless: true
Ну так проверяй на каком поле фокус и от этого уже действуй.
Andrey
после клика на поле добавить паузу при вводе данных использовать задержку await page.keyboard.type('World', { delay: 100 }); // Types slower, like a user
🦋noteee
Ну так проверяй на каком поле фокус и от этого уже действуй.
Нету возможности. Селектор с полем есть, но доступа к нему нету. puppetter его не видит
🦋noteee
Я делаю клик на ближайший к полю селектор и начинаю ввод
Alhimik
Нету возможности. Селектор с полем есть, но доступа к нему нету. puppetter его не видит
Я уже писал, скорей всего оно внутри iframe. А ты ищешь на основной странице.
Alhimik
Ты так и не скинул скриншот, как я просил.
🦋noteee
Ты так и не скинул скриншот, как я просил.
Я тогда уже был не у ПК, а потом понял, что проще кликать куда-то рядом. Ибо знаний у меня не особо много
Alhimik
Если форма внутри iframe, нужно перебирать все фрэймы (page.frames()) и искать нужный. И с ним уже работать нормально, там и фокус проверить можно будет.
🦋noteee
Как только переключаюсь на консоль он перестает выделяться
Alhimik
Я тогда уже был не у ПК, а потом понял, что проще кликать куда-то рядом. Ибо знаний у меня не особо много
> знаний у меня не особо много Лучше сейчас потратить время на изучение, чем тратить время на обходные костыли. )
Alhimik
Ну вот видишь, розовым подсвечивает iframe.
Alhimik
А как мне понять, какой мне именно нужен и как работать с ним?
А работать с фрэймом так же как и с обычной страницей.
🦋noteee
Искать по названию/url.
А как мне отсюда получить его название или url что бы я потом из массива смог достать нужный
🦋noteee
Он в консоле не подписан насколько я вижу
🦋noteee
<ref *3> Frame { _url: 'https://js.stripe.com/v3/elements-inner-card-bf704553c6b74a21439bf17a33cfc6e6.html#wait=false&hidePostalCode=true&style[base][fontFamily]=Arial%2C+sans-serif&style[base][fontSize]=15px&style[base][color]=%23000000&style[invalid][color]=red&rtl=false&componentName=card&keyMode=live&apiKey=pk_live_kGVe6MDX1aZdiOiFocBuExkU&referrer=https%3A%2F%2Fforgottenanimals.ru%2Fdonate%2F&controllerId=__privateStripeController1051', _detached: false, _loaderId: 'D684A3CC51B0DFDC6FF5D5AAE4BB393E', _lifecycleEvents: Set(5) { 'init', 'DOMContentLoaded', 'load', 'networkAlmostIdle', 'networkIdle' }, _frameManager: FrameManager { eventsMap: [Map], emitter: [Object], _frames: [Map], _contextIdToContext: [Map], _isolatedWorlds: [Set], _client: [CDPSession], _page: [Page], _networkManager: [NetworkManager], _timeoutSettings: [TimeoutSettings], _mainFrame: [Frame] }, _parentFrame: <ref *1> Frame { _url: 'https://forgottenanimals.ru/donate/', _detached: false, _loaderId: '93C7464A41F2575E023F0642F5821B29', _lifecycleEvents: [Set], _frameManager: [FrameManager], _parentFrame: null, _id: '6EB896C01CE53A78C96091C48CE166D7', _mainWorld: [DOMWorld], _secondaryWorld: [DOMWorld], _childFrames: [Set], _name: undefined }, Это из puppeteer
🦋noteee
А это из консоли
🦋noteee
У них довольно сильно схожи ссылки
Alhimik
А как мне отсюда получить его название или url что бы я потом из массива смог достать нужный
Ну так поиск подстроки сделай по слову Stripe, например. Или можешь вывести все имена и url каждого фрэйма и посмотреть что там вообще есть.
🦋noteee
У них довольно сильно схожи ссылки
Но они не полностью одинаковые
Alhimik
Но они не полностью одинаковые
Ты можешь использовать регулярные выражения или frame.url().startsWith("НАЧАЛО_URL"), к примеру и т.д.
🦋noteee
Ты можешь использовать регулярные выражения или frame.url().startsWith("НАЧАЛО_URL"), к примеру и т.д.
Понял. Вот я нашёл например нужный frames. [my_frames] Как мне его использовать, например, что бы сделать клик по селектору?
Alhimik
🦋noteee
^
Да, как и обычно, но я же где-то должен указать, что работаю с фрэймом?
🦋noteee
Что то я неправильно сделал
Andrey
my_frame = frames[i] break
🦋noteee
my_frame = frames[i] break
my_frame.click is not a function
🦋noteee
Все точно так же ;c
Andrey
вначале let my_frame = null после цикла console.log(my_frame) по всей видимости условие для поиска фрейма не выполнено и выведет null
🦋noteee
вначале let my_frame = null после цикла console.log(my_frame) по всей видимости условие для поиска фрейма не выполнено и выведет null
Условие выполнено, но сейчас проверю. Я вот думаю из-за асинхронности так. Я внутрь асинхронного кода сунул синхронный, или это не влияет?
Alhimik
my_frame.click is not a function
Откуда ты взял _url? Там наверное надо frame.url().
🦋noteee
Откуда ты взял _url? Там наверное надо frame.url().
Я по _url ищу нужный фрэйм через .test
🦋noteee
Консоль
🦋noteee
Код
🦋noteee
Не нашёл фрэйм, но ранее он его искал. Почему перестал то((
Andrey
метод url() а в _url это что-то служебное
Andrey
но в любом случае может не помочь)
🦋noteee
метод url() а в _url это что-то служебное
Не понял как это сделать
Andrey
if (/elements-blablabla/.test(frame[i].url())
🦋noteee
🦋noteee
Почему то тут только 1 фрэйм
🦋noteee
if (/elements-blablabla/.test(frame[i].url())
Думаю не поможет. frames() выдает только 1 фрэйм почему-то
🦋noteee
Ранее выдал порядка 10-15
Alhimik
Почему то тут только 1 фрэйм
Возможно он ещё не подгрузился.
Alhimik
Ищи условие, когда он загружается.
🦋noteee
Ищи условие, когда он загружается.
Не понял, как мне можно найти такое условие?
Alhimik
Не понял, как мне можно найти такое условие?
Ну он же может по клику форму подгружать или ещё как-то. А ты сразу ищешь наверное.
🦋noteee
Ну он же может по клику форму подгружать или ещё как-то. А ты сразу ищешь наверное.
Да, ищу сразу. А как мне узнать когда именно он подгружается?
Alhimik
В крайнем случае можешь по таймауту проверять каждые 100 мс пока не увидишь нужный фрэйм, но это не рекомендуется.
🦋noteee
Изучать сайт. )
А вот с этим будут конкретные проблемки((