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

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



Итак, с версии 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:
 
LaGir, подскажи чем ты xPath ищешь? Каккой на твой взгляд самый эффективный вариант
Тут лучше сказать по-другому, пути XPath скорее составляются нежели ищутся, из составных "частей" нужных элементов.
Эффективные варианты достаточно подробно объяснены например тут и тут, не вижу смысла повторяться. Дальше только практика, чем больше, тем лучше, иначе либо полного понимания не будет, либо быстро всё забудется.
и каклучше всего находить уникальный хПас элемента?
Смотрим все пары "атрибут-значение" в OuterHtml, пробуем составить уникальные пути. Если этого недостаточно, ищем поблизости элемент (соседний или выше/ниже по дереву), для которого можно составить уникальный путь по тому же принципу. Когда находим, строим от него (или с учетом его) путь к целевому элементу.
 
  • Спасибо
Реакции: Larisa87
Эффективные варианты достаточно подробно объяснены например тут и тут
Спасибо, чето я прорустил это сообщение, очень помогло видео и статья, спасибо за ссылки, оказывается не все так и сложно, почти сразу разобрался ... Теперь будем практиковаться
 
@LaGir спасибо за эту тему! Все очень хорошо и понятно объяснил. Но я хочу спросить самое главное :-)
Как определить нужно ли это все для очеловечивания в глазах того или иного сайта ? По моему опыту баны выдаются за самые банальные вещи... Хотя я и работаю обычно с самыми простыми ресурсами. Наличие чего в коде страницы может говорить о том, что сайт палит движение мыши? Или возможно это можно увидеть в запросах через снифер? А может быть этого нельзя точно понять и все это паранойя любителей делать шаблоны?:D
 
Как прочитать часть текста he с помощью FullEmulationMouseMoveAboveHtmlElement ?
 
Как прочитать часть текста he с помощью FullEmulationMouseMoveAboveHtmlElement ?
Присоединяюсь к вопросу)
Так же частенько бывает, что текст занимает например 50% DIVa по ширине и получается что сначала все ок якобы по тексту ведет курсором, а дальше продолжает вести по пустому месту до границы DIVa....
 
продолжает вести по пустому месту до границы DIVa....
И даже если ведет не по пустому месту, смотрится как будто читает первоклассник. Хотелось бы сделать чтобы курсор ходил не от начала и до конца текста. Можно выделить из всего innerhtml подстроку, но как ее назначить html-элементом?
 
Как определить нужно ли это все для очеловечивания в глазах того или иного сайта ? По моему опыту баны выдаются за самые банальные вещи... Хотя я и работаю обычно с самыми простыми ресурсами. Наличие чего в коде страницы может говорить о том, что сайт палит движение мыши? Или возможно это можно увидеть в запросах через снифер? А может быть этого нельзя точно понять и все это паранойя любителей делать шаблоны?:D
На простых маленьких сайтах - можно чекать код метрики яндекса в коде, прикидывать вероятность того, что админ сайта будет лезть в вебвизор в ваши визиты. Со сложными сайтами, это скорее надо идти в спецы по бэкенду как минимум, чтобы знать и уметь как такие вещи могут выглядеть и работать, как их опознать.

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

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


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


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

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

ты вообще понял что я имел ввиду?
 
  • Спасибо
Реакции: Yuriy Zymlex
  • Спасибо
Реакции: LaGir
Это когда зависало при выходе за пределы видимой части экрана?
Если да, то фиксили..
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");

Как видим на гифке, мышка ушла за край и зависла. Не пофиксили :(
 
Посмотреть вложение 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
Интересно, проверим.

PS: Похоже, что проблема только на ВК, т.к. проверил Яндекс, Инсту - там все ок,
прокручивает до элемента и жмет на него. Запишу в текущий список проблем, передам программистам.
Тестил только что на авито и одноклассниках - всё работает отлично, а на ВК нет :( Пожалуйста, поправьте эту штуковину, хочу поковырять ВК :)
 
Тестил только что на авито и одноклассниках - всё работает отлично, а на ВК нет :( Пожалуйста, поправьте эту штуковину, хочу поковырять ВК :-)
Да, передам проблему, обязательно.
 
Спасибо за большую работу.
Заметил, что FullEmulationMouseMoveToHtmlElement позиционирует курсор в левом верхнем углу элемента. Можно ли как-то центрировать или случайную позицию использовать по элементу?
 
  • Спасибо
Реакции: Astraport
Код не много не причесан, прошу понять и простить.
Подробная инструкция в коде - в комментариях.
Кратко: - вызываем из кубика 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: Убрал в коде пару лишних символов.
 
Последнее редактирование:

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