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

Alex733

Client
Регистрация
27.11.2017
Сообщения
330
Благодарностей
243
Баллы
43
  • Спасибо
Реакции: Koqpe

andrey-ka

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

andrey-ka

Client
Регистрация
03.06.2018
Сообщения
855
Благодарностей
246
Баллы
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, CC.rnd(elemHeight + 120, elemHeight + 170));
            }
            if (xyhe.Y <= 10) {
               tab.FullEmulationMouseWheel(0, -1 * CC.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 ? CC.rnd(-4,deltaX): CC.rnd(-1*deltaX,4);
                  
                    if (deltaZero) { deltaX = 0; deltaY = 0; }
                     int targetX = sharpTrgX - deltaX;
                     int targetY = xyhe.Y + elemHeight/2 + CC.rnd(-1*deltaY,deltaY);
                     tab.FullEmulationMouseMove(targetX, targetY);
                    tab.FullEmulationMouseMove(targetX+1, targetY);
        if (click) tab.FullEmulationMouseClick("left", "click");
      }
Спасибо
 

rentrope

Client
Регистрация
28.05.2015
Сообщения
1
Благодарностей
0
Баллы
1
Кто подскажет как кликать по option - нам в select с помощью мышки.
Код и сайт для примера:
Код:
Random regRandom = new Random();

Tab Tab1 = instance.ActiveTab;

//Переходим на сайт
Tab1.Navigate("http://www.i.ua");
Tab1.WaitDownloading();
Thread.Sleep(regRandom.Next(3500, 5500));//пауза

//Находим select
HtmlElement selDom = Tab1.FindElementByName("domn");

//Получаем координаты
string elDayleft = selDom.GetAttribute("leftInTab");
string elDaytop = selDom.GetAttribute("topInTab");

//Перемещаем и кликаем
Tab1.FullEmulationMouseMove(Int32.Parse(elDayleft) + 10,Int32.Parse(elDaytop) + 10);
Thread.Sleep(regRandom.Next(500, 2500));
Tab1.FullEmulationMouseClick("left", "click");
Thread.Sleep(regRandom.Next(1000, 2500));

//Перемещаем чуть ниже и кликаем
Tab1.FullEmulationMouseMove(Int32.Parse(elDayleft) + 10,Int32.Parse(elDaytop) + 55);
Thread.Sleep(regRandom.Next(500, 2500));
Tab1.FullEmulationMouseClick("left", "click");
Thread.Sleep(regRandom.Next(1000, 2500));
Клик происходит как бы под списком. Сами элементы списка при движении мыши тоже не выбираются.
Варианты с: element.SetAttribute("selected", "1"); и element.SetSelectedItems("1"); не подходят. Хочу кликнуть эмуляцией мышки.
Помогите плз.
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 307
Благодарностей
865
Баллы
113

andrey-ka

Client
Регистрация
03.06.2018
Сообщения
855
Благодарностей
246
Баллы
43
Кто подскажет как кликать по option - нам в select с помощью мышки.
Помогите плз.
Это баг зенки, такое же поведение на всех сайтах где список реализован Select->option.

Можешь мышкой наводить на элемент и делать htmlelement.click();
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
  • Спасибо
Реакции: Dr.Pipetka

Bas

Client
Регистрация
15.12.2013
Сообщения
637
Благодарностей
263
Баллы
63
Код не много не причесан, прошу понять и простить.
Подробная инструкция в коде - в комментариях.
Кратко: - вызываем из кубика 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: Убрал в коде пару лишних символов.
Вроде все понятно, но почему-то отказывается работать, выдает ошибку "CSharp OwnCode Входная строка имела неверный формат.". Вызываю вот так:
Код:
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("-1").FindElementByAttribute("a", "href", "news", "regexp", 19);
CenterClick.FullEmulMoveToCenterOfElm(instance, he, false, false);
Что я не так делаю?
 

Alex733

Client
Регистрация
27.11.2017
Сообщения
330
Благодарностей
243
Баллы
43
Что я не так делаю?
Попробуй в отладчике прогнать.
Скорей всего не срабатывает определение ширины окна в собственном коде.
C#:
int windheight =  int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
Попробуй, так сделать
C#:
int windheight =  int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;", true));
 

Bas

Client
Регистрация
15.12.2013
Сообщения
637
Благодарностей
263
Баллы
63
Попробуй в отладчике прогнать.
Скорей всего не срабатывает определение ширины окна в собственном коде.
C#:
int windheight =  int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
Попробуй, так сделать
C#:
int windheight =  int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;", true));
Ошибка вылезает при выполнении строки "int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));".

Если просто заменить строку на указанную Вами, получаю ошибку "CSharp OwnCode Script Error: Error: call to eval() blocked by CSP".

Версия 5.27.1.0.
 

Alex733

Client
Регистрация
27.11.2017
Сообщения
330
Благодарностей
243
Баллы
43
Ошибка вылезает при выполнении строки "int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));".

Если просто заменить строку на указанную Вами, получаю ошибку "CSharp OwnCode Script Error: Error: call to eval() blocked by CSP".
Вот и ответ.
Способ устранения:
В шаблоне перед всеми загрузками страниц, нужно выполнить кубик
C#:
instance.SetBrowserPreference("security.csp.enable", false);

Решение легко ищется на форуме - такая же пилюля
 
  • Спасибо
Реакции: Bas

Bas

Client
Регистрация
15.12.2013
Сообщения
637
Благодарностей
263
Баллы
63

CmauJluk

Client
Регистрация
25.12.2017
Сообщения
287
Благодарностей
60
Баллы
28
Не как не понять каким образом сделать к примеру поиск только в первых 4 постах я в c# полный ноль
 

hvg84

Client
Регистрация
06.11.2017
Сообщения
61
Благодарностей
8
Баллы
8
Всем привет, подскажите как реализовать поиск определенного текста на странице, и сделать клик мышей чуть ниже текста. Это реально?
 

Кирилл412

Пользователь
Регистрация
21.11.2018
Сообщения
146
Благодарностей
3
Баллы
18
А кто нибудь подскажет, как скролить не саму страницу, а выпадающий список?
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 366
Благодарностей
9 098
Баллы
113
А кто нибудь подскажет, как скролить не саму страницу, а выпадающий список?
Можно попробовать активировать меню-список и выполнять код:
Код:
instance.WaitFieldEmulationDelay();
instance.SendText("{DOWN}", 15);
 

Кирилл412

Пользователь
Регистрация
21.11.2018
Сообщения
146
Благодарностей
3
Баллы
18
Можно попробовать активировать меню-список и выполнять код:
Код:
instance.WaitFieldEmulationDelay();
instance.SendText("{DOWN}", 15);
Вроде решил вопрос, мышку в поле списка завести, и срабатывает.. А не подскажете, чистить куки и кеш надо кубиками?, в настройках проекта и настройках записи проекта галки стоят
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 366
Благодарностей
9 098
Баллы
113
Вроде решил вопрос, мышку в поле списка завести, и срабатывает.. А не подскажете, чистить куки и кеш надо кубиками?, в настройках проекта и настройках записи проекта галки стоят
Кеш не обязательно, раз стоит галка в настройках шаблона.
Насчет кубика очистки куков, если галку в Настройках ПМ снимете, то кубик не будет создаваться при создании шаблона.

upload_2019-3-16_11-29-24.png
 

Кирилл412

Пользователь
Регистрация
21.11.2018
Сообщения
146
Благодарностей
3
Баллы
18
Кеш не обязательно, раз стоит галка в настройках шаблона.
Насчет кубика очистки куков, если галку в Настройках ПМ снимете, то кубик не будет создаваться при создании шаблона.

Посмотреть вложение 37185
Что то про куки ен совсем понял, если галка стоит, то будкт очищаться автоматом, если нет, то только после кубика, если он есть в проекте, так?.. кубик при создании шаблона не создается автоматом ни с галкой, ни без галки
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 366
Благодарностей
9 098
Баллы
113
Что то про куки ен совсем понял, если галка стоит, то будкт очищаться автоматом, если нет, то только после кубика, если он есть в проекте, так?.. кубик при создании шаблона не создается автоматом ни с галкой, ни без галки
С галкой в настройках кубик очистки куков должен создаваться при создании нового проекта, если создавать его c активной Записью:

upload_2019-3-16_13-53-0.png

Если кубика очистки куков на полотне проекта нет, то очистки куков не будет.
 
  • Спасибо
Реакции: Кирилл412

Кирилл412

Пользователь
Регистрация
21.11.2018
Сообщения
146
Благодарностей
3
Баллы
18
С галкой в настройках кубик очистки куков должен создаваться при создании нового проекта, если создавать его c активной Записью:

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

Если кубика очистки куков на полотне проекта нет, то очистки куков не будет.
Понял, спасибо
 

lexadze

Client
Регистрация
02.07.2018
Сообщения
28
Благодарностей
8
Баллы
3
Подскажите как решить проблему с эмуляцией мыши. Проблема в том, что если выполнять шаблон в ЗП и не включить отображение инстанса, то эмуляция кликов по нужным элементам не происходит (если включить отображение инстанса то все ок). Тоже самое и в ПМ, если клик по элементу происходит за пределами видимой области (прокрутка лево право в браузере ПМ), то клик по элементу не происходит.
 
Последнее редактирование:

lexadze

Client
Регистрация
02.07.2018
Сообщения
28
Благодарностей
8
Баллы
3
Подскажите как решить проблему с эмуляцией мыши. Проблема в том, что если выполнять шаблон в ЗП и не включить отображение инстанса, то эмуляция кликов по нужным элементам не происходит (если включить отображение инстанса то все ок). Тоже самое и в ПМ, если клик по элементу происходит за пределами видимой области (прокрутка лево право в браузере ПМ), то клик по элементу не происходит.
Если у кого-то возникнут такие же проблемы, то решение оказалось простым, нужно увеличить размер окна инстанса, что бы все элементы были в видимой области. instance.SetWindowSize(1920, 1680); // можно вставить свое значение вместо 1920, 1680
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Приветствую. Оч интересная тема. Как сделать 1) поиск нужного урла в поисковой выдаче? 2) затем клик по нему? Не соображу как переменные куда подставить.. Может подскажете строчку кода?
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Приветствую. Оч интересная тема. Как сделать 1) поиск нужного урла в поисковой выдаче? 2) затем клик по нему? Не соображу как переменные куда подставить.. Может подскажете строчку кода?
Какой поисковик?
Для Google'а такой сниппет работает, правда не знаю насколько хорошо.

Код:
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", "https://ru.wikipedia.org", "regexp", 0);//находим элемент по УРЛу

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

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
Какой поисковик?
Для Google'а такой сниппет работает, правда не знаю насколько хорошо.

Код:
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", "https://ru.wikipedia.org", "regexp", 0);//находим элемент по УРЛу

instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
Поисковик яндекс, но думаю принцип тот же, что вы указали) Спасибо
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Поисковик яндекс, но думаю принцип тот же, что вы указали) Спасибо
Главное правильно найти элемент по атрибуту. А там подставляете три строчки последние.
У Яндекса вроде тоже подходит.
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
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", не выходим из цикла
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//наводим мышь на элемент
System.Threading.Thread.Sleep(rand.Next(500, 1000));//случайно ждем время до клика от 0.5 секунды до 1й
instance.ActiveTab.FullEmulationMouseClick("left", "click");//нажимает левой кнопкой мыши на элемент
На случай, если нужен рандомный клик.
 
  • Спасибо
Реакции: artsmm

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", не выходим из цикла
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//наводим мышь на элемент
System.Threading.Thread.Sleep(rand.Next(500, 1000));//случайно ждем время до клика от 0.5 секунды до 1й
instance.ActiveTab.FullEmulationMouseClick("left", "click");//нажимает левой кнопкой мыши на элемент
На случай, если нужен рандомный клик.
Благодарю. Вместе урла, где википедия стоит, можно свою переменную подставить, чтобы урл брался из файла?
Если правильно понимаю, то нужно так сделать: "project.Variables["domen"].Value". Так можно подставить?
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Благодарю. Вместе урла, где википедия стоит, можно свою переменную подставить, чтобы урл брался из файла?
Если правильно понимаю, то нужно так сделать: "project.Variables["domen"].Value". Так можно подставить?
Да.
 
  • Спасибо
Реакции: artsmm

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