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

Deisler

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

Вложения

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
кроме JS в зеннопостере больше ничего нет ? может для начала с обзора функционала программы начать, а не мучать JS ?
 
  • Спасибо
Реакции: Yuriy Zymlex

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43
кроме JS в зеннопостере больше ничего нет ? может для начала с обзора функционала программы начать, а не мучать JS ?
Буду благодарен если подскажете как реализовать эту задачу на кубиках. Я этого не нашел
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 512
Благодарностей
3 368
Баллы
113

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
  • Спасибо
Реакции: orka13 и Deisler

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43
Вот есть зенновский метод для прокрутки колесика https://help.zennolab.com/en/v7/zennoposter/7.1.4/topic613.html
Спасибо ) Вы первый кто ответил что-то конкретное.

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

Мой вопрос в том как сделать плавный скролл в JS и возможно ли это вообще. Причину использования JS объяснил выше
 

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Тут какой скрол?

ft0KfCLRS8.gif
 
  • Спасибо
Реакции: orka13

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43
нет, это автоматический скрол из одного моего бота
Тогда он сделан очень реалистично ) Но от того что я увидел реалистичный скролл, я не на каплю не приблизился к ответам на свои вопросы )))
 
  • Спасибо
Реакции: molotok

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Тогда он сделан очень реалистично ) Но от того что я увидел реалистичный скролл, я не на каплю не приблизился к ответам на свои вопросы )))
Это сделано на основе метода, ссылку на который я давал выше
 

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 657
Благодарностей
656
Баллы
113
Тогда он сделан очень реалистично ) Но от того что я увидел реалистичный скролл, я не на каплю не приблизился к ответам на свои вопросы )))
Берем рандом 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)); //скролим куда нам нада
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43
Это сделано на основе метода, ссылку на который я давал выше
Я в PM 2 или 3 недели ) На сложные решения задач и на максимальную реалистичность я пока не претендую, если конечно кто-нибудь не поделится своими наработками)))
я тестировал FullEmulationMouseWheel но сам по себе он работал у меня в цикле с одинаковой скоростью прокрутки и с немаленькими задержками после каждого цикла. Другими словами что бы добиться реалистичности нужно изучать c# , а именно - как увеличивать и уменьшать скорость, как делать это увеличение и уменьшение рандомным, как подставлять в значение скролла координаты следующего поста, как в этом коде определить координаты следующего поста...
короче тут уже надо полноценно изучать c# а это просто откинет меня от видимых результатов на несколько месяцев в лучшем случае и отобьет желание всем этим заниматься. Поэтому я и ищу пока простые решения, без максимальной реалистичности и без углубления в C#

Спасибо что откликнулись на мои вопросы )
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43
Берем рандом 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)); //скролим куда нам нада
Попробую разобраться в этой китайской грамоте ) Спасибо за ответ )
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
сколько занимаюсь зенкой и сколько ни листал форум, ну никто не пишет на 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

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43
сколько занимаюсь зенкой и сколько ни листал форум, ну никто не пишет на 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 отпадает. Спасибо что помогли с этим разобраться. Буду тестировать.
Обучение я уже смотрел, некоторые вещи неоднократно. Только без практики это не усваивается крайне плохо. Думаю с этим сталкиваются все новички. Когда появляется непонятная задача, тогда и идет поиск и по курсу и по форуму и когда ничего не нашлось, создается вопрос. И да, вопрос от новичка может казаться глупым, но возникает он именно от того что информации не нашлось или эта информация непонятна. А пересматривать курс каждый раз как столкнулся с задачей которую не могу решить совсем не реалистично.

Ваш ответ помог разобраться в сути вопроса. Спасибо
 

Rdenwer

Client
Регистрация
14.10.2010
Сообщения
254
Благодарностей
61
Баллы
28

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
У меня появился глюк. FullEmulationMouseMove(позже выяснилось что прога настроек мыши мешала) не скроллил страницу. Пришлось использовать FullEmulationMouseWheel
также высчитывая сколько нужно крутить до элемента. И выяснилось, что Wheel не крутит точное число пикселей которое задаешь, даже определили коэффициент разницы. Оказывается это зависит от того какая скорость прокрутки колеса выставлена в windows. Меняя настройки колеса в Windows увидел что коэффициент погрешности тоже меняется.
 

volody00

Client
Регистрация
06.09.2016
Сообщения
917
Благодарностей
952
Баллы
93
У меня появился глюк. FullEmulationMouseMove(позже выяснилось что прога настроек мыши мешала) не скроллил страницу. Пришлось использовать FullEmulationMouseWheel
также высчитывая сколько нужно крутить до элемента. И выяснилось, что Wheel не крутит точное число пикселей которое задаешь, даже определили коэффициент разницы. Оказывается это зависит от того какая скорость прокрутки колеса выставлена в windows. Меняя настройки колеса в Windows увидел что коэффициент погрешности тоже меняется.
Беда с этим зеннопостером... Как вариант можешь чекать видимость элемента с помощью displaceintab (если не ошибаюсь) и крутить дальше при необходимости
 

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
Оказывается сделали плавный скролл колесом с 7.1 версии
instance.ActiveTab.FullEmulationMouseWheel(he,30);
Но крутит не рывками а равномерно

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

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

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
Беда с этим зеннопостером... Как вариант можешь чекать видимость элемента с помощью displaceintab (если не ошибаюсь) и крутить дальше при необходимости
что то не нашел про displaceintab
 

volody00

Client
Регистрация
06.09.2016
Сообщения
917
Благодарностей
952
Баллы
93
что то не нашел про 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

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