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

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Вроде так?
Код:
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["domen"].Value), "regexp", 0);//находим элемент по УРЛу
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
Код ошибок не выдает, отрабатывает, говорит "ок". Те действие происходит, правильно понимаю?
 
Последнее редактирование:

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Вроде так?
Код:
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["domen"].Value), "regexp", 0);//находим элемент по УРЛу
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
Код ошибок не выдает, отрабатывает, говорит "ок". Те действие происходит, правильно понимаю?
Скобки лишние вокруг переменной. Хотя и с ними работает:D.
А у вас не видно результат?
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Скобки лишние вокруг переменной. Хотя и с ними работает:D.
А у вас не видно результат?
Да, попробовал с вводом ключа в поисковике, отработал, только запрос оч резко вводится, как будто ctrl+c - ctrl+v нажали
Скажите как сделать эмуляцию плавного ввода запроса ? в яа?
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Да, попробовал с вводом ключа в поисковике, отработал, только запрос оч резко вводится, как будто ctrl+c - ctrl+v нажали
Скажите как сделать эмуляцию плавного ввода запроса ? в яа?
Вы про это?
Код:
instance.ActiveTab.KeyEvent("A","press","ctrl");//замена всего текста в поле
instance.SendText(project.Variables["Переменная"].Value, Global.Classes.rnd.Next(125, 200));//ввод текста из переменной
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Вы про это?
Код:
instance.ActiveTab.KeyEvent("A","press","ctrl");//замена всего текста в поле
instance.SendText(project.Variables["Переменная"].Value, Global.Classes.rnd.Next(125, 200));//ввод текста из переменной
Возможно.
Я имел в виду чтобы запрос вводился плавно, как правильно? по буквам те, а не ctrl+c - ctrl+v
Вроде верно объяснил:-))) Сейчас протестирую
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Вы про это?
Код:
instance.ActiveTab.KeyEvent("A","press","ctrl");//замена всего текста в поле
instance.SendText(project.Variables["Переменная"].Value, Global.Classes.rnd.Next(125, 200));//ввод текста из переменной
У меня почти получилось сделать, то что мне нужно.
Код по ключевому слову хорошо ищет нужный элемент, а по домену почему-то мышка улетает вообще за экран(
В чем может быть вопрос?
Код:
Random rand = new Random();//переменная для рандома
HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");//берем все элементы
HtmlElement he;//переменная для будущего элемента
int i = 0;//счетчик
do{
    int url = rand.Next(0, hes.Count);//выбираем совпадение элемента рандомно
    i++;
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0){//если элемент не находится в поле видимости
        continue;//если да, то продолжаем искать
    }
    else{
        break;//если нет, то выходим из цикла
    }
}
while (i!=100);//пока не будет "100", не выходим из цикла
HtmlElement he1 = instance.ActiveTab.FindElementByAttribute("a", "href", project.Variables["domen"].Value, "regexp", 0);//находим элемент по имени домена
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he1);//двигаем мышку к нему
System.Threading.Thread.Sleep(1000);//ждем пол 1сек перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
Видео с процессом: https://yadi.sk/i/y_-7sJMgywqiSA

Домен указан без https://
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Решил вопрос таким способом:
Код:
Random rand = new Random();//переменная для рандома

HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");//берем все элементы
HtmlElement he;//переменная для будущего элемента
int i = 0;//счетчик
do{
    int url = rand.Next(0, hes.Count);//выбираем совпадение элемента рандомно
    i++;
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0){//если элемент не находится в поле видимости
        continue;//если да, то продолжаем искать
    }
    else{
        break;//если нет, то выходим из цикла
    }
}
while (i!=100);//пока не будет "100", не выходим из цикла
he = instance.ActiveTab.FindElementByAttribute("b", "innertext", project.Variables["domen"].Value, "regexp", 0);//находим элемент по имени домена

instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(1000);//ждем 1сек перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
 
  • Спасибо
Реакции: prodox

andrey-ka

Client
Регистрация
03.06.2018
Сообщения
855
Благодарностей
246
Баллы
43
Да, давно пора.)



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

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

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

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

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

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

Посмотреть вложение 31531

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

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

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

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

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Пробовал сделать подстановку рандомных координат их переменной, сделал такой код:
Код:
// Движение к координатам
//Координата по X (по горизонтали)
int toX = (project.Variables["ToX"].Value);
//Координата по Y (по вертикали)
int toY = (project.Variables["ToY"].Value);

//Проверка значений
if (toX>instance.ActiveTab.MainDocument.Width)    toX = instance.ActiveTab.MainDocument.Width;
if (toY>instance.ActiveTab.MainDocument.Height)    toY = instance.ActiveTab.MainDocument.Height;
//Движение к указанным координатам
instance.ActiveTab.FullEmulationMouseMove(toX, toY);
Шаб выдает ошибку: Неявное преобразование string в int невозможно
В чем может быть вопрос?

X и Y генерируются стандартными кубиками "random"
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Пробовал сделать подстановку рандомных координат их переменной, сделал такой код:
Код:
// Движение к координатам
//Координата по X (по горизонтали)
int toX = (project.Variables["ToX"].Value);
//Координата по Y (по вертикали)
int toY = (project.Variables["ToY"].Value);

//Проверка значений
if (toX>instance.ActiveTab.MainDocument.Width)    toX = instance.ActiveTab.MainDocument.Width;
if (toY>instance.ActiveTab.MainDocument.Height)    toY = instance.ActiveTab.MainDocument.Height;
//Движение к указанным координатам
instance.ActiveTab.FullEmulationMouseMove(toX, toY);
Шаб выдает ошибку: Неявное преобразование string в int невозможно
В чем может быть вопрос?

X и Y генерируются стандартными кубиками "random"
Сам спросил, сам решил:
Код:
int toX = Convert.ToInt16(project.Variables["ToX"].Value);
:D
 

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 812
Благодарностей
1 187
Баллы
113
  • Спасибо
Реакции: artsmm

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Че-то я подвис немного)) Как сделать, чтобы после клика на сайте:
Код:
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(1000);//ждем 1сек перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
шаб находился на сайте еще 2 - 10 сек ?

Тут можно еще добавить рандомные движения мышью на сайте, но это уже проще))
Заранее спасибо за помощь)

Вроде вот это надо добавить:
Код:
System.Threading.Thread.Sleep(1000);
Может я не прав... Диапазон по-моему задается 1000,2000 и тп
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Можно ли эмулировать движение пальца?
 

Koqpe

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

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Интересует эмуляция touch на мобилках
Где-то попадалась инфа, что в метрике будет отображаться как движение мышью. Но это не точно)
Сам думал заняться этим, но как-то не доходит. Если кто подскажет буду благодарен.
 

VladimirM

Client
Регистрация
20.09.2018
Сообщения
7
Благодарностей
3
Баллы
3
Подскажите пожалуйста, как можно сделать рандом действия мышки, когда в 20% случаев происходит tab1.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));, а в остальных 80% действие tab1.FullEmulationMouseMoveToHtmlElement(h2); для данного кода (строка 13):


Код:
var rnd = new Random();
//Переходим на целевую страничку
Tab tab1 = instance.ActiveTab;
tab1.Navigate("http://4pda.ru/");
if (tab1.IsBusy)    tab1.WaitDownloading();
//Находим коллекцию элементов-постов
var posts = tab1.FindElementsByXPath("//article[@class='post']");
//Проходим в цикле по каждому посту
foreach (var post in posts.Elements){
    //Ищем заголовок поста
    var h2 = post.FindChildByXPath(".//h2",0);
    //Проводим мышкой по заголовку, для второго параметра используем рандом (например, от 30 до 50)
    tab1.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
    //Делаем случайную паузу от 0,1 до 1 секунды
    Thread.Sleep(rnd.Next(1,10) * 100);
    //Ищем текст поста
    var p = post.FindChildByXPath(".//p",0);
    //Проводим мышкой по тексту
    tab1.FullEmulationMouseMoveAboveHtmlElement(p, rnd.Next(30,50));
    //Делаем случайную паузу от 0,5 до 3 секунд
    Thread.Sleep(rnd.Next(4,30) * 100);
    //Для доп рандомизации (или просто опытов), можно также после "прочтения" каждого поста менять настройки движения мышки (метод доступен с версии 5.10.4.1)
    //По умолчанию каждый параметр равен 5. Для их изменения также можно применять рандом:
    //t1.FullEmulationMouseSetOptions(rnd.Next(3,20), 5, rnd.Next(5,10));
}
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Подскажите пожалуйста, как можно сделать рандом действия мышки, когда в 20% случаев происходит tab1.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));, а в остальных 80% действие tab1.FullEmulationMouseMoveToHtmlElement(h2); для данного кода (строка 13):


Код:
var rnd = new Random();
//Переходим на целевую страничку
Tab tab1 = instance.ActiveTab;
tab1.Navigate("http://4pda.ru/");
if (tab1.IsBusy)    tab1.WaitDownloading();
//Находим коллекцию элементов-постов
var posts = tab1.FindElementsByXPath("//article[@class='post']");
//Проходим в цикле по каждому посту
foreach (var post in posts.Elements){
    //Ищем заголовок поста
    var h2 = post.FindChildByXPath(".//h2",0);
    //Проводим мышкой по заголовку, для второго параметра используем рандом (например, от 30 до 50)
    tab1.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
    //Делаем случайную паузу от 0,1 до 1 секунды
    Thread.Sleep(rnd.Next(1,10) * 100);
    //Ищем текст поста
    var p = post.FindChildByXPath(".//p",0);
    //Проводим мышкой по тексту
    tab1.FullEmulationMouseMoveAboveHtmlElement(p, rnd.Next(30,50));
    //Делаем случайную паузу от 0,5 до 3 секунд
    Thread.Sleep(rnd.Next(4,30) * 100);
    //Для доп рандомизации (или просто опытов), можно также после "прочтения" каждого поста менять настройки движения мышки (метод доступен с версии 5.10.4.1)
    //По умолчанию каждый параметр равен 5. Для их изменения также можно применять рандом:
    //t1.FullEmulationMouseSetOptions(rnd.Next(3,20), 5, rnd.Next(5,10));
}
C#:
var rnd = new Random();
//Переходим на целевую страничку
Tab tab1 = instance.ActiveTab;
tab1.Navigate("http://4pda.ru/");
if (tab1.IsBusy)    tab1.WaitDownloading();
//Находим коллекцию элементов-постов
var posts = tab1.FindElementsByXPath("//article[@class='post']");
//Проходим в цикле по каждому посту
foreach (var post in posts.Elements){
    //Ищем заголовок поста
    var h2 = post.FindChildByXPath(".//h2",0);
    if (20 >= new Random().Next(1,101)) {
        //Проводим мышкой по заголовку, для второго параметра используем рандом (например, от 30 до 50)
        tab1.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
    }
    else {
        tab1.FullEmulationMouseMoveToHtmlElement(h2);      
    }
    //Делаем случайную паузу от 0,1 до 1 секунды
    Thread.Sleep(rnd.Next(1,10) * 100);
    //Ищем текст поста
    var p = post.FindChildByXPath(".//p",0);
    //Проводим мышкой по тексту
    tab1.FullEmulationMouseMoveAboveHtmlElement(p, rnd.Next(30,50));
    //Делаем случайную паузу от 0,5 до 3 секунд
    Thread.Sleep(rnd.Next(4,30) * 100);
    //Для доп рандомизации (или просто опытов), можно также после "прочтения" каждого поста менять настройки движения мышки (метод доступен с версии 5.10.4.1)
    //По умолчанию каждый параметр равен 5. Для их изменения также можно применять рандом:
    //t1.FullEmulationMouseSetOptions(rnd.Next(3,20), 5, rnd.Next(5,10));
}
 
Последнее редактирование модератором:

VladimirM

Client
Регистрация
20.09.2018
Сообщения
7
Благодарностей
3
Баллы
3
C#:
var rnd = new Random();
//Переходим на целевую страничку
Tab tab1 = instance.ActiveTab;
tab1.Navigate("http://4pda.ru/");
if (tab1.IsBusy)    tab1.WaitDownloading();
//Находим коллекцию элементов-постов
var posts = tab1.FindElementsByXPath("//article[@class='post']");
//Проходим в цикле по каждому посту
foreach (var post in posts.Elements){
    //Ищем заголовок поста
    var h2 = post.FindChildByXPath(".//h2",0);
    if (20 <= new Random().Next(1,101)) {
        //Проводим мышкой по заголовку, для второго параметра используем рандом (например, от 30 до 50)
        tab1.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
    }
    else {
        tab1.FullEmulationMouseMoveToHtmlElement(h2);      
    }
    //Делаем случайную паузу от 0,1 до 1 секунды
    Thread.Sleep(rnd.Next(1,10) * 100);
    //Ищем текст поста
    var p = post.FindChildByXPath(".//p",0);
    //Проводим мышкой по тексту
    tab1.FullEmulationMouseMoveAboveHtmlElement(p, rnd.Next(30,50));
    //Делаем случайную паузу от 0,5 до 3 секунд
    Thread.Sleep(rnd.Next(4,30) * 100);
    //Для доп рандомизации (или просто опытов), можно также после "прочтения" каждого поста менять настройки движения мышки (метод доступен с версии 5.10.4.1)
    //По умолчанию каждый параметр равен 5. Для их изменения также можно применять рандом:
    //t1.FullEmulationMouseSetOptions(rnd.Next(3,20), 5, rnd.Next(5,10));
}
Благодарю, то что нужно!
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Благодарю, то что нужно!
Ахтунг, там критическая ошибка, наоборот знак надо поставить, а уже не могу пост отредактировать. Вместо неправильного:
C#:
if (20 <= new Random().Next(1,101))
надо вот так:
C#:
if (20 >= new Random().Next(1,101))
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
  • Спасибо
Реакции: orka13

Misha

Client
Регистрация
23.10.2016
Сообщения
250
Благодарностей
71
Баллы
28
Приветствую всех!

Не так давно ZennoLab порадовали нас обновой с виртуальной мышью. Хотя лично у меня пока не было нужды использовать мышь в своих проектах, из интереса посидел вечерок за тестами новой эмуляции. В результате родились на свет пара сниппетов и чутка размышлений, кои и представлены ниже - возможно кому пригодятся.

Итак, появилось несколько методов работы с виртуальной мышью, доступных из C#-кода.
Самый интересный, несомненно, FullEmulationMouseMoveAboveHtmlElement, предназначенный для эмуляции чтения. Метод принимает в качестве параметров элемент страницы, который нужно "прочесть", и некий sizeOfType в виде некоего числа. На момент создания темы до сих пор непонятно, что это за sizeOfType такой - в документации объяснения нет, от разработчиков конкретного ответа тоже не было. Много тестил поведение метода с различными значениями, но так и не пришёл к понятному объяснению, как и на что влияет этот параметр. Если кто-то понял его назначение, или хотя бы есть однозначные предположения - большая просьба отписаться.
Также добавлю, что в ходе тестов не получилось найти и оптимального значения sizeOfType, при котором эмуляция чтения смотрелась бы более-менее реалистично. Моё мнение - над реализацией этой виртуальной мыши разработчикам ещё работать и работать.

Но довольно о проблемах. Так как виртуальная мышь сейчас доступна только из кода, с которым немало пользователей ZennoPoster "на Вы", разберём пару простых задач с применением виртуальной мыши. Для примера возьмём главную страницу известного портала 4pda.

Задача 1: "прочитать" рандомный пост с главной страницы и перейти к его полной версии.
C#:
var rnd = new Random();

//Переходим на целевую страничку
Tab tab1 = instance.ActiveTab;
tab1.Navigate("http://4pda.ru/");
if (tab1.IsBusy)    tab1.WaitDownloading();

//Находим коллекцию элементов-постов (на главной нашего сайта их 30 штук)
//Эти элементы будем использовать как родительские, для поиска заголовка и контента каждого из постов
var posts = tab1.FindElementsByXPath("//article[@class='post']");
//Я обычно использую XPath, но можно искать и просто по атрибутам:
//posts = tab1.FindElementsByAttribute("article", "class", "post", "text");

//Если ни одного поста не найдено, выходим из сниппета по красной ветке
if (posts.Count==0)    throw new Exception("Посты не найдены!");

//Получаем рандомный пост на странице
var post = posts.GetByNumber(rnd.Next(0,posts.Count));

//Ведём мышку к этому посту
tab1.FullEmulationMouseMoveToHtmlElement(post);

//Ищем заголовок поста
var h2 = post.FindChildByXPath(".//h2",0);
//Проводим мышкой по заголовку
tab1.FullEmulationMouseMoveAboveHtmlElement(h2, 30);

//Ищем текст поста
var p = post.FindChildByXPath(".//p",0);
//Проводим мышкой по тексту
tab1.FullEmulationMouseMoveAboveHtmlElement(p, 40);

Thread.Sleep(2000);    //Пауза 2 с

//Ведём мышку к кнопке "далее" и кликаем по ней
var more = post.FindChildByXPath(".//a[text()='далее']",0);
tab1.FullEmulationMouseMoveToHtmlElement(more);
tab1.FullEmulationMouseClick("left", "click");

Задача 2: "прочитать" все посты на главной странице.
C#:
var rnd = new Random();

//Переходим на целевую страничку
Tab tab1 = instance.ActiveTab;
tab1.Navigate("http://4pda.ru/");
if (tab1.IsBusy)    tab1.WaitDownloading();

//Находим коллекцию элементов-постов
var posts = tab1.FindElementsByXPath("//article[@class='post']");

//Проходим в цикле по каждому посту
foreach (var post in posts.Elements){
 
    //Ищем заголовок поста
    var h2 = post.FindChildByXPath(".//h2",0);
    //Проводим мышкой по заголовку, для второго параметра используем рандом (например, от 30 до 50)
    tab1.FullEmulationMouseMoveAboveHtmlElement(h2, rnd.Next(30,50));
    //Делаем случайную паузу от 0,1 до 1 секунды
    Thread.Sleep(rnd.Next(1,10) * 100);
 
    //Ищем текст поста
    var p = post.FindChildByXPath(".//p",0);
    //Проводим мышкой по тексту
    tab1.FullEmulationMouseMoveAboveHtmlElement(p, rnd.Next(30,50));
    //Делаем случайную паузу от 0,5 до 3 секунд
    Thread.Sleep(rnd.Next(4,30) * 100);
 
    //Для доп рандомизации (или просто опытов), можно также после "прочтения" каждого поста менять настройки движения мышки (метод доступен с версии 5.10.4.1)
    //По умолчанию каждый параметр равен 5. Для их изменения также можно применять рандом:
    //t1.FullEmulationMouseSetOptions(rnd.Next(3,20), 5, rnd.Next(5,10));
}
Перед использованием методов FullEmulationMouseMoveAboveHtmlElement и FullEmulationMouseSetOptions рекомендую потестить разные значения их целочисленных параметров, возможно вам удастся получить более адекватные движения мышки.

Если у вас вопросы, идеи сниппетов, или же есть самим что написать по теме виртуальной мыши - жду ваших сообщений в топике. :-)

классная статья благодарю)
Но что-то трудно разобраться самому!
Может вы поможете как проскролить на этой странице
https://yandex.ua/maps/11121/almetyevsk/?lang=ru&ll=52.285642,54.904504&mode=search&sll=132.851044,42.774340&sspn=0.180588,0.070060&text=Альметьевск суши&z=13
 

Вложения

Misha

Client
Регистрация
23.10.2016
Сообщения
250
Благодарностей
71
Баллы
28
У меня курсор двигается по странице, только вот скрол не скролится
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
спасибо огромное! реализовал перетаскивание дивов, с которыми кубики не справлялись.
 
  • Спасибо
Реакции: Mikhail B.

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Всем привет. Как правильно должен работать данный код?
Код:
int x = Convert.ToInt32(project.Variables["ToX"].Value);
int y = Convert.ToInt32(project.Variables["ToY"].Value);
Random rnd = new Random();
x += rnd.Next(50, 200);
y += rnd.Next(50, 200);
// массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[10]
{
    new Point(x, y),
    new Point(x + 10, y + 5),
    new Point(x + 20, y + 10),
    new Point(x + 30, y + 15),
    new Point(x + 40, y + 20),
    new Point(x + 50, y + 25),
    new Point(x + 60, y + 30),
    new Point(x + 70, y + 35),
    new Point(x + 80, y + 40),
    new Point(x + 90, y + 45)
};
// случайные задержки между движениями
int[] delay = new int[10] {
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150)
};
// функция, выполняющая движение по заданной траектории с указанными задержками
instance.ActiveTab.MouseMove(points, delay, false);
У меня он почему-то выдает коротенькое движение мышью и затихает .. Судя по коду, он должен 10 точек пройти или я что-то не так понял?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Всем привет. Как правильно должен работать данный код?
Код:
int x = Convert.ToInt32(project.Variables["ToX"].Value);
int y = Convert.ToInt32(project.Variables["ToY"].Value);
Random rnd = new Random();
x += rnd.Next(50, 200);
y += rnd.Next(50, 200);
// массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[10]
{
    new Point(x, y),
    new Point(x + 10, y + 5),
    new Point(x + 20, y + 10),
    new Point(x + 30, y + 15),
    new Point(x + 40, y + 20),
    new Point(x + 50, y + 25),
    new Point(x + 60, y + 30),
    new Point(x + 70, y + 35),
    new Point(x + 80, y + 40),
    new Point(x + 90, y + 45)
};
// случайные задержки между движениями
int[] delay = new int[10] {
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150)
};
// функция, выполняющая движение по заданной траектории с указанными задержками
instance.ActiveTab.MouseMove(points, delay, false);
У меня он почему-то выдает коротенькое движение мышью и затихает .. Судя по коду, он должен 10 точек пройти или я что-то не так понял?
именно так и должен делать. Только там фактически не "движения" мишки получаются, а просто курсор прыгает между точками. Для плавности курсора лучше вот так:
C#:
int x = Convert.ToInt32(project.Variables["ToX"].Value);
int y = Convert.ToInt32(project.Variables["ToY"].Value);
Random rnd = new Random();
x += rnd.Next(50, 200);
y += rnd.Next(50, 200);
// массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[10]
{
    new Point(x, y),
    new Point(x + 10, y + 5),
    new Point(x + 20, y + 10),
    new Point(x + 30, y + 15),
    new Point(x + 40, y + 20),
    new Point(x + 50, y + 25),
    new Point(x + 60, y + 30),
    new Point(x + 70, y + 35),
    new Point(x + 80, y + 40),
    new Point(x + 90, y + 45)
};
// в цикле двигаем курсором между точками
for (int i = 0; i<10; i++)
{
    //задаем рандомно скорость движения для каждого рывка:
    instance.ActiveTab.FullEmulationMouseSetOptions(rnd.Next(4,7),rnd.Next(4,7),rnd.Next(2,5));
    //Двигаем мышкой плавно:
    instance.ActiveTab.FullEmulationMouseMove(points.ElementAt(i).X, points.ElementAt(i).Y);
}
А если задачей было сделать рандомное движение курсора, то можно вот так переделать этот код, с заданием любого количества точек в цикле:
C#:
int x = Convert.ToInt32(project.Variables["ToX"].Value);
int y = Convert.ToInt32(project.Variables["ToY"].Value);
Random rnd = new Random();
// указываем количество точек
int Kolichestvo_Tochek = 33;
// обьявляем массив точек, по которым будет двигаться курсор мыши
Point[] points = new Point[Kolichestvo_Tochek];
// в цикле заполняем наш масив
for (int i = 0; i<Kolichestvo_Tochek; i++)
{
    // указываем рандомные пределы для сдвига курсора в пикселях:
    x += rnd.Next(-64,64);
    y += rnd.Next(-64,64);
    // если координаты выходят за пределы страницы (минусовые), то водим не доходя до края (меняем на "чуть плюсовые").
    if (x < 0) {
        x = rnd.Next(0,5);
    }
    if (y < 0) {
        y = rnd.Next(0,5);
    }
    points[i] = new Point(x, y);
    project.SendInfoToLog(x.ToString() + " , " + y.ToString(), false); // выводим в лог координаты
}

// в цикле двигаем курсором между точками
for (int i = 0; i<Kolichestvo_Tochek; i++)
{
    //задаем рандомно скорость движения для каждого рывка:
    instance.ActiveTab.FullEmulationMouseSetOptions(rnd.Next(4,7),rnd.Next(4,7),rnd.Next(2,5));
    //Двигаем мышкой плавно:
    instance.ActiveTab.FullEmulationMouseMove(points.ElementAt(i).X, points.ElementAt(i).Y);
}
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Благодарю, вы оч помогли:-))
 

Fantomass

Client
Регистрация
13.04.2016
Сообщения
86
Благодарностей
36
Баллы
18
А если задачей было сделать рандомное движение курсора, то можно вот так переделать этот код, с заданием любого количества точек в цикле:
Подскажите, а переменные x и y, значения которых записываются из переменных проекта - это координаты куда в итоге должен быть подведен курсор?
 

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