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

Rooter85

Client
Joined
Jul 4, 2015
Messages
245
Reaction score
64
Points
28
Текстовые значения могут быть на разных языках. Значение class ZFr60d CeoRYc
Какое количество языков используется? Если всего 2 то можно сделать сравнение двух вариантов. Значение класса, которое сейчас срабатывает, выглядит не постоянным и может перестать работать. Вам нужно зацепиться за что-то более стабильное. Если вы хотите нажать кнопку "Далее" на первом экране, то там есть div с id. Вот попробуйте для примера такой путь //div[@id='identifierNext']/descendant::span
 

Peplos

Client
Joined
Jul 31, 2018
Messages
28
Reaction score
6
Points
3
Какое количество языков используется? Если всего 2 то можно сделать сравнение двух вариантов. Значение класса, которое сейчас срабатывает, выглядит не постоянным и может перестать работать. Вам нужно зацепиться за что-то более стабильное. Если вы хотите нажать кнопку "Далее" на первом экране, то там есть div с id. Вот попробуйте для примера такой путь //div[@id='identifierNext']/descendant::span
Языков по непонятной причине много, не 2. Хотя использую только ру прокси, но периодически появляются разные языки, начиная от английского и заканчивая вообще непойми каким. Но при входе через кубик, вышеуказанное значение класса всегда одно и тоже, осечек не было. Не пойму только, почему через кубик это значение всегда находится без проблем, а с помощью кода на находится вообще никак, ни через class, ни через text.
 

artsmm

Client
Joined
Oct 3, 2018
Messages
1,136
Reaction score
196
Points
63
Всем привет)
Накатал код для работы с гуглом. Можете помочь разобраться, где какие ошибки возникают?
Только осваиваю c# )

Ошибки такие:
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FindElementByXPath" не принимает "1" аргументов". [Строка: 16; Cтолбец: 41]
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FindElementByXPath" не принимает "1" аргументов". [Строка: 21; Cтолбец: 48]
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FullEmulationMouseMoveAboveHtmlElement" не принимает "1" аргументов". [Строка: 21; Cтолбец: 4]
Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "HmtlElement" (пропущена директива using или ссылка на сборку?)". [Строка: 31; Cтолбец: 3]

Что должен делать:

Предварительно заходим в гугл по нужному запросу, дальше работает этот код:
1. Ищем нужный домен на заданном количестве страниц (задается в настройках pages_c)
2. Если не нашли на первой, перелистываем стр дальше, пока
3. не найдем или пока не закончатся стр
все.

C#:
var rnd = new Random();
Tab tab1 = instance.ActiveTab;

string targetDomain = project.Variables["target_domain"].Value;
    if (String.IsNullOrWhiteSpace(targetDomain)){
        return "Имя домена не может быть пустой строкой..";
    }
    project.SendInfoToLog(String.Format("Переходим на сайт {0}", targetDomain), true);
   
    string targetXPath = String.Format("//a[@id='pnnext']/span[2]", targetDomain);
    int serpPagesLimit = Int32.Parse(project.Variables["pages_c"].Value);
    HtmlElement ClickPosition = null;
   
    for(int currentSerpPage = 1; currentSerpPage <= serpPagesLimit; currentSerpPage++){
        project.SendInfoToLog(String.Format("Начинаем с №{0} страницы выдачи", currentSerpPage), true);
       
        HtmlElemntCollection domainPosition = tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain));
        if(domainPosition.Count==0) {
            project.SendInfoToLog(String.Format("Не нашли домен на 1й странице выдачи", targetDomain, currentSerpPage), true);
        }
        else{
            tab1.FullEmulationMouseMoveAboveHtmlElement(tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain)));
            Thread.Sleep(rnd.Next(120, 320));
            tab1.FullEmulationMouseClick("left", "click");
           
            Thread.Sleep(4000);
           
            tab1 = instance.GetTabByAddress("popup");
            tab1.WaitDownloading();
        }
       
        HmtlElement elemNext = tab1.FindElementByXPath("//a[@id='pnnext']/span[2]", 0);
        if(elemNext.IsVoid) {
            project.SendInfoToLog("Не найдена ссылка 'Следующая' в поиске..", true);
            break;
        }
       
        tab1.FullEmulationMouseMoveToHtmlElement(elemNext);
        Thread.Sleep(rnd.Next(120, 340));
        tab1.FullEmulationMouseClick("left","click");
       
        tab1.WaitDownloading();
    }
 

b1zar

Client
Joined
Jun 29, 2019
Messages
107
Reaction score
68
Points
28
Всем привет)
Накатал код для работы с гуглом. Можете помочь разобраться, где какие ошибки возникают?
Только осваиваю c# )

Ошибки такие:
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FindElementByXPath" не принимает "1" аргументов". [Строка: 16; Cтолбец: 41]
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FindElementByXPath" не принимает "1" аргументов". [Строка: 21; Cтолбец: 48]
Ошибка в действии "CS1501" "Ни одна из перегрузок метода "FullEmulationMouseMoveAboveHtmlElement" не принимает "1" аргументов". [Строка: 21; Cтолбец: 4]
Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "HmtlElement" (пропущена директива using или ссылка на сборку?)". [Строка: 31; Cтолбец: 3]

Что должен делать:

Предварительно заходим в гугл по нужному запросу, дальше работает этот код:
1. Ищем нужный домен на заданном количестве страниц (задается в настройках pages_c)
2. Если не нашли на первой, перелистываем стр дальше, пока
3. не найдем или пока не закончатся стр
все.

C#:
var rnd = new Random();
Tab tab1 = instance.ActiveTab;

string targetDomain = project.Variables["target_domain"].Value;
    if (String.IsNullOrWhiteSpace(targetDomain)){
        return "Имя домена не может быть пустой строкой..";
    }
    project.SendInfoToLog(String.Format("Переходим на сайт {0}", targetDomain), true);
   
    string targetXPath = String.Format("//a[@id='pnnext']/span[2]", targetDomain);
    int serpPagesLimit = Int32.Parse(project.Variables["pages_c"].Value);
    HtmlElement ClickPosition = null;
   
    for(int currentSerpPage = 1; currentSerpPage <= serpPagesLimit; currentSerpPage++){
        project.SendInfoToLog(String.Format("Начинаем с №{0} страницы выдачи", currentSerpPage), true);
       
        HtmlElemntCollection domainPosition = tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain));
        if(domainPosition.Count==0) {
            project.SendInfoToLog(String.Format("Не нашли домен на 1й странице выдачи", targetDomain, currentSerpPage), true);
        }
        else{
            tab1.FullEmulationMouseMoveAboveHtmlElement(tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain)));
            Thread.Sleep(rnd.Next(120, 320));
            tab1.FullEmulationMouseClick("left", "click");
           
            Thread.Sleep(4000);
           
            tab1 = instance.GetTabByAddress("popup");
            tab1.WaitDownloading();
        }
       
        HmtlElement elemNext = tab1.FindElementByXPath("//a[@id='pnnext']/span[2]", 0);
        if(elemNext.IsVoid) {
            project.SendInfoToLog("Не найдена ссылка 'Следующая' в поиске..", true);
            break;
        }
       
        tab1.FullEmulationMouseMoveToHtmlElement(elemNext);
        Thread.Sleep(rnd.Next(120, 340));
        tab1.FullEmulationMouseClick("left","click");
       
        tab1.WaitDownloading();
    }
tab1.FullEmulationMouseMoveAboveHtmlElement(tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain))); Thread.Sleep(rnd.Next(120, 320)); проблема в том, что у гугла при каждом обновлении будет изменятся xPath, когда ты писал код было //h3[@class='LC20lb обновляешь страницу и он меняется, изза этого у тебя ошибки.
 

artsmm

Client
Joined
Oct 3, 2018
Messages
1,136
Reaction score
196
Points
63
tab1.FullEmulationMouseMoveAboveHtmlElement(tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain))); Thread.Sleep(rnd.Next(120, 320)); проблема в том, что у гугла при каждом обновлении будет изменятся xPath, когда ты писал код было //h3[@class='LC20lb обновляешь страницу и он меняется, изза этого у тебя ошибки.
Интересно) а если предварительно парсить это значение и подставлять переменной в код?
 

doc

Client
Joined
Mar 30, 2012
Messages
8,685
Reaction score
4,648
Points
113
Интересно) а если предварительно парсить это значение и подставлять переменной в код?
есди ты знаешь как парсить - на основе этих знаний стоит составить правильный xpath, а не придумывать ненужных посредников
 

artsmm

Client
Joined
Oct 3, 2018
Messages
1,136
Reaction score
196
Points
63
есди ты знаешь как парсить - на основе этих знаний стоит составить правильный xpath, а не придумывать ненужных посредников
Понял, вычеркиваю :D
 

artsmm

Client
Joined
Oct 3, 2018
Messages
1,136
Reaction score
196
Points
63
Накатал код для работы с гуглом
Неправильно классы брал. Чтобы проверить код, сократил до самой сути)
В итоге так получается:
C#:
var rnd = new Random();

Tab tab1 = instance.ActiveTab;
var post = tab1.FindElementByAttribute("cite", "class", project.Variables["target_domain"].Value, "regexp", 0);//находим элемент

//Если не находим домен, выходим по красной ветке
if (post.Count==0) throw new Exception ("Сайт не найден на " + project.Variables["pages_c1"].Value + " странице поисковой выдачи");

project.SendInfoToLog(String.Format("Переходим на сайт {0}", post), true);

tab1.FullEmulationMouseMoveToHtmlElement(post);
Thread.Sleep(500);
tab1.FullEmulationMouseClick("left","click");
 

artsmm

Client
Joined
Oct 3, 2018
Messages
1,136
Reaction score
196
Points
63
if (post.Count==0) throw new Exception ("Сайт не найден на " + project.Variables["pages_c1"].Value + " странице поисковой выдачи");
Ошибочка. Вот так верно:
//Если не находим домен, выходим по красной ветке
if (posts == null) throw new Exception ("Сайт не найден на " + project.Variables["pages_c1"].Value + " странице поисковой выдачи");
 

juk88

Client
Joined
May 30, 2018
Messages
90
Reaction score
12
Points
8
Извиняюсь за тупость, что нужно прописать в этом коде, чтоб если не находило сайт, выходило по красной ветке? А то, в любом случае, выходит по зелёной.


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");//ЛКМ по ссылке
 

juk88

Client
Joined
May 30, 2018
Messages
90
Reaction score
12
Points
8
Вроде сделал. Нашол ответ здесь на форуме. Может кому пригодится:

HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["site"].Value), "regexp", 0);//находим элемент по УРЛу
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
if (he.IsVoid) throw new Exception("Не найдено и т.д."); // их всегда надо проверять
he.Click();
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
 

Rooter85

Client
Joined
Jul 4, 2015
Messages
245
Reaction score
64
Points
28
Вроде сделал. Нашол ответ здесь на форуме. Может кому пригодится:
Это неправильный код. Проверка наличия элемента на странице, должна быть раньше, чем движение мышки к нему. И зачем 2 раза кликать?
 
  • Thank you
Reactions: juk88

juk88

Client
Joined
May 30, 2018
Messages
90
Reaction score
12
Points
8
Это неправильный код. Проверка наличия элемента на странице, должна быть раньше, чем движение мышки к нему. И зачем 2 раза кликать?
Я сделал методом тыка. Еслиб знал как правильно, не спрашивал бы здесь. Работает-же.
 

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,725
Points
113
Я сделал методом тыка. Еслиб знал как правильно, не спрашивал бы здесь. Работает-же.
работает до первого сбоя в браузере. а они очень часто происходят.
вот так правильно
C#:
if ((instance.ActiveTab.IsVoid) || (instance.ActiveTab.IsNull)) throw new Exception("Не найдено вкладки");
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["site"].Value), "regexp", 0);//находим элемент по УРЛу
if (he.IsVoid) throw new Exception("Не найдено и т.д."); // их всегда надо проверять
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//двигаем мышку к нему
System.Threading.Thread.Sleep(500);//ждем пол секунды перед нажатием
instance.ActiveTab.FullEmulationMouseClick("left", "click");//ЛКМ по ссылке
 

juk88

Client
Joined
May 30, 2018
Messages
90
Reaction score
12
Points
8
Это неправильный код. Проверка наличия элемента на странице, должна быть раньше, чем движение мышки к нему. И зачем 2 раза кликать?
Поправил, спасибо за подсказку!
 
  • Thank you
Reactions: Rooter85

juk88

Client
Joined
May 30, 2018
Messages
90
Reaction score
12
Points
8
работает до первого сбоя в браузере. а они очень часто происходят.
вот так правильно
C#:
if ((instance.ActiveTab.IsVoid) || (instance.ActiveTab.IsNull)) throw new Exception("Не найдено вкладки");
HtmlElement he = instance.ActiveTab.FindElementByAttribute("a", "href", (project.Variables["site"].Value), "regexp", 0);//находим элемент по УРЛу
Не совсем понял только, зачем вкладку проверять?
 

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,725
Points
113
Не совсем понял только, зачем вкладку проверять?
как зачем ? а если сбой в браузере ? она к примеру нулевая , код к ней обращается и вот тут хорошо если это просто сбой, а если браузер завис ? в первом случае проект по BAD END выйдет, а во втором случае получаешь зависший поток.... и к куче сообщений на форуме прибавиться твое , а что делать с зависшим шаблоном :-)
 

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,725
Points
113
да и еще параметры элемента проверять надо. на видимость.

а ошибок можно нахватать кучу, при самом простом шаблоне.
вот глянь простой щаблон , просто кликает по ссылкам.
C#:
04.11.2019 11:49:29 : Задание 111111 : Шаблон 4 : Нет элемента капчи и нет изменения URL
04.11.2019 11:52:52 : Задание 111111 : Шаблон 38 : Нет элемента капчи и нет изменения URL
04.11.2019 12:09:43 : Задание 111111 : Шаблон 15 : Элемент пустой
04.11.2019 13:27:38 : Задание 111111 : Шаблон 2 : Нет элемента капчи и нет изменения URL
04.11.2019 14:24:46 : Задание 111111 : Шаблон 3 : Элемент пустой
04.11.2019 14:38:07 : Задание 111111 : Шаблон 28 : Нет элемента капчи и нет изменения URL
04.11.2019 14:58:30 : Задание 111111 : Шаблон 29 : Нет элемента капчи и нет изменения URL
04.11.2019 16:00:35 : Задание 111111 : Шаблон 3 : Координаты элемента неправильные
04.11.2019 16:06:56 : Задание 111111 : Шаблон 23 : Элемент пустой
04.11.2019 16:19:00 : Задание 111111 : Шаблон 4 : Нет элемента капчи и нет изменения URL
04.11.2019 16:40:35 : Задание 111111 : Шаблон 44 : Завершение шаблона по Bad End : Сообщение исключения: Некорректная капча : ID кубика: 46b22505-c177-4399-b950-1bebd4a226ed : Название кубика:
04.11.2019 16:40:44 : Задание 111111 : Шаблон 18 : Счетчик не найден
04.11.2019 16:56:38 : Задание 111111 : Шаблон 3 : Координаты элемента неправильные
04.11.2019 17:09:28 : Задание 111111 : Шаблон 4 : Нет элемента капчи и нет изменения URL
04.11.2019 17:12:12 : Задание 111111 : Шаблон 5 : Нет элемента капчи и нет изменения URL
а ночью были и нулевые вкладки .
 
  • Thank you
Reactions: juk88

juk88

Client
Joined
May 30, 2018
Messages
90
Reaction score
12
Points
8
как зачем ? а если сбой в браузере ? она к примеру нулевая , код к ней обращается и вот тут хорошо если это просто сбой, а если браузер завис ? в первом случае проект по BAD END выйдет, а во втором случае получаешь зависший поток.... и к куче сообщений на форуме прибавиться твое , а что делать с зависшим шаблоном :-)
Ясно. Спасибо. В текущем шаблоне, мне это не пригодится, но, буду знать.
 

luk911

Client
Joined
Jan 17, 2013
Messages
1,542
Reaction score
579
Points
113
Код не много не причесан, прошу понять и простить.
Подробная инструкция в коде - в комментариях.
Кратко: - вызываем из кубика 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: Убрал в коде пару лишних символов.
что то у меня не причесывается, а есть причесаный у кого нить ?Screen Shot 2019-12-06 at 22.16.02.png
 
Last edited:

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,725
Points
113
что то у меня не причесывается, а есть причесаный у кого нить ?
у меня иногда FullEmulationMouseClick не срабатывал по клику. элемент тупо не нажимался ни в проджект мейкере ни в постере. заменил на instance.Click и норм.
 
  • Thank you
Reactions: luk911

andrey-ka

Client
Joined
Jun 3, 2018
Messages
853
Reaction score
246
Points
43
что то у меня не причесывается, а есть причесаный у кого нить ?

C#:
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 FullEmulationMouseToCenterHtmlElement(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): 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");
  }
 

luk911

Client
Joined
Jan 17, 2013
Messages
1,542
Reaction score
579
Points
113
ваш код
у меня ругается классы ему не нравится, а подключать что нить надо типо библиотеку какаю ?
мой код
C#:
//ищем наш элдемент
var rnd = new Random();
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("a", "class", "moy", "regexp", rnd.Next(1, 10));
if (he.IsVoid) throw new Exception("Посты не найдены!");
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 FullEmulationMouseToCenterHtmlElement(Instance instance, ZennoLab.CommandCenter.HtmlElement he, bool deltaZero = false, bool click = false){
    Tab tab = instance.ActiveTab;
       int windheight =  int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
               Point xyhe = he.DisplacementInBrowser;
               Point curXY = tab.FullEmulationMouseCurrentPosition;
                 int elemWidth = he.BoundingClientWidth;
                 int elemHeight = he.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): 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");
  }
Screen Shot 2019-12-06 at 22.21.26.png
 

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,725
Points
113
вот эта строка
int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
может стать головной болью на некоторых сайтах под движком файрфокса. ее бы в try/catch по хорошему бы обернуть.
 
  • Thank you
Reactions: Valandersi

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,725
Points
113
у меня ругается классы ему не нравится, а подключать что нить надо типо библиотеку какаю ?
мой код
C#:
//ищем наш элдемент
var rnd = new Random();
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("a", "class", "moy", "regexp", rnd.Next(1, 10));
if (he.IsVoid) throw new Exception("Посты не найдены!");
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 FullEmulationMouseToCenterHtmlElement(Instance instance, ZennoLab.CommandCenter.HtmlElement he, bool deltaZero = false, bool click = false){
    Tab tab = instance.ActiveTab;
       int windheight =  int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
               Point xyhe = he.DisplacementInBrowser;
               Point curXY = tab.FullEmulationMouseCurrentPosition;
                 int elemWidth = he.BoundingClientWidth;
                 int elemHeight = he.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): 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");
  }
View attachment 45410
эту функцию надо в общий код пихать, а не в кубик c#
45411
 

luk911

Client
Joined
Jan 17, 2013
Messages
1,542
Reaction score
579
Points
113
эту функцию надо в общий код пихать, а не в кубик c#
поясни дураку куда куда ?
 

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,725
Points
113
поясни дураку куда куда ?
45412

сюда добавить общий код, и там добавить эти процедуры в класс commonCode
потом из кубика вызывать OwnCode.CommonCode.FullEmulationMouseToCenterHtmlElement(параметры);
 

luk911

Client
Joined
Jan 17, 2013
Messages
1,542
Reaction score
579
Points
113
сюда добавить общий код, и там добавить эти процедуры в класс commonCode
потом из кубика вызывать OwnCode.CommonCode.FullEmulationMouseToCenterHtmlElement(параметры);
фух разобрался спасибо.
 
Last edited:

luk911

Client
Joined
Jan 17, 2013
Messages
1,542
Reaction score
579
Points
113
вот эта строка
int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
может стать головной болью на некоторых сайтах под движком файрфокса. ее бы в try/catch по хорошему бы обернуть.
Коль уж ты упомянул об этом то как правильно это сделать ?
 

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,725
Points
113
Коль уж ты упомянул об этом то как правильно это сделать ?
C#:
int windheight = 800;
try {windheight=int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));} catch{}
по умолчанию выставит 800, попытается выполнить скрипт и если будет ошибка то 800 так и останется
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)