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

Juniorcpa

Client
Регистрация
27.05.2014
Сообщения
2 031
Благодарностей
1 286
Баллы
113
  • Спасибо
Реакции: SenSS

Viking01

Client
Регистрация
19.08.2017
Сообщения
228
Благодарностей
151
Баллы
43
хм, смотрю изменение опций скорости на колесико не влияет.

и смотрю для колесика есть еще и вторая функция
instance.ActiveTab.MouseWheel(100, 200, 0, 1000, false);

Код:
Random Random = new Random();
int r = Random.Next(200, 500);
System.Threading.Thread.Sleep(3000);
instance.ActiveTab.FullEmulationMouseSetOptions(50,20,200);
instance.ActiveTab.FullEmulationMouseWheel(0,r);
System.Threading.Thread.Sleep(1000);
ты как нить решил эту проблему?
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 091
Благодарностей
31
Баллы
48
Всем привет, замучался разбираться с этой эмуляцией мыши. Разумеется без вашей помощи зайду в тупик. По этой причине прошу ответить на несколько вопросов
1) Где можно ознакомиться с функциями с примерами и подробным описанием. Особенно интересует список функций который вылезает автоматически
на данный момент интересует функция
var rnd = new Random();
var post = posts.GetByNumber( rnd.Next(0,posts.Count) ; ЗДЕСЬ ИНТЕРЕСУЕТ АРГУМЕНТ, ЧТО ОН ДЕЛАЕТ
var h2 = post.FindChildByXPath(".//h3",0); ЧТО в скобочках делается

2) Подробно разбирал пример 1-ой программы, снипита или скрипта, запутался в этой терминологии. Подробно разобрал пример и решил его продублировать на mail.ru, там видь то же имеются статьи и самое главное это нужно изменить тэги, атрибуты и значение в переменной posts. Сложность в том, что программа выполняется без ошибок, а эмуляции мыши не видно. Внизу описал мое видение программы, но чувствую, где то ошибка

Благодаря этой функции определяем элементы по которым должна пройтись мышь
var posts = instance.ActiveTab.FindElementsByAttribute("div", "class", "news-item__inner", "regext");

Затем определяем конкретный элемент
var post = posts.GetByNumber(3);

Делее просто копирую из 1-ой программы

//Ведём мышку к этому посту РАЗБЕРИСЬ С ЭТИМИ ЦИФРАМИ 4
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(post);
//Ищем заголовок поста
var h2 = post.FindChildByXPath(".//h3",0);
//Проводим мышкой по заголовку
tab1.FullEmulationMouseMoveAboveHtmlElement(h2, 30);
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 091
Благодарностей
31
Баллы
48
Tab tab1 = instance.ActiveTab;
tab1.Navigate("http://mail.ru/");
if (tab1.IsBusy) tab1.WaitDownloading();
var posts = instance.ActiveTab.FindElementsByAttribute("div", "class", "news-item__inner", "regext");// 1-ый вариант поиска
//var posts = instance.ActiveTab.FindElementsByAttribute("a", "name", "n", "regext");// 2-ой вариант поиска
//Получаем рандомный пост на странице
var rnd = new Random();
//// Находим нужные посты т.е все
var post = posts.GetByNumber(3);// rnd.Next(0,posts.Count) если в Next(5) то опусакается не до конца. Я думаю что num вместо цифры,но нужно проверить
//Ведём мышку к этому посту РАЗБЕРИСЬ С ЭТИМИ ЦИФРАМИ 4
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(post);
//Ищем заголовок поста
var h2 = post.FindChildByXPath(".//h3",0);
//Проводим мышкой по заголовку
tab1.FullEmulationMouseMoveAboveHtmlElement(h2, 30);
 
  • Спасибо
Реакции: xDESTROYx

LaGir

Client
Регистрация
01.10.2015
Сообщения
230
Благодарностей
944
Баллы
93
Где можно ознакомиться с функциями с примерами и подробным описанием.
Например, в документации по управлению из кода: https://help.zennolab.com/en/v5/zennoposter/5.17.0.0/webframe.html#topic1.html
Жмём снизу на вкладку "Search", ищем нужное название, переходим по ссылке:

2018-05-26_21-22-35.png

Особенно интересует список функций который вылезает автоматически
на данный момент интересует функция
var rnd = new Random();
var post = posts.GetByNumber( rnd.Next(0,posts.Count) ; ЗДЕСЬ ИНТЕРЕСУЕТ АРГУМЕНТ, ЧТО ОН ДЕЛАЕТ
GetByNumber - получить пост по номеру.
rnd.Next(0, posts.Count) - взять случайное число в диапазоне от нуля до posts.Count. posts.Count равно количеству постов (элементов в коллекции "post").
var h2 = post.FindChildByXPath(".//h3",0); ЧТО в скобочках делается
post.FindChildByXPath - поиск элемента, который является потомком (вложенным) элемента "post".
".//h3" - путь XPath к элементу-потомку. По XPath на форуме есть хорошая статья.
0 - номер элемента, если по XPath их нашлось несколько. Нумерация с нуля, поэтому 0 означает первый элемент.
2) Подробно разбирал пример 1-ой программы, снипита или скрипта, запутался в этой терминологии. Подробно разобрал пример и решил его продублировать на mail.ru, там видь то же имеются статьи и самое главное это нужно изменить тэги, атрибуты и значение в переменной posts. Сложность в том, что программа выполняется без ошибок, а эмуляции мыши не видно. Внизу описал мое видение программы, но чувствую, где то ошибка

Благодаря этой функции определяем элементы по которым должна пройтись мышь
var posts = instance.ActiveTab.FindElementsByAttribute("div", "class", "news-item__inner", "regext");
Верно, ошибка - банальная опечатка, "regext" вместо "regexp".
//Ищем заголовок поста
var h2 = post.FindChildByXPath(".//h3",0);
//Проводим мышкой по заголовку
tab1.FullEmulationMouseMoveAboveHtmlElement(h2, 30);
В Вашем случае лучше заменить на:
C#:
//Проводим мышкой по заголовку
tab1.FullEmulationMouseMoveAboveHtmlElement(post, 30);
Так как потомка с тегом "h3" у заголовков со страницы mail нет.
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 091
Благодарностей
31
Баллы
48
Например, в документации по управлению из кода: https://help.zennolab.com/en/v5/zennoposter/5.17.0.0/webframe.html#topic1.html
Жмём снизу на вкладку "Search", ищем нужное название, переходим по ссылке:
Спасибо большое за столь подробный ответ, подскажите при помощи данной функции по эмуляции мыши можно безопаснее ( без бана) работать в Однокласниках, ВКонтакте и т.д
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
230
Благодарностей
944
Баллы
93
при помощи данной функции по эмуляции мыши можно безопаснее ( без бана) работать в Однокласниках, ВКонтакте и т.д
Конкретно про эти сети лично мне сказать особо нечего, так как сравнительно мало с ними работал (хотя, судя по форумам, там только так гоняют даже самые примитивные боты). Однако, на ряде сайтов и сервисов это реально помогает. Как правило, это либо крупные сервисы типа гугла, яндекса, аналитических систем, которые отслеживают движения мыши и подобные вещи, либо маленькие ресурсы, чьи админы могут периодически смотреть тот же вебвизор.
На мой взгляд, мыши FullEmulationMouse и профилей Zenno из 5.17.2+ вполне хватает для полноценной эмуляции действий и браузера реального человека в 99% случаев.
Другое дело, что тенденция сейчас немного в другую сторону смещается, более высокий вес имеет история и связанные с ней вещи.
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 091
Благодарностей
31
Баллы
48
Конкретно про эти сети лично мне сказать особо нечего, так как сравнительно мало с ними работал (хотя, судя по форумам, там только так гоняют даже самые примитивные боты). Однако, на ряде сайтов и сервисов это реально помогает. Как правило, это либо крупные сервисы типа гугла, яндекса, аналитических систем, которые отслеживают движения мыши и подобные вещи, либо маленькие ресурсы, чьи админы могут периодически смотреть тот же вебвизор.
На мой взгляд, мыши FullEmulationMouse и профилей Zenno из 5.17.2+ вполне хватает для полноценной эмуляции действий и браузера реального человека в 99% случаев.
Другое дело, что тенденция сейчас немного в другую сторону смещается, более высокий вес имеет история и связанные с ней вещи.
Подскажите как можно наводить мышь на нужный элемент и производить клики ( одинарный или двойной клик левая, правая кнопка).
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
230
Благодарностей
944
Баллы
93
Подскажите как можно наводить мышь на нужный элемент и производить клики ( одинарный или двойной клик левая, правая кнопка).
И в теме, и ваших постах есть примеры.
Пример наведения:
C#:
var tab = instance.ActiveTab;
//Ищем элемент
var div = tab.FindElementByAttribute("a", "innertext", "USD", "text", 0);
//Наводим на него мышку
tab.FullEmulationMouseMoveToHtmlElement(div);
Одинарный клик левой:
C#:
tab.FullEmulationMouseClick("left", "click");
Двойной клик левой:
C#:
tab.FullEmulationMouseClick("left", "click");
tab.FullEmulationMouseClick("left", "click");
Одинарный клик правой:
C#:
tab.FullEmulationMouseClick("right", "click");
 
  • Спасибо
Реакции: phoenixs

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 091
Благодарностей
31
Баллы
48
И в теме, и ваших постах есть примеры.
Пример наведения:
Иногда не срабатывают данные варианты. То есть указываешь навести мышь и кликнуть на 1-н объект, но иногда кликаются соседние элементы. Как это можно исправить

К примеру я в Однокласниках нужно с начала зайти в Оповещение. Кстати в Оповещении нужно закрыть всплывающее окно т.е нажать на крестик, мышь наводиться но нажимает на поле, которое рядом находится т.е промазывает, хотя в Конструкторе действий все хорошо срабатывает. После того как зашел в Оповещение, нужно навести мышь на Однокласники и кликнуть, и здесь опять мышь иногда промазывает т.е кликает по полю которое рядом находится. Как данные ошибки можно избежать
 

yarchino

Client
Регистрация
05.06.2016
Сообщения
170
Благодарностей
31
Баллы
28
Как раз то что нужно
 
  • Спасибо
Реакции: LaGir

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 091
Благодарностей
31
Баллы
48
Подскажите как увеличить точность данной эмуляции, потому что бывает, что задаешь 1-н элемент( поле логин), а мышка может навестись на соседний элемент и соответственно шаблон не сработает
 
  • Спасибо
Реакции: orka13

LaGir

Client
Регистрация
01.10.2015
Сообщения
230
Благодарностей
944
Баллы
93
Подскажите как увеличить точность данной эмуляции, потому что бывает, что задаешь 1-н элемент( поле логин), а мышка может навестись на соседний элемент и соответственно шаблон не сработает
Можно вычислять координаты середины нужного элемента, вести мышь к этим координатам, затем кликать.
Лично я кривые клики встречал только в некоторых выпадающих списках, там надо дополнительно шаманить/костылить.

Можно также пользоваться обычным кликом (el.Click()) после наведения, клик будет точно верным. Чисто по моим наблюдениям и опыту, сайтам всё равно, каким способом делается клик. И вряд ли это изменится, так как тенденция отслеживания ботов идёт в другую сторону (см. третью рекапчу).
 
  • Спасибо
Реакции: orka13

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 091
Благодарностей
31
Баллы
48

datway1337

Пользователь
Регистрация
10.04.2018
Сообщения
74
Благодарностей
3
Баллы
8
сорри, можете подсказать как тянуть мышь не до xpath, а до тэга html, к примеру:

HTML:
<span class="star-item " data-pos="5">
наведение и клик желателен

Код:
//Находим элемент кнопки
var elButton = instance.ActiveTab.FindElementsByAttribute ("a", "href", "albums", "regexp");
//Определяем, на каком расстоянии от верха страницы находится кнопка
int topInBrowser = int.Parse(elButton.GetAttribute("topInBrowser"));
//Делаем прокрутку на это расстояние
instance.ActiveTab.FullEmulationMouseWheel(0, topInBrowser);
//Ведём курсор мышки к кнопке
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(elButton);
//Кликаем
instance.ActiveTab.FullEmulationMouseClick("left", "click");
как подставить сюда клик именно на
HTML:
data-post="5"
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
230
Благодарностей
944
Баллы
93
сорри, можете подсказать как тянуть мышь не до xpath, а до тэга html, к примеру:
Заменить первую строчку, остальное есть:
C#:
var elButton = instance.ActiveTab.FindElementByAttribute("span", "data-post", "5", "text", 0);
Добавлю, что поиск XPath и поиск по атрибутам - 2 способа найти элемент (тэг html с набором атрибутов), поэтому выражение "тянуть не до xpath, а до тэга" звучит как "вбить надо не молоток, а гвоздь".
Соответственно, тот элемент ничего не мешает искать по XPath:
C#:
var elButton = instance.ActiveTab.FindElementByXPath("//span[@data-post='5']", 0);
 
  • Спасибо
Реакции: datway1337 и Koqpe

datway1337

Пользователь
Регистрация
10.04.2018
Сообщения
74
Благодарностей
3
Баллы
8
Заменить первую строчку, остальное есть:
C#:
var elButton = instance.ActiveTab.FindElementByAttribute("span", "data-post", "5", "text", 0);
а как правильно вставить значение из переменной?

C#:
var elButton = instance.ActiveTab.FindElementByAttribute("span", "data-pos", "5", "text", 0);
Вместо "5" будет цифра из входных настроек, я только не знаю как нормально вставить это значение внутрь. через {-Variable.ocenkaotziva-} работает, но ругается, что нельзя юзать макросы в коде C#
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113
а как правильно вставить значение из переменной?

C#:
var elButton = instance.ActiveTab.FindElementByAttribute("span", "data-pos", "5", "text", 0);
Вместо "5" будет цифра из входных настроек, я только не знаю как нормально вставить это значение внутрь. через {-Variable.ocenkaotziva-} работает, но ругается, что нельзя юзать макросы в коде C#
удаляешь "5" (вместе с кавычками), и на том месте клик правой кнопкой мыши. Та внизу выбери нужную переменную
 
  • Спасибо
Реакции: datway1337

datway1337

Пользователь
Регистрация
10.04.2018
Сообщения
74
Благодарностей
3
Баллы
8
удаляешь "5" (вместе с кавычками), и на том месте клик правой кнопкой мыши. Та внизу выбери нужную переменную
а сюда как? сорри за тупость, я не шарю))) так же вместо '5'
C#:
var elButton = instance.ActiveTab.FindElementByXPath("//span[@data-pos='5']", 0);
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113
а сюда как? сорри за тупость, я не шарю))) так же вместо '5'
C#:
var elButton = instance.ActiveTab.FindElementByXPath("//span[@data-pos='5']", 0);
нет
Код:
var elButton = instance.ActiveTab.FindElementByXPath("//span[@data-pos='"+project.Variables["имя_переменной"].Value+"']", 0);
 
  • Спасибо
Реакции: datway1337

Juniorcpa

Client
Регистрация
27.05.2014
Сообщения
2 031
Благодарностей
1 286
Баллы
113
Как насчет нового класса скроллинга?)
 

LaGir

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

Vass

Client
Регистрация
03.02.2014
Сообщения
79
Благодарностей
10
Баллы
8
Подскажите что не так
instance.ActiveTab.FullEmulationMouseWheel(0,Convert.ToInt32(project.Variables["kolmushi"].Value));

пока сделал в виде
//Делаем прокрутку на 500 пикселей ВНИЗ (по y)
instance.ActiveTab.FullEmulationMouseWheel(0,{-Random.Int-|-1000-|-4500-});
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
230
Благодарностей
944
Баллы
93
Подскажите что не так
instance.ActiveTab.FullEmulationMouseWheel(0,Convert.ToInt32(project.Variables["kolmushi"].Value));
Если в переменной "kolmushi" число, без лишних символов и пробелов, то должно работать.
пока сделал в виде
//Делаем прокрутку на 500 пикселей ВНИЗ (по y)
instance.ActiveTab.FullEmulationMouseWheel(0,{-Random.Int-|-1000-|-4500-});
А вот это удивительно что вообще запускается и работает) Макросы проекта не для экшенов C#-кода, лучше их не использовать. Аналог этой строчки без макроса:
C#:
instance.ActiveTab.FullEmulationMouseWheel(0, Global.Classes.rnd.Next(1000, 4500));
 
  • Спасибо
Реакции: Vass

Juniorcpa

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

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
Можно вычислять координаты середины нужного элемента, вести мышь к этим координатам, затем кликать.
Лично я кривые клики встречал только в некоторых выпадающих списках, там надо дополнительно шаманить/костылить.

Можно также пользоваться обычным кликом (el.Click()) после наведения, клик будет точно верным. Чисто по моим наблюдениям и опыту, сайтам всё равно, каким способом делается клик. И вряд ли это изменится, так как тенденция отслеживания ботов идёт в другую сторону (см. третью рекапчу).
Пробую как раз внедрить фишки этой статьи в простенький шаблон для безобидного гуляния по сайтам, и сталкиваюсь с такими минусами «el.Click()»:
«el.Click()» почти всегда кликнет по нужному элементу, в то время как «instance.ActiveTab.FullEmulationMouseClick("left", "click");» любит делать «холостой клик» в пустоте. Но если быть дотошным, то первый намного палевнее. Так как он кликнет по элементу, даже если тот спрятан под другими элементами на странице (раскрывающиеся меню и т.д.).

Особенно палевно когда можно кликнуть на «ссылку-ловушку»:
Это когда сайты для отлова ботов оставляют на странице ссылки, спрятанные CSS-стилями или вынесены координатами за пределы страницы браузера так, чтобы реальный пользователь их не видел и не мог кликнуть. А все IP-адреса, с которых был совершён клик или GET-запрос по этой ссылке (понятно, что не живыми людьми) автоматом помечаются как "Боты".
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
540
Благодарностей
395
Баллы
63

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
el - после проверки через IsVoid не может быть палевным.
Может. Эта проверка только показывает есть ли елемент в коде страницы. Но на самой странице визуально он может не отображаться, даже если проверка дает положительный результат.
Для подтверждения моих слов залейте на хостинг себе тестовую страницу со скрытой ссылкой:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Test page</title>
</head>
<body>
<h1>Test page H1</h1>
<a id="1" href="https://www.google.com/">test link normal</a>
<a id="2" style="display: none" href="https://zennolab.com/discussion/threads/snippety-ehmuljacii-myshi-fullemulationmouse.35369/page-2">test link invisible</a>
</body>
</html>
А потом перейдите на нее в проджектмейкере и выполните эти два разные кода:
C#:
HtmlElement el = instance.ActiveTab.FindElementByXPath("//a[@id='2']", 0);
if (el == null)
{
    return "нет подходящих элементов в коде";
}
if (el.IsVoid)
{
    return "нет подходящих елементов в коде";
}

//поскольку визуально элемента нет на странице, зенка поведет курсор в нулевые координаты (левый верхний угол страницы) и там кликнет.
//Если в том месте не будет других ссылок, то клик получится безобидным (холостым), и шаблон никуда не перейдет.
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(el);
instance.ActiveTab.FullEmulationMouseClick("left", "click");
C#:
HtmlElement el = instance.ActiveTab.FindElementByXPath("//a[@id='2']", 0);
if (el == null)
{
    return "нет подходящих елементов в коде";
}
if (el.IsVoid)
{
    return "нет подходящих элементов в коде";
}

//а здесь кликнет в любом случае по ссылке и совершит переход на форум zennolab.com...:
el.Click();
Я пробовал еще подключать проверку на высоту элемента, но в моей ситуации такое тоже не дает гарантированного результата.

UPD: подправил последний код, а то он дублировал первый.

UPD2: вот тот вариант с проверкой на высоту, обычно помогает отсеять невидимые элементы:
C#:
var el = instance.ActiveTab.FindElementByXPath("//a[@id='2']", 0);
if (el == null)
{
    return "нет подходящих елементов в коде";
}
if (el.IsVoid)
{
    return "нет подходящих елементов в коде";
}

string height_el = el.GetAttribute("height");
int he_height = Int32.Parse(height_el);

//кликаем только если элемент имеет высоту больше 0:
if (he_height>0)
{
    el.Click();
}
 
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
540
Благодарностей
395
Баллы
63
  • Спасибо
Реакции: orka13

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