1 (изменено: Michael, 2021-01-23 03:12:35)

Тема: JS: Добавить автоскролл страницы, пока не найдет текст

Доброго времени суток.
Имеется такой скрипт (он внутри AHK скрипта, если это важно):

(
(() => {
   const coll = document.querySelectorAll('div#channel-info');
   let elem;
   for (let item of coll) {
      if ( item.innerText == 'StopGame.Ru' && (elem = item) )
         break;
   };
   if (elem)
      elem.parentNode.parentNode.querySelector('a#thumbnail').click();
   else
      alert('Не найдено!');
})();
)

Его суть: ищет введенное название канала, затем кликает на первый найденный видос с этого канала, со страницы поиска Ютуба.
Проблема вот в чем: часто нужные каналы с видосами находятся снизу, а поиск выдает только первые 20 результатов. Соответственно, нужно скроллить страницу до того момента, пока он не найдет нужное мне совпадение.

Нашел вроде то, что мне нужно:

elem.scrollIntoView(top)

Только как его запихнуть в основной скрипт, тот что выше, пока не понимаю. Прошу помощи...

UPDATE.
Построил ультра костыльный способ для вышеописанного средствами AHK.

page:=Chrome.GetPageByTitle("YouTube")
Loop 100
{
    Send {PgDn}  ; нажать клавишу
    Sleep 200  ; пауза в миллисекундах между нажатиями
}
Send {PgDn} ; отпустить клавишу

По факту он работает, но далеко не всегда так, как нужно.

Так что вопрос со вставкой бесконечного скролла до момента нахождения нужного канала, остается открытым.

2 (изменено: Michael, 2021-01-24 00:20:29)

Re: JS: Добавить автоскролл страницы, пока не найдет текст

Update. Удалось добавить скролл в JS.
Теперь спроллит до упора, пока не найдет нужное значение.
Если кому нужно:

(() => {
   const coll = document.querySelectorAll('div#channel-info');
   let elem;
   for (let item of coll) {
      if ( item.innerText == 'НАЗВАНИЕ КАНАЛА' && (elem = item) )
         break;
   };
   if (elem)
      elem.parentNode.parentNode.querySelector('a#thumbnail').click();
   else
   setTimeout(function () {
      window.scrollBy(0,5500);
   }, 1000);   
})();

Может не самый "правильный" способ, но работает на ура!

3 (изменено: alexii, 2021-01-24 00:40:13)

Re: JS: Добавить автоскролл страницы, пока не найдет текст

Michael, а если такого текста в принципе нет на странице?

4 (изменено: Michael, 2021-01-24 00:51:40)

Re: JS: Добавить автоскролл страницы, пока не найдет текст

alexii
В моем случае он рано или поздно будет, ибо ключевой запрос в поиске Ютуба задается мной в ручную.

И да, сейчас проверил, моё "творение" не работает опять...
Я понимаю что нужно сделать, но не понимаю как...
Мне надо зациклить выполнение этого:

   setTimeout(function () {
      window.scrollBy(0,5500);
   }, 1000);   

пока не найдется элемент по которому кликнуть:

 elem.parentNode.parentNode.querySelector('a#thumbnail').click();


Пробовал еще так (после этого страница тупо виснет):

(() => {
   const coll = document.querySelectorAll('div#channel-info');
   let elem;
   for (let item of coll) {
      if ( item.innerText == 'Skibyxa' && (elem = item) )
         break;
   };
   if (elem)
      elem.parentNode.parentNode.querySelector('a#thumbnail').click();
   else
      while (true) {
      window.scrollBy(0,5500);
      };
})();

5

Re: JS: Добавить автоскролл страницы, пока не найдет текст

С первого взгляда видно, что ошибка. Что это такое?

if ( item.innerText == 'Skibyxa' && (elem = item) )

Может быть так?

if ( (item.innerText == 'Skibyxa') && (elem == item) )

6

Re: JS: Добавить автоскролл страницы, пока не найдет текст

Cytrus
Благодарю, подправил. Только странно, что поиск по слову работал и с ошибкой и без, исправление ни на что не повлияло. А как правильно добавить скроллинг сюда я до сих пор не пойму... Не подскажите?

7 (изменено: teadrinker, 2021-01-24 14:35:06)

Re: JS: Добавить автоскролл страницы, пока не найдет текст

Cytrus, уверены, что там ошибка? Этот код я писал, если что.
Смотрите здесь: Приоритет операторов
Michael
Попробуйте так:

((channelName) => {
   function searchChannel(channelName) {
      const coll = document.querySelectorAll('div#channel-info');
      let elem = '';
      for (let item of coll) {
         if ( item.innerText == channelName && (elem = item) )
            break;
      }
      return elem;
   }
   let channel = '', allElemsCount = 0, counter = 0;
   let timerId = setInterval(() => {
      if ( (channel = searchChannel(channelName)) || counter == 5 ) {
         clearInterval(timerId);
         if (channel)
            channel.parentNode.parentNode.querySelector('a#thumbnail').click();
         else
            alert('Not found!');
      }
      else {
         let newAllElemsCount = document.querySelectorAll('a#thumbnail').length;
         if (!(newAllElemsCount > allElemsCount))
            counter++;
         else {
            allElemsCount = newAllElemsCount;
            window.scrollTo(0, document.querySelector('ytd-app').scrollHeight);
         }
      }
   }, 2000);
})('ИМЯ КАНАЛА');

Имя канала в самом конце вставляйте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: JS: Добавить автоскролл страницы, пока не найдет текст

Благодарю за код, чуть позже протестирую, с телефона сейчас.

В строке: function searchCannel(channelName) {
searchCannel не должен быть searchCHannel?

И тут тоже:

 if ( (channel = searchCannel(channelName)) || counter == 5 ) {

9

Re: JS: Добавить автоскролл страницы, пока не найдет текст

Да, опечатка, но в данном случае ни на что не влияет, можете исправить в обоих местах.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: JS: Добавить автоскролл страницы, пока не найдет текст

teadrinker
Можно ещё вопрос, за что отвечает параметр “counter == 5” в данной строке?

 if ( (channel = searchCannel(channelName)) || counter == 5 ) {

11

Re: JS: Добавить автоскролл страницы, пока не найдет текст

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

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: JS: Добавить автоскролл страницы, пока не найдет текст

teadrinker
Большое спасибо!!! Всё протестировал - всё работает!

13

Re: JS: Добавить автоскролл страницы, пока не найдет текст

teadrinker, а что, в условиях можно делать присваивания?

Вы в условиях делаете присваивания переменным?

14

Re: JS: Добавить автоскролл страницы, пока не найдет текст

А разве это запрещено? (elem = item) в контексте условного оператора возвращает true.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: JS: Добавить автоскролл страницы, пока не найдет текст

https://habr.com/ru/post/141746/

16

Re: JS: Добавить автоскролл страницы, пока не найдет текст

Malcev, ну, разных мнений может быть много. С моей точки зрения читается нормально, выглядит компактно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder