Задать вопрос
@The_Earth1

JavaScript. Цикл. Кнопка?

Всем доброго времени суток)

На сайте есть таймер и по его истечении с небольшой задержкой появляется кнопка (с известным заранее class'ом). На неё можно нажать с помощью команды в консоли браузера:
document.getElementsByClassName('ButtonClass')[0].click();

Но нужно не одиночное нажатие, а многократное и именно в тот момент как в самом HTML-коде страницы появился её class, пока не получится совершить действие с помощью этой кнопки. Пробовал сделать это так с надеждой, что в консоли браузера код будет исполняться и каждый раз нажимать на кнопку:
while (true) {
document.getElementsByClassName('ButtonClass')[0].click();
}

Но после этого цикла команда зависает(.

Может можно написать скрипт в консоли Chrome, чтобы на кнопку нажалось сразу, как это станет возможно?
  • Вопрос задан
  • 708 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Повторять попытки не сразу, а с небольшой задержкой:
function clicker() {
  const el = document.querySelector(".button-class-name");
  if (el) {
    el.click(); // кликнули и закончили
  } else {
    setTimeout(clicker, 500); // эх, раз, ещё раз, через пол-секунды
  }
}

clicker();
Ответ написан
Комментировать
zkrvndm
@zkrvndm
Архитектор решений
Я дам вам функцию кликер с одного из своих расширений, используйте его:
Асинхронная функция кликер
function clickElements(selector, regexp, where) {
	
	return new Promise(function(returnResult) {
		
		var search_result = false;
		
		var local_reactive_function = function() {
			
			var click_elements = searchElements(selector, regexp, where);
			
			if (click_elements.length > 0) {
				
				if (search_result === false) {
					
					search_result = true;
					
					await wait(100);
					
					var click_elements = searchElements(selector, regexp, where);
					
					if (click_elements.length > 0) {
						
						observer.disconnect();
						
						for (var n = 0; n < click_elements.length; n++) {
							click_elements[n].click();
						}
						
						returnResult(click_elements.length);
						
					}
					
					else {
						
						search_result = false;
						local_reactive_function();
						
					}
					
				}
				
			}
			
		}
		
		var observer = new MutationObserver(local_reactive_function);
		
		observer.observe(document.body, {
			characterData: true,
			attributes: true,
			childList: true,
			subtree: true
		});
		
		local_reactive_function();
		
	});
	
}

function searchElements(selector, regexp, where) {

	var search_elements = [];
	
	if (typeof where !== 'undefined') {
		
		var all_elements = where.querySelectorAll(selector);
		
	}
	
	else {
		
		var all_elements = document.querySelectorAll(selector);
		
	}
	
	for (var n = 0; n < all_elements.length; n++) {
		
		if (typeof regexp == 'object') {
			
			if (typeof regexp.test == 'function') {
				
				if (regexp.test(all_elements[n].innerText.trim())) {
					
					search_elements.push(all_elements[n]);
					
				}
				
			}
			
			
		}
		
		else {
			
			search_elements.push(all_elements[n]);
			
		}
	}
	
	return search_elements;

}

function wait(ms) {
	
	return new Promise(function(success) {
		
		setTimeout(function() {
			success(true);
		}, ms);
		
	});
	
}

Чтобы кликнуть элемент с заранее известным классом просто вызывайте clickElements:
(async function() {
    await clickElements('CSS-селектор');
})();

Функция clickElements обязательно дождется появления кнопок соответствующих указанному CSS-селектору, подождет 100 мс. после появления кнопок, после чего все их нажмёт. Обратите внимание, что если кнопок соответствующих селектору будет несколько, будут нажаты они все, поэтому тщательно подбирайте селектор.

P. S. Если вам нужно после появления кнопки кликать его безостановочно, просто используйте цикл:
(async function() {
    while(true) {
        await clickElements('CSS-селектор');
        console.log('Успешно выполнен клик');
    }
})();

После появления кнопки клики на него начнут сыпаться с частой один клик каждые 100 мс. пока кнопка не исчезнет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы