Сниппеты эмуляции мыши: FullEmulationMouse

orka13

Client
Регистрация
07.05.2015
Сообщения
2 163
Благодарностей
2 163
Баллы
113
Немного не доглядел, аву автора по эмуляции помню.. По ссылке конкурсная статья от автора сего топика. Там решение для выявления видимых элементов.
https://zennolab.com/discussion/threads/navigacija-bota-na-web-stranicax.48679/
спс, я опять велосипед городил, так как забыл об этой теме, надо было просто с нее примеры взять. Там намного больше материала для "гулек" по сайтам.
 
  • Спасибо
Реакции: SergSh

LaGir

Client
Регистрация
01.10.2015
Сообщения
211
Благодарностей
852
Баллы
93
Да, давно пора.)



Итак, с версии 5.18.0.0 появилась перегрузка метода FullEmulationMouseWheel.
Позволяет делать прокрутку до определенного Html-элемента на странице. Первый вариант метода позволяет крутить только на указанное количество пикселей, и для прокрутки до элемента нужно было сооружать свои костылики.
Теперь имеем готовый соответствующий метод, и надо сказать, он получился очень удобным.

Параметры.
1. HtmlElement he

Описание. Элемент, до которого нужно сделать прокрутку.

2. int topOffsetToElementCenter
Описание. Отступ от верхней границы окна инстанса до середины элемента, в процентах. Когда метод докрутит до середины элемента с нужным отступом, тогда прокрутка и остановится.
Значение по умолчанию: 50.
Параметр необходим для прокрутки по вертикали (т.е. использовать придётся скорее всего часто).

3. int leftOffsetToElementCenter
Описание. Отступ от левой границы окна инстанса до середины элемента, в процентах. Когда метод докрутит до середины элемента с нужным отступом, тогда прокрутка и остановится.
Значение по умолчанию: 50.
Параметр необходим для прокрутки по горизонтали (т.е. использовать придётся почти никогда).

Честно говоря, как не пытайся объяснить предназначение 2 и 3 параметра без самостоятельных тестов, выходит всё равно непонятно.
Поэтому призову в помощь такую картинку. Рассматриваем прокрутку по вертикали.

2018-08-23_01-40-44.png

Если надо прокрутить до элемента так, чтобы он оказался примерно в верхней части окна - во второй параметр ставим, например, 10 (процентов). Прокрутка остановится тогда, когда элемент во вкладке по высоте будет примерно где нарисовано число "10".
Если надо прокрутить до элемента так, чтобы он оказался примерно в середине окна- во второй параметр ставим 50 (процентов). Прокрутка остановится тогда, когда элемент во вкладке по высоте будет примерно где нарисовано число "50".
Если надо прокрутить до элемента так, чтобы он оказался примерно в нижней части окна- во второй параметр ставим, например, 90 (процентов). Прокрутка остановится тогда, когда элемент во вкладке по высоте будет примерно где нарисовано число "90".

Касательно третьего параметра - тот же принцип, только по горизонтали.

Особенности.
Если во 2 или 3 параметре указать значение ниже 0 или выше 100 - метод отработает, но никакой прокрутки совершено не будет.
Не забываем, что прокрутка идёт к центру элемента, а не к его краю (важно помнить при работе с крупными по размерам элементами).

Выводы.
Весьма удобный метод прокрутки до элемента. Встроенные отступы позволяют крутить до элемента так, чтобы его случайно не закрыла, например, закрепленная шапка на странице (эта проблема может здорово мешать в ботах на FullEmulationMouse, если вы не сооружали аналог этого метода или не знаете как это сделать). Я бы даже сказал, это 5, ZennoLab :ay:
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 925
Благодарностей
6 389
Баллы
113
LaGir, подскажи чем ты xPath ищешь? Каккой на твой взгляд самый эффективный вариант, и каклучше всего находить уникальный хПас элемента?
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
211
Благодарностей
852
Баллы
93
LaGir, подскажи чем ты xPath ищешь? Каккой на твой взгляд самый эффективный вариант
Тут лучше сказать по-другому, пути XPath скорее составляются нежели ищутся, из составных "частей" нужных элементов.
Эффективные варианты достаточно подробно объяснены например тут и тут, не вижу смысла повторяться. Дальше только практика, чем больше, тем лучше, иначе либо полного понимания не будет, либо быстро всё забудется.
и каклучше всего находить уникальный хПас элемента?
Смотрим все пары "атрибут-значение" в OuterHtml, пробуем составить уникальные пути. Если этого недостаточно, ищем поблизости элемент (соседний или выше/ниже по дереву), для которого можно составить уникальный путь по тому же принципу. Когда находим, строим от него (или с учетом его) путь к целевому элементу.
 

Larisa87

Новичок
Регистрация
03.09.2018
Сообщения
1
Благодарностей
0
Баллы
1

LaGir

Client
Регистрация
01.10.2015
Сообщения
211
Благодарностей
852
Баллы
93
  • Спасибо
Реакции: Larisa87

backoff

Client
Регистрация
20.04.2015
Сообщения
5 925
Благодарностей
6 389
Баллы
113
Эффективные варианты достаточно подробно объяснены например тут и тут
Спасибо, чето я прорустил это сообщение, очень помогло видео и статья, спасибо за ссылки, оказывается не все так и сложно, почти сразу разобрался ... Теперь будем практиковаться
 

Tsuk15

Client
Регистрация
25.04.2017
Сообщения
102
Благодарностей
40
Баллы
28
@LaGir спасибо за эту тему! Все очень хорошо и понятно объяснил. Но я хочу спросить самое главное :-)
Как определить нужно ли это все для очеловечивания в глазах того или иного сайта ? По моему опыту баны выдаются за самые банальные вещи... Хотя я и работаю обычно с самыми простыми ресурсами. Наличие чего в коде страницы может говорить о том, что сайт палит движение мыши? Или возможно это можно увидеть в запросах через снифер? А может быть этого нельзя точно понять и все это паранойя любителей делать шаблоны?:D
 

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
63
Баллы
28
Как прочитать часть текста he с помощью FullEmulationMouseMoveAboveHtmlElement ?
 

frion-seo

Client
Регистрация
27.02.2011
Сообщения
506
Благодарностей
451
Баллы
63
Как прочитать часть текста he с помощью FullEmulationMouseMoveAboveHtmlElement ?
Присоединяюсь к вопросу)
Так же частенько бывает, что текст занимает например 50% DIVa по ширине и получается что сначала все ок якобы по тексту ведет курсором, а дальше продолжает вести по пустому месту до границы DIVa....
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 925
Благодарностей
6 389
Баллы
113
такое бывает, но на норм сайтах + популярных движках, текст обычно закрыт в параграфы <p></p>
ну и xPath'ом выбираешь и ведешь
 

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
63
Баллы
28
продолжает вести по пустому месту до границы DIVa....
И даже если ведет не по пустому месту, смотрится как будто читает первоклассник. Хотелось бы сделать чтобы курсор ходил не от начала и до конца текста. Можно выделить из всего innerhtml подстроку, но как ее назначить html-элементом?
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
211
Благодарностей
852
Баллы
93
Как определить нужно ли это все для очеловечивания в глазах того или иного сайта ? По моему опыту баны выдаются за самые банальные вещи... Хотя я и работаю обычно с самыми простыми ресурсами. Наличие чего в коде страницы может говорить о том, что сайт палит движение мыши? Или возможно это можно увидеть в запросах через снифер? А может быть этого нельзя точно понять и все это паранойя любителей делать шаблоны?:D
На простых маленьких сайтах - можно чекать код метрики яндекса в коде, прикидывать вероятность того, что админ сайта будет лезть в вебвизор в ваши визиты. Со сложными сайтами, это скорее надо идти в спецы по бэкенду как минимум, чтобы знать и уметь как такие вещи могут выглядеть и работать, как их опознать.

Как прочитать часть текста he с помощью FullEmulationMouseMoveAboveHtmlElement ?
Пилить свой аналогичный метод, в стандартном методе никакие вариации не предусмотрены, только размер шрифта можно менять, увы.

И даже если ведет не по пустому месту, смотрится как будто читает первоклассник. Хотелось бы сделать чтобы курсор ходил не от начала и до конца текста. Можно выделить из всего innerhtml подстроку, но как ее назначить html-элементом?
Интересный подход, может по идее работать, но лично я такое не пробовал) Попробуйте менять содержимое InnerHtml или OuterHtml, или вообще подменять части кода при загрузке (ChangeResponse). Правда это всё равно пахнет сильным извращением)
 
  • Спасибо
Реакции: Chingis

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Сейчас изучаю самоучитель по быстрому чтению (автор Олег Андреев). Так вот в книге пишется, что вождение по тексту при чтении - это проблема с вниманием. Здоровому человеку нет необходимости водить карандашом, курсором и т.д. по строкам.


Думаю для очеловечивания бота достаточно реалистичной прокрутки страницы и движения мыши по экрану в разные стороны.
 

ezotonal

Client
Регистрация
13.01.2014
Сообщения
808
Благодарностей
227
Баллы
43
Сейчас изучаю самоучитель по быстрому чтению (автор Олег Андреев). Так вот в книге пишется, что вождение по тексту при чтении - это проблема с вниманием. Здоровому человеку нет необходимости водить карандашом, курсором и т.д. по строкам.


Думаю для очеловечивания бота достаточно реалистичной прокрутки страницы и движения мыши по экрану в разные стороны.
Это да. То же никогда не водил вышкой или пальцем по книге)) Только плавная прокрутка и все
Периферическое чтение так сказать
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
211
Благодарностей
852
Баллы
93
Сейчас изучаю самоучитель по быстрому чтению (автор Олег Андреев). Так вот в книге пишется, что вождение по тексту при чтении - это проблема с вниманием. Здоровому человеку нет необходимости водить карандашом, курсором и т.д. по строкам.
Возможно это так, возможно это близко к правде, а может быть не совсем так/совсем не так. Нужны соответствующие исследования и вытекающие статистические данные (т.е. пруфы). Судить по себе или своим догадкам тоже не рекомендовал бы, так как сам в прошлом не раз обжигался из-за подобных оценок)
В то же время самостоятельно получить такую информацию несложно, чем и рекомендую заниматься всем, кто заинтересован продвинутой эмуляцией на сайтах. Берём сайт с метрикой, изучаем поведение людей в вебвизоре, чем больше, тем лучше. В идеале именно той аудитории, которую должен эмулировать ваш шаблон (сегменты по полу/возрасту/гео/...). Сводим в самые распространенные паттерны поведения ЦА, воплощаем их в логике шаблона - готово.
 

Juniorcpa

Client
Регистрация
27.05.2014
Сообщения
2 031
Благодарностей
1 285
Баллы
113
Возможно это так, возможно это близко к правде, а может быть не совсем так/совсем не так. Нужны соответствующие исследования и вытекающие статистические данные (т.е. пруфы). Судить по себе или своим догадкам тоже не рекомендовал бы, так как сам в прошлом не раз обжигался из-за подобных оценок)
В то же время самостоятельно получить такую информацию несложно, чем и рекомендую заниматься всем, кто заинтересован продвинутой эмуляцией на сайтах. Берём сайт с метрикой, изучаем поведение людей в вебвизоре, чем больше, тем лучше. В идеале именно той аудитории, которую должен эмулировать ваш шаблон (сегменты по полу/возрасту/гео/...). Сводим в самые распространенные паттерны поведения ЦА, воплощаем их в логике шаблона - готово.
не знаешь, там не пофиксили выходы за поля мышки?)
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 925
Благодарностей
6 389
Баллы
113
Сейчас изучаю самоучитель по быстрому чтению (автор Олег Андреев). Так вот в книге пишется, что вождение по тексту при чтении - это проблема с вниманием. Здоровому человеку нет необходимости водить карандашом, курсором и т.д. по строкам.
Тут важно что алгоритм думает, а не какой-то олег андреев ))
 

molotok

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

backoff

Client
Регистрация
20.04.2015
Сообщения
5 925
Благодарностей
6 389
Баллы
113
Олег Андрее - это не кто-то, это серьезный специалист в своей области.
дак никто не спорит, он пишет алгоритмы распознавания ботов? или он просто психолог?

ты вообще понял что я имел ввиду?
 
  • Спасибо
Реакции: Yuriy Zymlex

LaGir

Client
Регистрация
01.10.2015
Сообщения
211
Благодарностей
852
Баллы
93

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 440
Благодарностей
8 672
Баллы
113
  • Спасибо
Реакции: LaGir

Juniorcpa

Client
Регистрация
27.05.2014
Сообщения
2 031
Благодарностей
1 285
Баллы
113

Juniorcpa

Client
Регистрация
27.05.2014
Сообщения
2 031
Благодарностей
1 285
Баллы
113
Это когда зависало при выходе за пределы видимой части экрана?
Если да, то фиксили..
vkbug.gif

var rnd = new Random();
Tab tab1 = instance.ActiveTab;
tab1.Navigate("http://vk.com");
if (tab1.IsBusy) tab1.WaitDownloading();
HtmlElement h2 = tab1.FindElementByXPath("//*[contains(@id,'ij_submit')]", 0);
tab1.FullEmulationMouseMoveToHtmlElement(h2);
Thread.Sleep(1500);
tab1.FullEmulationMouseClick("left", "click");

Как видим на гифке, мышка ушла за край и зависла. Не пофиксили :(
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 440
Благодарностей
8 672
Баллы
113
Посмотреть вложение 33737

var rnd = new Random();
Tab tab1 = instance.ActiveTab;
tab1.Navigate("http://vk.com");
if (tab1.IsBusy) tab1.WaitDownloading();
HtmlElement h2 = tab1.FindElementByXPath("//*[contains(@id,'ij_submit')]", 0);
tab1.FullEmulationMouseMoveToHtmlElement(h2);
Thread.Sleep(1500);
tab1.FullEmulationMouseClick("left", "click");

Как видим на гифке, мышка ушла за край и зависла. Не пофиксили :(
Интересно, проверим.

PS: Похоже, что проблема только на ВК, т.к. проверил Яндекс, Инсту - там все ок,
прокручивает до элемента и жмет на него. Запишу в текущий список проблем, передам программистам.
 
Последнее редактирование:
  • Спасибо
Реакции: LaGir и Juniorcpa

Juniorcpa

Client
Регистрация
27.05.2014
Сообщения
2 031
Благодарностей
1 285
Баллы
113
Интересно, проверим.

PS: Похоже, что проблема только на ВК, т.к. проверил Яндекс, Инсту - там все ок,
прокручивает до элемента и жмет на него. Запишу в текущий список проблем, передам программистам.
Тестил только что на авито и одноклассниках - всё работает отлично, а на ВК нет :( Пожалуйста, поправьте эту штуковину, хочу поковырять ВК :-)
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 440
Благодарностей
8 672
Баллы
113
Тестил только что на авито и одноклассниках - всё работает отлично, а на ВК нет :( Пожалуйста, поправьте эту штуковину, хочу поковырять ВК :-)
Да, передам проблему, обязательно.
 

andrey-ka

Client
Регистрация
03.06.2018
Сообщения
854
Благодарностей
246
Баллы
43
Спасибо за большую работу.
Заметил, что FullEmulationMouseMoveToHtmlElement позиционирует курсор в левом верхнем углу элемента. Можно ли как-то центрировать или случайную позицию использовать по элементу?
 
  • Спасибо
Реакции: Astraport

Alex733

Client
Регистрация
27.11.2017
Сообщения
316
Благодарностей
230
Баллы
43
Код не много не причесан, прошу понять и простить.
Подробная инструкция в коде - в комментариях.
Кратко: - вызываем из кубика FullEmulMoveToCenterOfElm - прописываем, все что подсказывает компилятор и радуемся жизни. )


C#:
        /// <summary>
        /// rnd - Случайное число в диапазоне от start до end
        /// </summary>
        /// <param name="start">Меньшее число</param>
        /// <param name="end">Большее число</param>
        /// <returns>Число</returns>
    public static int rnd (int start=0, int end=100) {
        Random rnd = new Random();
          return rnd.Next(start, end);
       }


    /// <summary>
    ///   Двигает мышь к центру элемента методом FullEmulationMouseMove, с некоторым смещением
    /// </summary>
    /// <param name="instance">Инстанс</param>
    /// <param name="targetElem"> Целевой HtmlElement</param>
    /// <param name="deltaZero">  При true двигает точно к центру элемента, иначе к точке, которая смещена от центра элемента на случайное расстояние </param>
    /// <param name="click"> Кликает на элементе если true, default - false </param>
    /// <returns></returns>
       public static void FullEmulMoveToCenterOfElm(Instance instance, ZennoLab.CommandCenter.HtmlElement targetElem, bool deltaZero = false, bool click = false){
        Tab tab = instance.ActiveTab;
           int windheight =  int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
                   Point xyhe = targetElem.DisplacementInBrowser;
                   Point curXY = tab.FullEmulationMouseCurrentPosition;
                     int elemWidth = targetElem.BoundingClientWidth;
                     int elemHeight = targetElem.BoundingClientHeight;
            if (xyhe.Y + elemHeight >= windheight) {
                tab.FullEmulationMouseWheel(0, rnd(elemHeight + 120, elemHeight + 170));
            }
            if (xyhe.Y <= 10) {
               tab.FullEmulationMouseWheel(0, -1 * rnd(elemHeight + 20, elemHeight + 70));
            }
                         int deltaX = (int) Math.Ceiling((double) elemWidth * 0.23);
                         int deltaY = (int) Math.Ceiling((double) elemHeight * 0.15);
                      int sharpTrgX = xyhe.X + elemWidth/2;
                         deltaX = sharpTrgX - curXY.X >= 0 ? rnd(-4,deltaX): CC.rnd(-1*deltaX,4);
                
                    if (deltaZero) { deltaX = 0; deltaY = 0; }
                     int targetX = sharpTrgX - deltaX;
                     int targetY = xyhe.Y + elemHeight/2 + rnd(-1*deltaY,deltaY);
                     tab.FullEmulationMouseMove(targetX, targetY);
                    tab.FullEmulationMouseMove(targetX+1, targetY);
        if (click) tab.FullEmulationMouseClick("left", "click");
      }
UPD: Убрал в коде пару лишних символов.
 
Последнее редактирование:

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113

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