Как поправить код в javascript

S2
На сайте с 12.06.2011
Offline
126
365

Доброго времени суток. Подскажите есть скрипт он применяется в ZennoPoster. скрипт рабочий и предназначен для клика по надписи "Показать ещё 5", где цифра может меняться. надписи "Показать ещё 5" прикреплена к конкретному блоку "Нежилые помещения" и действия осуществляются только в этом блоке. сам скрипт отрабатывает и делает клик по надписи, но когда текст полностью исчезает даже из DOM страницы, то скрипт все равно продолжает кликать. как сделать так, чтобы после пропадания надписи скрипт прекращал работу. приложил скрипт и код из DOM.

(function() {
    // Функция для клика по кнопке "Показать ещё"
    function clickShowMore() {
        try {
            const titles = document.querySelectorAll('.FlatGroups__Title-sc-jd2s28-15');
 
            for (let i = 0; i < titles.length; i++) {
                const title = titles[i];
 
                if (title.textContent.trim() === 'Нежилые помещения') {
                    const mainWrapper = title.closest('.FlatGroups__FlatGroupWrapper-sc-jd2s28-8');
 
                    if (mainWrapper) {
                        const showMoreBtn = mainWrapper.querySelector('.FlatGroupDetails__ButtonMore-sc-1uwm85r-3');
 
                        if (showMoreBtn) {
                            const buttonText = showMoreBtn.textContent.trim();
 
                            if (buttonText.includes('Показать ещё')) {
                                console.log('Кликаем по кнопке "Показать ещё"');
                                showMoreBtn.click();
                                console.log('Кликнули по кнопке "Показать ещё"');
 
                                // Задержка (блокирующая, но более совместимая)
                                var start = new Date().getTime();
                                for (var j = 0; j < 1e7; j++) {
                                    if ((new Date().getTime() - start) > 1000){
                                        break;
                                    }
                                }
 
                                return "CLICKED"; // Кликнули, нужно повторить
                            } else {
                                console.log('Кнопка "Показать ещё" не содержит ожидаемый текст.');
                            }
                        } else {
                            console.log('Кнопка "Показать ещё" не найдена.');
                        }
                    }
                }
            }
 
            console.log("Показать ещё" отсутствует. Завершаем работу.');
            return "DONE"; // Кнопки нет, заканчиваем
        } catch (error) {
            console.error('Произошла ошибка:', error);
            return "ERROR"; // Произошла ошибка
        }
    }
 
    let result = clickShowMore();
    return result; // Возвращаем результат
})();



txt mfa_ei_html.txt
TB
На сайте с 16.01.2009
Online
264
#1
sotex2 :

Доброго времени суток. Подскажите есть скрипт он применяется в ZennoPoster. скрипт рабочий и предназначен для клика по надписи "Показать ещё 5", где цифра может меняться. надписи "Показать ещё 5" прикреплена к конкретному блоку "Нежилые помещения" и действия осуществляются только в этом блоке. сам скрипт отрабатывает и делает клик по надписи, но когда текст полностью исчезает даже из DOM страницы, то скрипт все равно продолжает кликать. как сделать так, чтобы после пропадания надписи скрипт прекращал работу. приложил скрипт и код из DOM

Такие вопросы надо решать через чатгпт

Проблема, скорее всего, в том, что после исчезновения текста кнопки DOM-дерево может измениться, но скрипт продолжает работать потому что цикл повторного клика не выходит при отсутствии элемента. Ниже можно предложить несколько подходов, чтобы остановить работу после пропадания надписи.

Предлагаемые решения (выберите один или комбинируйте):

  1. Проверка наличия кнопки перед каждым кликом
  • перед кликом по кнопке повторно проверяйте, что кнопка все еще содержит нужный текст и что элемент действительно существует.
  • если кнопка или текст исчезли — вернуть DONE и завершиться.
  1. Введение глобального флага завершения
  • хранить состояние завершения в переменной и выходить, если значение стало DONE (например, после очередной итерации проверки).
  1. Ограничение числа кликов
  • задайте максимально допустимое число кликов за одну сессию или за окно DOM, чтобы избежать бесконечного цикла.
  1. Асинхронная имитация кликов с проверками
  • вместо синхронной «массивной» задержки ставьте небольшие паузы и повторно проверяйте наличие текста.

Ниже пример переработанного скрипта с учетом пунктов 1 и 2. Он пытается кликнуть по кнопке только если она действительно указывается как кнопка “Показать ещё” внутри блока “Нежилые помещения” и прекращает работу, если надпись исчезла.


(function() {
    // Флаг завершения
    let finished = false;

    // Функция для клика по кнопке "Показать ещё"
    function clickShowMore() {
        try {
            // Находим все секции с заголовками
            const titles = document.querySelectorAll('.FlatGroups__Title-sc-jd2s28-15');

            for (let i = 0; i < titles.length; i++) {
                const title = titles[i];

                // Ищем нужную секцию по тексту
                if (title.textContent.trim() === 'Нежилые помещения') {
                    const mainWrapper = title.closest('.FlatGroups__FlatGroupWrapper-sc-jd2s28-8');

                    if (mainWrapper) {
                        const showMoreBtn = mainWrapper.querySelector('.FlatGroupDetails__ButtonMore-sc-1uwm85r-3');

                        if (showMoreBtn) {
                            const buttonText = showMoreBtn.textContent.trim();

                            // Проверяем текст кнопки и наличие элемента
                            if (buttonText.includes('Показать ещё')) {
                                console.log('Кликаем по кнопке "Показать ещё"');
                                showMoreBtn.click();
                                console.log('Кликнули по кнопке "Показать ещё"');

                                // Небольшая задержка (можно заменить на более точную, но без блокирующей)
                                const start = Date.now();
                                while (Date.now() - start < 100) {
                                    // просто ждать ~100мс, не блокируя основной поток слишком долго
                                    // можно оставить пустым, но цикл даст минимальную задержку
                                }

                                return "CLICKED"; // попробовали кликнуть, повторим цикл
                            } else {
                                console.log('Кнопка "Показать ещё" не содержит ожидаемый текст.');
                                // Раздел про завершение: кнопка есть, но текст другой — возможно она недоступна
                                // Продолжаем цикл поиска по другим секциям
                            }
                        } else {
                            console.log('Кнопка "Показать ещё" не найдена.');
                        }
                    }
                }
            }

            // Если ни одна секция не содержит нужной кнопки — завершаем
            console.log("Показать ещё" отсутствует. Завершаем работу.");
            finished = true;
            return "DONE";
        } catch (error) {
            console.error('Произошла ошибка:', error);
            finished = true;
            return "ERROR";
        }
    }

    // Основной цикл выполнения: повторяем до DONE или ERROR
    // Ограничение по количеству повторов, чтобы не зацикливаться бесконечно
    let maxTries = 50;
    let result = "PENDING";

    while (!finished && maxTries-- > 0) {
        result = clickShowMore();
        if (result === "CLICKED") {
            // повторяем попытку повторного клика в следующем проходе
            // можно добавить небольшую задержку
            // здесь просто идём к следующей итерации
            continue;
        } else {
            // DONE или ERROR - завершаемся
            break;
        }
    }

    return result;
})(); 

Дополнительные заметки:

  • Не обновляйте документ автоматически после каждого изменения; если используете блоки, дождитесь последних требований пользователя.
  • В реальном ZennoPoster возможны ограничения по синхронному выполнению скриптов в DOM-окне. Если среда поддерживает асинхронные ожидания, можно заменить цикл ожидания на более корректное ожидание появления/исчезновения элемента (MutationObserver и т.п.).
  • Если тексты на кнопке меняются динамически, можно добавить проверку по атрибутам кнопки или по классам, чтобы точнее определить состояние кнопки.

S2
На сайте с 12.06.2011
Offline
126
#2
СПАСИБО ЗА ОТКЛИК, НО ВАШ СКРИПТ НА ДАННЫЙ МОМЕНТ ДАЖЕ ПО КНОПКЕ НЕ КЛИКАЕТ, ПОЭТОМУ ОСНОВНУЮ ПРОБЛЕМУ РЕШАТЬ ПРИ ЭТОМ НЕТ СМЫСЛА.
TB
На сайте с 16.01.2009
Online
264
#3
sotex2 #:
СПАСИБО ЗА ОТКЛИК, НО ВАШ СКРИПТ НА ДАННЫЙ МОМЕНТ ДАЖЕ ПО КНОПКЕ НЕ КЛИКАЕТ, ПОЭТОМУ ОСНОВНУЮ ПРОБЛЕМУ РЕШАТЬ ПРИ ЭТОМ НЕТ СМЫСЛА.

это не мой скрипт. а чатгпт.  с первого раза он часто кодирует не совсем правильно.  и если после применения скрипта ему указывать какие ошибки возникают, то он переделывает код и рано или поздно код нормально заработает

Z0
На сайте с 03.09.2009
Offline
830
#4
TonyBlackberry #:

это не мой скрипт. а чатгпт.  с первого раза он часто кодирует не совсем правильно.  и если после применения скрипта ему указывать какие ошибки возникают, то он переделывает код и рано или поздно код нормально заработает

А зачем постить непонятный вам и непроверенный скрипт? =) Чтобы что?

TB
На сайте с 16.01.2009
Online
264
#5
ziliboba0213 #:

А зачем постить непонятный вам и непроверенный скрипт? =) Чтобы что?

ну как зачем? чтобы и вы отметились в данном топике)
Z0
На сайте с 03.09.2009
Offline
830
#6
TonyBlackberry #:
ну как зачем? чтобы и вы отметились в данном топике)

А вы считаете, что перепостив человеку нерабочий ответ чатгпт, даже не проверив его, принесли пользу кому-либо? =) Или вы проверили код, и он у вас работает?

eByeBots
На сайте с 10.12.2025
Offline
4
#7
Вам лучше обратиться на профильный форум и обрисовать подробно ТЗ.
Лучше использовать стандартные средства - конструктор действий zennoposter и поиск по XPath (JS может и не выполниться)

Без самого сайта трудно подсказать, но там полюбому есть блоки и классы. Когда кнопка активная у неё один класс, когда неактивна - другой. Так можно построить xpath и кликать на нужное, а если этого нет - значит идти по красной ветке.
Защита сайта от ботов на любом сайте - https://ebyebots.ru (+ скрыт айпи)
Александр Воробьев
На сайте с 03.02.2020
Offline
56
#8
Не совсем понятно, что значит "продолжает  работать" проверяет условия и не срабатывает и выводит 
Показать ещё" отсутствует. Завершаем работу

?

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

  let result = clickShowMore();
    return result; // Возвращаем результат

Я зено постером не пользовался. но с ути как я понял это автоматизация действий человека. И суть скрипта если есть нужные блоки на странице выполнить клик.  Вы хотите чтоб код не выполнялся, если на странице нет таковых блоков. Для этого нужно выполнить проверку наличия этих блоков (что данный код и выполняет). Что не так? и почему он не должен работать в этом сценарии?

Если бы функция вешалась обработчиком клика не какой то объект, вот тогда ее можно было бы убрать: при очередном клике проверяете что кликов больше не потребуется и снимаете обработчик.

Александр Воробьев
На сайте с 03.02.2020
Offline
56
#9

Если вы хотите уменьшить количестов проверок - доставайте из текста цифру и сохраняйте ее в глобальной переменной самой первой проверкой проверяйте значение.


В общем хорошо бы сначала описать саму суть решаемой проблемы.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий