Maksim
Меняется условно только цифра у корзины
Maksim
В каком смысле? )
Maksim
Вот я и не понял зачем мне дожидаться потом. У меня кнопка блочится от повторного нажатия. Я не могу просто параллельно следующий клик делать )
Maksim
А, так я тоже пробовал. Не работает
Maksim
Сейчас еще раз так попробую, может ошибку хоть поймаю. Я ошибку-то поймать не могу тоже
Maksim
waitForNavigation тупо ждет 30 секунд и умирает
Maksim
Вот такой код у меня, сейчас посмотрим
const elements = await page.$$( `button.addToCart` )
for ( const element of elements ) {
try {
const navigatePromise = page.waitForNavigation( {
waitUntil: "networkidle0"
} )
await element.tap()
await navigatePromise
} catch ( e ) {
console.log( e )
}
}
Maksim
Ну да, бесполезное сообщение:
TimeoutError: Navigation timeout of 30000 ms exceeded
Maksim
Хмм, интересно, что нажалось за это время 4 кнопки. То есть словно и не ждало await navigatePromise
Maksim
Когда текущих запросов 0.
Maksim
а нет, это при загрузке страницы
Maksim
Он ждет конкретный урл, а там при добавлении сложные данные отправляются через post, я такое сам не могу контролировать
Maksim
сейчас гляну
Maksim
Работает! Спасибо огромное ))
Pavel
Сделал тут вот такую штуковину https://github.com/munrocket/puppeteer-three может полезно будет кому. Экспресс и в 2 CI крутится.
Pavel
я заметил что в кукловоде бага когда делаешь evaluate(()=>{ elm.click() }) и он выдает ошибку Execution context was destroyed, most likely because of a navigation.
Pavel
Кто нибудь ставил puppeter-core вместо целого?
Roman
Я
Pavel
Я
Что на счет кроссплатформенности там? Ты в какой ос?
Pavel
npm i для других будет работать? Просто сейчас качается 100mb.
Andrey
Pavel
Pavel
Ничего не меняя завелось?
Pavel
Просто я под линухом, а юзер экспириенс может быть другой.
Roman
А что там может быть не так
Roman
Та же Либа, но не качает хромиум
Roman
Лаунчишь нужный тебе браузер и все
Roman
Да и launch же можно
Roman
Кто запрещает указать
Roman
Неужели там нет лаунчера? Должен быть
Pavel
Лаунчишь нужный тебе браузер и все
Проблема в том что скрипт должен запускать любой чел с минимумом телодвижений, было интересно на сколько сложно пользователям, а не кодерам.
Pavel
Без пупуртера да?)
Pavel
Ладно, попробую пупертер-коре сам, может подойдет.
Андрей
Ребят, привет, подскажите, как получить доступ к такому хитрому идентификатору?
id="N7:ViewHdrAttrInnerTable:0:Content"
В настоящий момент:
console.log(document.getElementById('N7:ViewHdrAttrInnerTable:0:Content').size)
Отдает undefined. Может как-то заэкранировать нужно?
1
Андрей
Попробуйте ":" экранировать в puppeteer так "\\:"
console.log(document.getElementById('N7\\:ViewHdrAttrInnerTable\\:0\\:Content').size)
<table class="xch xc8" tablestyle="classic" cellpadding="1" cellspacing="0" border="0" width="100%" summary="Таблица требований" id="N7:ViewHdrAttrInnerTable:0:Content" qbeenabled="false" horizontalscroll="true" policy="page" hideshow="true">
<tr><td>a1<td></tr>
<tr><td>a2<td></tr>
<tr><td>a3<td></tr>
</table>
К сожалению не получилось. Так же undefined
$('#N7\\:ViewHdrAttrInnerTable\\:0\\:Content').first().find('tr').size
Еще так пробовал:
$('[summary=Таблица\\ требований]').first().find('tr').size()
Результат тот же.
Не знаю, правильно ли я ли я экранировал пробел
Андрей
Мне нужно получить строки внутри таблицы
Андрей
Получается только так:
$('.xch.xc8').first()
Но это не совсем то, что нужно. Т.к. много с таким классом таблиц и куча интерактивщины нужно накликивать.
Андрей
Спасибо, гляну
1
Андрей
Точняк! Спасибо!
1
Подскажите, что это за ошибка Error: Execution context was destroyed, most likely because of a navigation? Появляется в хаотичном порядке и как отловить виновника? Ошибка указывается только на функцию, а в функции много чего.
1
Код большой, более 1000 строк, несколько десятков функций, которые между собой общаются. Ещё бы понять, где ошибка, т.к. она каждый раз в разных местах проявляется и какая именно часть кода не получается поймать. Возможно, страница рушится, т.к. она передаётся ещё в другие подключаемые модули. В интернете на англоязычных ресурсах пишут, что где-то селектор не находит, а вот как поймать, в ошибке не указывается конкретная строка, где селектор, а только на первую или последнюю строку функции, а функции есть по 200-300 строк кода.
1
Вот, например, такая же ерунда "puppeteer page.evaluate() randomly fails with: Execution context was destroyed, most likely because of a navigation"
1
Странно, что именно в случайном порядке появляется, но регулярно.
1
Понял из ответов на гитхабе, что проблема в не нахождении селекторов. В коде ошибки не находил конкретной ссылки, показывается цепочка функций, но не конкретных строк. Терминал закрыл с ошибками, чуть позже позапускаю, чтобы снова спровоцировать ошибки, скину сюда.
1
Надо перепроверить везде ли await, уже попадались строки, где забывал указывать. А вот без try catch вообще код не работает, так как очень много селекторов проверяет, если есть, то использует, а без try сразу ошибку выдаёт, не найден селектор. А принцип, если не найден и фиг с ним, пропускаем и идём дальше.
1
1
Сам код, куда указывает ошибка
1
236 и 256 строка функция loginCheck()
1
Смысл такой, после подключения считывает имя пользователя, если не находит, то проверяется сообщение ошибки на сайте и в зависимости от ошибки, скрипт продолжает какая именно была ошибка. Ошибка в пароле или капче.
1
Самое интересно, что не всегда такая ошибка появляется, запуски повторные с теми же параметрами, т.е. один в один, но иногда выдаёт эту странную ошибку.
1
После подключения пользователя загружается другая страница, верно. Но там стоит await page.waitForNavigation({ waitUntil: ['networkidle0', 'load'], timeout: 15000 });
Страница успевает прогрузиться за 15 сек, вернее за несколько секунд, но таймаут установил 15 сек, т.к. по умолчанию 30 сек.
Т.е. подключился, загрузилась другая страница и начинается проверка подключения.
1
Похоже, что проблема в waitForNavigation, не может отловить состояние страницы, если ставлю page.waitFor(10000) ошибка не возникает, но страница грузится всего за пару сек.
1
Действительно, убрал проверку, ошибка вроде не появляется. Скрипт переношу из iMacros, там без этой проверки вываливалась ошибка. Спасибо за подсказку.
1
Самое интересно, что если перед этим стоит просто ожидание 5-10 сек, то этот кусок кода выполнялся, если стоит waitForNavigation, то не видимо не выполнялся.
1
Ага, удаляет пробелы со всех сторон и там ещё есть символы перевода строки.
1
Спасибо, попробовал, работает. Уже не помню, почему именно регулярку использовал, больше года назад скрипт писал, год работал в iMacros, а сейсач "купила баба порося", решил перевести на puppeteer, что-то такой головняк с ним ))
1
Однозначно, что должен быть лучше, т.к. нужен запуск headless и несколько штук экземпляров, а лучше с несколько десятков, пока не придумал, как это воплотить. Надо посмотреть, сколько будет жрать памяти в headless.
1
Думал попробовать на python, но практики нет, да и не знаю, потянет ли http клиент там такой сайт бестолковый, кучу действий надо выполнить, в том числе авторизация, да и сам механизм логики выполнения задачи на сайте непростой. Код раздулся почти на 2 тыс строк, каждый раз приходится какие-то костыли придумывать, что уже теряю реальность, какой модуль за что отвечает, уже реальная паутина, функция через функцию и функцией погоняет, Любая ошибка, поиск уходит часами, если не днями )). Думал с нуля переписать, но один фиг возвращаюсь к такой паутине из-за алгоритма работы сайта.
1
Авторизация была нормально решена ещё на iMacros перенести не составило труда в puppeteer, отдельно шикарно работала, а как добавил в общий код, посыпались ошибки. Ранее не сталкивался с http клиентами, надо подумать, может действительно попробовать, но с куки не приходилось сталкиваться, пока не имею представления. Для http клиента, наверное, не сложно будет реализовать авторизацию с капчей, хотя фиг знает, не сталкивался.
1
Скорость работы и низкое потребление ресурсов подтолкнуло перейти на puppeteer. Сейчас запускается 5-7 iMacros в Firefox под разными профилям, но сжирает много памяти и сильно грузит систему.
Pavel
По крайней мере ту которую искал - да.
Pavel
Может уже починили конечно, и что то новое придумали.
Pavel
Ошибка Execution context was destroyed, most likely because of a navigation.
Pavel
Мне добавить это? await page.waitForNavigation()
Pavel
Хз короче как ловить ошибки, которые не всегда вылетают.
Pavel
Pavel
кстати варик, реально как еще то.
Pavel
может быть просто от не знания ошибка.
Pavel
Pavel
kek, консоль я пробросил на странице, если что.
Pavel
Если ставлю таймаут больше, то 5 печатается, сломал пупуртер.
Pavel
Вообщем суть такая, если не перешел на страницу, то и найти нечего. Когда он перейдет на нее никто не знает и определяется таймаутом.
Pavel
Pavel
А все, отбой, нужно было убрать таймаут и все.
Pavel
таймаут если есть и не достаточный он крашит скрипт.