Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.07.2023, 01:59
Новичок на форуме
Отправить личное сообщение для SeDo4 Посмотреть профиль Найти все сообщения от SeDo4
 
Регистрация: 08.01.2014
Сообщений: 3

Дождаться загрузки данных после клика по ссылке
Добрый день.

Есть код (запускается в консоле браузера)
var itemСount = 5

var i=0
f=function(){
    document.getElementsByClassName('b-link js-show-item')[i].click()            
    var trackId = document.getElementsByClassName('b-form__text b-form__text_state_item-value b-tracking')[0].outerText
    console.log(trackId)
//и ещё много кода
    
    i=i+1
    
    if (i<itemСount) { 
        setTimeout(f, "1000")
    }
}
f();


Он перебирает нужные элементы и кликает по ним. При клике на сайте открывается попап, из которого забирается нужная информация. И так, пока не будет выполнено условие.

Суть проблемы в том, что при первом запуске в консоле ошибка:
Код:
Cannot read properties of undefined (reading 'outerText')
Подозреваю это из-за того, что попап с данными ещё не успел появится. Так как при повторном запуске кода ошибка исчезает.

Но не пойму как сделать так, чтобы после клика дождаться появления попапа с данными.

Попробовал добавить setInterval, но либо не так сделал, либо он не помогает:

var itemСount = 5

var i=0
f=function(){
    console.log(i)
    document.getElementsByClassName('b-link js-show-item')[i].click()
    console.log('click')
    let k = setInterval(function() {
        console.log(i + '<---in setInterval')
        if (document.getElementsByClassName('b-form__text b-form__text_state_item-value b-tracking')[0]){
            var trackId = document.getElementsByClassName('b-form__text b-form__text_state_item-value b-tracking')[0].outerText
            console.log(trackId)
            clearInterval(k);
            console.log("element found")
        } else {
            console.log('another try')
        }
    }, 1000);
    
    i=i+1
    
    if (i<itemСount) { 
        console.log(i)
        setTimeout(f, "1000")
    }
}
f();


При первом запуске получаю следующее:
Код:
0
click
1
undefined
content<---in setInterval
 78683603532394
element found
content

Uncaught TypeError: Cannot read properties of undefined (reading 'click')
И снова, если запустить второй раз, то всё ок работает до момента перезагрузки страницы.

В общем, что-то никак у меня не выходит решить проблему. Прошу помощи.
Ответить с цитированием
  #2 (permalink)  
Старый 09.07.2023, 12:16
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Вопрос, можно ли кликать по следующей ссылке, пока есть попап окно от предыдущей?
Может надо запускать повторно f() не просто через 1 сек, а только тогда, когда уже обработано предыдущее окно.
Что то типа такого
var itemСount = 5
 
var i=0
f=function(){
    console.log(i)
    document.getElementsByClassName('b-link js-show-item')[i].click()
    console.log('click')
    let k = setInterval(function() {
        console.log(i + '<---in setInterval')
        if (document.getElementsByClassName('b-form__text b-form__text_state_item-value b-tracking')[0]){
            var trackId = document.getElementsByClassName('b-form__text b-form__text_state_item-value b-tracking')[0].outerText
            console.log(trackId)
            clearInterval(k);
            console.log("element found");
            
			i=i+1			 
			if (i<itemСount) {
				console.log(i)
				setTimeout(f, 100)
			}
        } else {
            console.log('another try')
        }
    }, 1000);
     
}
f();
Ответить с цитированием
  #3 (permalink)  
Старый 09.07.2023, 14:14
Новичок на форуме
Отправить личное сообщение для SeDo4 Посмотреть профиль Найти все сообщения от SeDo4
 
Регистрация: 08.01.2014
Сообщений: 3

Сообщение от voraa Посмотреть сообщение
Вопрос, можно ли кликать по следующей ссылке, пока есть попап окно от предыдущей?
Может надо запускать повторно f() не просто через 1 сек, а только тогда, когда уже обработано предыдущее окно.
Да, кликать по следующей ссылке можно. Это отрабатывается корректно и визуально (меняются попапы) и при повторном запуске кода (данные корректно считываются).

Попробовал ваш вариант. Ошибка исчезла, но почему-то код перестаёт работать после первого обработанного элемента:

Код:
0
click
undefined
content<---in setInterval
78683603532394
 element found
Ещё всё никак не пойму пару моментов:
1) откуда берётся undefined (отображается даже при отсутствии вывода чего-либо в консоль)
2) почему переменная i при повторном выводе в консоль отображается как "content"
Ответить с цитированием
  #4 (permalink)  
Старый 09.07.2023, 15:32
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от SeDo4
откуда берётся undefined (отображается даже при отсутствии вывода чего-либо в консоль)
У меня нет вашей задачи и я не вижу, что у вас на экране в консоле.
undefined может отображаться, как возвращаемое значение при вызове функции f();
Сообщение от SeDo4
почему переменная i при повторном выводе в консоль отображается как "content"
У меня нет привычки запускать код в консоле, но могу предположить только, что ваша переменная i как то конфликтует с существующей на странице переменной i
Попробуйте инкапсулировать весь ваш код поместив его в блок {}, а все переменные задать через let.
Ответить с цитированием
  #5 (permalink)  
Старый 09.07.2023, 15:57
Новичок на форуме
Отправить личное сообщение для SeDo4 Посмотреть профиль Найти все сообщения от SeDo4
 
Регистрация: 08.01.2014
Сообщений: 3

Сообщение от voraa Посмотреть сообщение
У меня нет привычки запускать код в консоле, но могу предположить только, что ваша переменная i как то конфликтует с существующей на странице переменной i
Попробуйте инкапсулировать весь ваш код поместив его в блок {}, а все переменные задать через let.
Спасибо! Поменял название переменной и теперь код отрабатывает с первого раза без ошибок.
Благодарю!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добиться, чтобы прогресс бар в модальном окне запускался после клика по ссылке да Lefseq Общие вопросы Javascript 3 06.10.2019 20:39
Выполнение скрипта после загрузки контента с другой страницы TibiTotoro Общие вопросы Javascript 2 26.04.2018 15:04
Клик по ссылке после загрузки страницы на JS kikosik666 Events/DOM/Window 6 12.04.2018 17:11
выполнение функции после загрузки страницы kowapos Общие вопросы Javascript 2 31.03.2014 02:57
Выполнить код после загрузки изображения EugenyK Events/DOM/Window 2 15.07.2008 10:09