@chpd

Как выполнить поиск по странице сайта?

Здравствуйте! Подскажите код, каким образом можно выполнить поиск текста (предложения) по странице сайта и кликнуть по нему? Аналогично ctrl+f, только через код. В интернете нашел пару примеров прикреплю ниже, 1 вариант очень много раз кликает по тексту, что вызывает за собой кучу открытых вкладок, 2 вообще как будто не работает., пытался к нему еще строчку с кликом добавить, не вышло. Посмотрите пж, я не программист, точно отредактировать не смогу.

spoiler
if (document.all !== undefined)
    {
      var items = document.all;
    }
    else
    {
      var items = document.getElementsByTagName("*");
    };                    
        for (var i = 0; i < items.length; ++i) {
        if (items[i].textContent.includes("Your Text Here")) {
            console.log("success"); 
            items[i].click();
        }
    }
var searchString = 'con';
var source = document.getElementsByTagName('html')[0].innerHTML;
if(source.search(searchString) !== -1) {alert("NeedCheck!");}
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Это плохой код. Он ищет эту вашу строку во всех элементах, и при разметке

<html>
<body>
 <section>
  <article>
   <h1>
    <span>your text</span>
   </h1>
  </article>
 </section>
</body>
</html>

он кликнет по каждому из этих элементов, так как в каждом их них есть этот текст.
Если вас это не устраивает. надо как минимум проверять глубину вложенности и кликать только по самому глубокому из найденных.
Ну и вообще код странный - includes() из ES2015 рядом с давно устаревшими var и document.all.
Ответ написан
Комментировать
@sewaca
Для начала давайте поймем а что именно вам нужно
Если задача кликнуть, значит элемент, очевидно, должен быть кликабельным
Значит это либо button, либо input[type="button"], либо тег a

Код который вы привели в пример (назвав его 1 вариантом) выбирает все теги на странице, а затем проверяет каждый из них. Это значит, что кнопка, прописанная в html как <button> <span>текст</span> </button> будет кликнута (а точнее, будет вызван обработчик клика по ней) как минимум 2 раза (первый, когда кликаем на тег span, второй когда жмем на тег button)
Отсюда и возникает баг с многоразовым нажатием

Если задача и правда сводится к тому, что нужно проверить все элементы, и, если они содержат какой-то текст, кликнуть на них, то логичнее использовать код, который и выбирает только кликабельные элементы. Примерно так:
const items = document.querySelectorAll("input[type=button], button, a");

items.forEach((item)=>{
      if (item.textContent.includes("Your Text Here")){
            console.log("success"); 
            items[i].click();
      }
});

Это не только поможет избежать багов, но и существенно ускорит ваш код

P.S.: Любые операции с DOM-деревом заметно замедляют ваш код. Старайтесь как можно реже использовать подход с проверкой содержимого всех DOM-элементов (как в этом кейсе).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы