Плавный скролл в JS

  • Автор темы Автор темы Deisler
  • Дата начала Дата начала

Deisler

Client
Регистрация
26.10.2019
Сообщения
517
Реакции
204
Баллы
43
Здравствуйте. Есть задача - листать стену группы в соц сети. Сначала я определяю расположение следующего поста, с помощью topinbowser, затем через кубик JS перехожу на область из переменной, которую получил в первом действии. Использую JS т.к. там можно вставлять переменные. И перехожу на нужное место (следующий пост) операцией window.scrollTo(0,{-Variable.Pixel_Element-}) . Подскажите как сделать этот переход плавным ? что бы был именно скролл, а не рывок до следующего поста. Заранее спасибо
 

Вложения

  • 2020-05-23_21-56-41.png
    2020-05-23_21-56-41.png
    28,2 KB · Просмотры: 337
кроме JS в зеннопостере больше ничего нет ? может для начала с обзора функционала программы начать, а не мучать JS ?
 
  • Спасибо
Реакции: Yuriy Zymlex
кроме JS в зеннопостере больше ничего нет ? может для начала с обзора функционала программы начать, а не мучать JS ?
Буду благодарен если подскажете как реализовать эту задачу на кубиках. Я этого не нашел
 
Вот есть зенновский метод для прокрутки колесика https://help.zennolab.com/en/v7/zennoposter/7.1.4/topic613.html
Спасибо ) Вы первый кто ответил что-то конкретное.

Про этот способ прокрутки я тоже знаю. Но это C#... В С#, к сожалению, нельзя вставлять значение из переменной, в которой лежат четкие координаты, до которых нужно скроллить и эти координаты постоянно меняются. В JS можно использовать значение из переменной. Поэтому я и использую JS. И все работает, но не скроллом а рывкообразно.

Мой вопрос в том как сделать плавный скролл в JS и возможно ли это вообще. Причину использования JS объяснил выше
 
нет, это автоматический скрол из одного моего бота
Тогда он сделан очень реалистично ) Но от того что я увидел реалистичный скролл, я не на каплю не приблизился к ответам на свои вопросы )))
 
  • Спасибо
Реакции: molotok
Тогда он сделан очень реалистично ) Но от того что я увидел реалистичный скролл, я не на каплю не приблизился к ответам на свои вопросы )))
Это сделано на основе метода, ссылку на который я давал выше
 
Тогда он сделан очень реалистично ) Но от того что я увидел реалистичный скролл, я не на каплю не приблизился к ответам на свои вопросы )))
Берем рандом 2 переменные width и height и далее 2 кубика C#
C#:
Развернуть Свернуть Копировать
//берем высоту страницы
// get main tab
Tab tab = instance.MainTab;
// get main document
Document doc = tab.MainDocument;
// get the height of document
int height = doc.Height;
return height;
//кладем в переменную scroll

и этим скроллим

C#:
Развернуть Свернуть Копировать
instance.ActiveTab.FullEmulationMouseMove(int.Parse(project.Variables["width"].Value),int.Parse(project.Variables["height"].Value)); //заводим курсор на нужное нам поле
instance.ActiveTab.FullEmulationMouseWheel(0,int.Parse(project.Variables["scroll"].Value)); //скролим куда нам нада
 
Это сделано на основе метода, ссылку на который я давал выше
Я в PM 2 или 3 недели ) На сложные решения задач и на максимальную реалистичность я пока не претендую, если конечно кто-нибудь не поделится своими наработками)))
я тестировал FullEmulationMouseWheel но сам по себе он работал у меня в цикле с одинаковой скоростью прокрутки и с немаленькими задержками после каждого цикла. Другими словами что бы добиться реалистичности нужно изучать c# , а именно - как увеличивать и уменьшать скорость, как делать это увеличение и уменьшение рандомным, как подставлять в значение скролла координаты следующего поста, как в этом коде определить координаты следующего поста...
короче тут уже надо полноценно изучать c# а это просто откинет меня от видимых результатов на несколько месяцев в лучшем случае и отобьет желание всем этим заниматься. Поэтому я и ищу пока простые решения, без максимальной реалистичности и без углубления в C#

Спасибо что откликнулись на мои вопросы )
 
Берем рандом 2 переменные width и height и далее 2 кубика C#
C#:
Развернуть Свернуть Копировать
//берем высоту страницы
// get main tab
Tab tab = instance.MainTab;
// get main document
Document doc = tab.MainDocument;
// get the height of document
int height = doc.Height;
return height;
//кладем в переменную scroll

и этим скроллим

C#:
Развернуть Свернуть Копировать
instance.ActiveTab.FullEmulationMouseMove(int.Parse(project.Variables["width"].Value),int.Parse(project.Variables["height"].Value)); //заводим курсор на нужное нам поле
instance.ActiveTab.FullEmulationMouseWheel(0,int.Parse(project.Variables["scroll"].Value)); //скролим куда нам нада
Попробую разобраться в этой китайской грамоте ) Спасибо за ответ )
 
сколько занимаюсь зенкой и сколько ни листал форум, ну никто не пишет на JS. если нужно именно прям кровь из носа на JS , то походу это путь одиночки.
Все делается либо на кубиках, либо на C# . JS используется ну в очень редких случаях. Есть шаблоны которые работают только на кубиках и они не менее эффективны чем другие реализации.
Если проблема только в передаче переменных в код C# то тут даже проблемы нет. например так можно получить число из переменной зенки width
int.Parse(project.Variables["width"].Value)
если строка нужна, то просто project.Variables["URL_saita"].Value
https://zennolab.com/wiki/ru:zennoposter:using-csharp-macro полистайте справку, там много чего интересного.
и еще, совсем необязательно быть гуру c# , достаточно грамотно и понятно описать что надо сделать и многие помогут на форуме , напишут на c#
конечно если это не совсем детский сад (ну вот как эта тема у вас, со скролом) , потому что такие простые вещи 100500 раз выкладывались на форуме и найти поиском по форуму не составляет никакого труда.
 
  • Спасибо
Реакции: Deisler
сколько занимаюсь зенкой и сколько ни листал форум, ну никто не пишет на JS. если нужно именно прям кровь из носа на JS , то походу это путь одиночки.
Все делается либо на кубиках, либо на C# . JS используется ну в очень редких случаях. Есть шаблоны которые работают только на кубиках и они не менее эффективны чем другие реализации.
Если проблема только в передаче переменных в код C# то тут даже проблемы нет. например так можно получить число из переменной зенки width
int.Parse(project.Variables["width"].Value)
если строка нужна, то просто project.Variables["URL_saita"].Value
https://zennolab.com/wiki/ru:zennoposter:using-csharp-macro полистайте справку, там много чего интересного.
и еще, совсем необязательно быть гуру c# , достаточно грамотно и понятно описать что надо сделать и многие помогут на форуме , напишут на c#
конечно если это не совсем детский сад (ну вот как эта тема у вас, со скролом) , потому что такие простые вещи 100500 раз выкладывались на форуме и найти поиском по форуму не составляет никакого труда.
Да, JS я решил использовать именно потому что в недрах форума вычитал что C# не работает с переменными из PM. Поэтому и вопрос мой был про JS, который на форуме не обсуждается.
Если C# действительно работает с переменными, то вопрос по JS отпадает. Спасибо что помогли с этим разобраться. Буду тестировать.
Обучение я уже смотрел, некоторые вещи неоднократно. Только без практики это не усваивается крайне плохо. Думаю с этим сталкиваются все новички. Когда появляется непонятная задача, тогда и идет поиск и по курсу и по форуму и когда ничего не нашлось, создается вопрос. И да, вопрос от новичка может казаться глупым, но возникает он именно от того что информации не нашлось или эта информация непонятна. А пересматривать курс каждый раз как столкнулся с задачей которую не могу решить совсем не реалистично.

Ваш ответ помог разобраться в сути вопроса. Спасибо
 
У меня появился глюк. FullEmulationMouseMove(позже выяснилось что прога настроек мыши мешала) не скроллил страницу. Пришлось использовать FullEmulationMouseWheel
также высчитывая сколько нужно крутить до элемента. И выяснилось, что Wheel не крутит точное число пикселей которое задаешь, даже определили коэффициент разницы. Оказывается это зависит от того какая скорость прокрутки колеса выставлена в windows. Меняя настройки колеса в Windows увидел что коэффициент погрешности тоже меняется.
 
У меня появился глюк. FullEmulationMouseMove(позже выяснилось что прога настроек мыши мешала) не скроллил страницу. Пришлось использовать FullEmulationMouseWheel
также высчитывая сколько нужно крутить до элемента. И выяснилось, что Wheel не крутит точное число пикселей которое задаешь, даже определили коэффициент разницы. Оказывается это зависит от того какая скорость прокрутки колеса выставлена в windows. Меняя настройки колеса в Windows увидел что коэффициент погрешности тоже меняется.
Беда с этим зеннопостером... Как вариант можешь чекать видимость элемента с помощью displaceintab (если не ошибаюсь) и крутить дальше при необходимости
 
Оказывается сделали плавный скролл колесом с 7.1 версии
instance.ActiveTab.FullEmulationMouseWheel(he,30);
Но крутит не рывками а равномерно

Нигде про этот метод ни слова не видел
Получается когда жаловался в саппорт что ScrollIntoView моментально перелетает, даже не сказали что есть новый метод

Имитация просмотра тоже неплохо что сделали но иногда по красной вылетает, приходится через паузу повторять
 
Беда с этим зеннопостером... Как вариант можешь чекать видимость элемента с помощью displaceintab (если не ошибаюсь) и крутить дальше при необходимости
что то не нашел про displaceintab
 
что то не нашел про displaceintab
образец. дальше допиливай под себя
C#:
Развернуть Свернуть Копировать
Random r = new Random();
string elementPath = "(//div[@class='post-card__title'])[6]"; //xpath элемента
int sizeWindow = Convert.ToInt32(instance.ActiveTab.MainDocument.EvaluateScript("return window.innerHeight")); //размер окна

instance.ActiveTab.Navigate("https://html-templates.info/");
instance.ActiveTab.WaitDownloading();

//искомый элемент
var element = instance.ActiveTab.FindElementByXPath(elementPath, 0);
if(element.IsVoid)
{
    project.SendInfoToLog("элемент не найден - " + elementPath);
    return "";
}

//расстояние до элемента относительно таба
int rasstoyanieDoElementa = element.DisplacementInTabWindow.Y;
int j=0;

//если элемент ниже, крутим вниз
if(rasstoyanieDoElementa > 0)
{
    
    while(sizeWindow < rasstoyanieDoElementa)
    {
        rasstoyanieDoElementa = element.DisplacementInTabWindow.Y;
        j+=1;
        if(j>500) throw new Exception("не смогли докрутить до элемента");
        
        instance.ActiveTab.FullEmulationMouseWheel(0, 100);
        Thread.Sleep(r.Next(200, 1000));
        
    }
}
//если элемент выше, крутим вверх
else
{
    while(rasstoyanieDoElementa < 50)
    {
        rasstoyanieDoElementa = element.DisplacementInTabWindow.Y;
        j+=1;
        if(j>500) throw new Exception("не смогли докрутить до элемента");
        
        instance.ActiveTab.FullEmulationMouseWheel(0, -100);
        Thread.Sleep(r.Next(200, 1000));
        
    }
}
 
  • Спасибо
Реакции: spanky3770 и ezotonal

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)