Скрол страницы до самого низа, нужен небольшой апгрейд. Хелп

backoff

Client
Регистрация
20.04.2015
Сообщения
5 914
Благодарностей
6 381
Баллы
113
Хай.
Есть простой снип для скрола

C#:
    //  скролим до конца
    
    //instance.ActiveTab.FullEmulationMouseWheel(0,project.Variables['rnd_scroll'].Value);
int i = 0; //Точка отсчета
int Y = 100; //Координата по оси Y
 
//Иницируем начало цикла со скроллингом
while(true)
{
    //Прокрутка
    instance.ActiveTab.FullEmulationMouseWheel(0,Y);
 
    //Положение мыши по оси Y
    int posY = instance.ActiveTab.FullEmulationMouseCurrentPosition.Y;
 
   //Условие, если положение мыши по оси Y больше точки отсчета, то скроллим дальше
    if(posY > i)
    {
        i = posY;
        Y += 100;
    }
    else //иначе выходит из цикла
    {
        break;
    }
}
Помогите с апгрейдом плиз
Нужно при каждом запуске рандомить:

1. координату по Y (от 100 до 150)
2. конечное число прокрутки по Y (от 20000 до 25000 пикселей по Y), то есть сейчас ограничения для прокрутки нет, если на сайте авто подгружение постов как на ВК или ФБ то либо это длится очень долго, либо идет зависание. Нужно просто при запуске рандомить число ОТ и ДО и останавливаться на нем.

как пример:

1 запуск:
Y = 143
конец при 24231 вниз по Y или раньше

2 запуск:
Y = 116
конец при 22537 вниз по Y или раньше
 

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
630
Благодарностей
539
Баллы
93
2 раза прочитал условие, но так и не понял :D
Зачем рандомить значение от 100 до 150, если конечная прокрутка берется с размахом аж в 5000 (от 20000 до 25000)
Может можно проще:

C#:
Random num = new Random();
project.Variables["deltaY"].Value = num.Next(20000,25000).ToString();// Сгенерируем число в диапазоне для прокрутки страницы вниз
project.Variables["deltaX"].Value = num.Next(0,0).ToString();// Если потребуется боковая прокрутка

int deltaY = Convert.ToInt32(project.Variables["deltaY"].Value);
int deltaX = Convert.ToInt32(project.Variables["deltaX"].Value);
instance.ActiveTab.FullEmulationMouseWheel(deltaX, deltaY);
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 221
Баллы
113
2 раза прочитал условие, но так и не понял :D
Зачем рандомить значение от 100 до 150, если конечная прокрутка берется с размахом аж в 5000 (от 20000 до 25000)
Может можно проще:

C#:
Random num = new Random();
project.Variables["deltaY"].Value = num.Next(20000,25000).ToString();// Сгенерируем число в диапазоне для прокрутки страницы вниз
project.Variables["deltaX"].Value = num.Next(0,0).ToString();// Если потребуется боковая прокрутка

int deltaY = Convert.ToInt32(project.Variables["deltaY"].Value);
int deltaX = Convert.ToInt32(project.Variables["deltaX"].Value);
instance.ActiveTab.FullEmulationMouseWheel(deltaX, deltaY);
Если не нужна человечность, проще использовать ScrollIntoView. В противном случае, к эмуляции следует отнестись более тщательно.
Наводящий вопрос: как часто вы мотаете вниз по 25000 пикселей?
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 914
Благодарностей
6 381
Баллы
113
А что не понятного?

Представь сайт у которого конец страницы все время обновляется и он увеличивается в размерах, то есть вниз. То есть возьми в ВК и пролистай до самого конца вниз, сколько дней на это уйдет? Правильно! Быстрее все зависнет нахрен.

Надо.
Если сайт "бесконечный" надо прокручивать его не более 20к пикселей например
Если сайт например 3000 пикселей, то останавливаться на 3000 и все.

Я давно делал решение на кубиках, но щас оно не подходит
логика: https://zennolab.com/discussion/threads/prokrutka-stranicy-fejbuk.65339/post-460216
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 683
Баллы
113
а этот код что делает ?
C#:
    //Положение мыши по оси Y
    int posY = instance.ActiveTab.FullEmulationMouseCurrentPosition.Y;
постоянно в цикле считывает положение мышки, которое при скроле ни разу не меняется. и все время приравнивается в сравниваемой переменной. этот цикл никогда не закончится.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 683
Баллы
113
вот рабочий снипет.

C#:
//------------------ входные настройки ---------------------------------------------------------//
int start =100;
int end = 150;
int max_delta = 20000;
int max_delta_rnd = 5000;
//-----------------------------------------------------------------------------------------------//
int Y_Start_Abs_pred =0; int Y_Start_Abs=0; int try_scroll=0; int delta_point =0;
Random rnd = new Random();
//-----------------------------------------------------------------------------------------------//
max_delta= max_delta + rnd.Next(0, max_delta_rnd);
while(true)
{
    delta_point = rnd.Next(start, end);
    instance.ActiveTab.FullEmulationMouseWheel(0,delta_point);
    Y_Start_Abs = - instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y;
    if ( Y_Start_Abs_pred == Y_Start_Abs ) try_scroll ++ ;
    else {
        Y_Start_Abs_pred = Y_Start_Abs;
        try_scroll=0;
    }
    if ( try_scroll > 2 ) { break; }
    if (Y_Start_Abs > max_delta ) { break; }
    ///// -------------------------------выход по внешнему требованию---------------------------------------------------------------------------------//
    if(((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted) throw new Exception("Внешнее прерывание"  );
    if(Global.Variables.IsProjectMaker && !Global.Variables.IsDebugMode)  throw new Exception("Внешнее прерывание "  );
    ///-----------------------------------------------------------------------------------------------------------------------------------------------//
}
 
Последнее редактирование:

backoff

Client
Регистрация
20.04.2015
Сообщения
5 914
Благодарностей
6 381
Баллы
113

Igorii

Client
Регистрация
21.02.2015
Сообщения
369
Благодарностей
292
Баллы
63
вот рабочий снипет.

C#:
//------------------ входные настройки ---------------------------------------------------------//
int start =100;
int end = 150;
int max_delta = 20000;
int max_delta_rnd = 5000;
//-----------------------------------------------------------------------------------------------//
int Y_Start_Abs_pred =0; int Y_Start_Abs=0; int try_scroll=0; int delta_point =0;
Random rnd = new Random();
//-----------------------------------------------------------------------------------------------//
max_delta= max_delta + rnd.Next(0, max_delta_rnd);
while(true)
{
    delta_point = rnd.Next(start, end);
    instance.ActiveTab.FullEmulationMouseWheel(0,delta_point);
    Y_Start_Abs = - instance.ActiveTab.MainDocument.Body.DisplacementInTabWindow.Y;
    if ( Y_Start_Abs_pred == Y_Start_Abs ) try_scroll ++ ;
    else {
        Y_Start_Abs_pred = Y_Start_Abs;
        try_scroll=0;
    }
    if ( try_scroll > 2 ) { break; }
    if (Y_Start_Abs > max_delta ) { break; }
    ///// -------------------------------выход по внешнему требованию---------------------------------------------------------------------------------//
    if(((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted) throw new Exception("Внешнее прерывание"  );
    if(Global.Variables.IsProjectMaker && !Global.Variables.IsDebugMode)  throw new Exception("Внешнее прерывание "  );
    ///-----------------------------------------------------------------------------------------------------------------------------------------------//
}
@Phoenix78, а можно этот код приспособить для свайпа?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 683
Баллы
113

Igorii

Client
Регистрация
21.02.2015
Сообщения
369
Благодарностей
292
Баллы
63
нет. там совсем другие методы
Я попробовал заменить эту строку:
C#:
instance.ActiveTab.FullEmulationMouseWheel(0,delta_point);
на эту:
C#:
instance.ActiveTab.Touch.SwipeIntoViewUsingAbsoluteCoords(0, delta_point);
Вроде, даже заработало, но только почему то, не вниз, а вверх свайпит((
 

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