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

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Текстовые значения могут быть на разных языках. Значение class ZFr60d CeoRYc
Какое количество языков используется? Если всего 2 то можно сделать сравнение двух вариантов. Значение класса, которое сейчас срабатывает, выглядит не постоянным и может перестать работать. Вам нужно зацепиться за что-то более стабильное. Если вы хотите нажать кнопку "Далее" на первом экране, то там есть div с id. Вот попробуйте для примера такой путь //div[@id='identifierNext']/descendant::span
 

Peplos

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

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
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
Регистрация
29.06.2019
Сообщения
107
Благодарностей
66
Баллы
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
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
tab1.FullEmulationMouseMoveAboveHtmlElement(tab1.FindElementByXPath(String.Format("//h3[@class='LC20lb']", targetDomain))); Thread.Sleep(rnd.Next(120, 320)); проблема в том, что у гугла при каждом обновлении будет изменятся xPath, когда ты писал код было //h3[@class='LC20lb обновляешь страницу и он меняется, изза этого у тебя ошибки.
Интересно) а если предварительно парсить это значение и подставлять переменной в код?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Интересно) а если предварительно парсить это значение и подставлять переменной в код?
есди ты знаешь как парсить - на основе этих знаний стоит составить правильный xpath, а не придумывать ненужных посредников
 

artsmm

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

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
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
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
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
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
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
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
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
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Вроде сделал. Нашол ответ здесь на форуме. Может кому пригодится:
Это неправильный код. Проверка наличия элемента на странице, должна быть раньше, чем движение мышки к нему. И зачем 2 раза кликать?
 
  • Спасибо
Реакции: juk88

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
8
Это неправильный код. Проверка наличия элемента на странице, должна быть раньше, чем движение мышки к нему. И зачем 2 раза кликать?
Я сделал методом тыка. Еслиб знал как правильно, не спрашивал бы здесь. Работает-же.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
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");//ЛКМ по ссылке
 
  • Спасибо
Реакции: Roman48, Rooter85 и juk88

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
8
Это неправильный код. Проверка наличия элемента на странице, должна быть раньше, чем движение мышки к нему. И зачем 2 раза кликать?
Поправил, спасибо за подсказку!
 
  • Спасибо
Реакции: Rooter85

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
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
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
Не совсем понял только, зачем вкладку проверять?
как зачем ? а если сбой в браузере ? она к примеру нулевая , код к ней обращается и вот тут хорошо если это просто сбой, а если браузер завис ? в первом случае проект по BAD END выйдет, а во втором случае получаешь зависший поток.... и к куче сообщений на форуме прибавиться твое , а что делать с зависшим шаблоном :-)
 
  • Спасибо
Реакции: Valandersi и juk88

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
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
а ночью были и нулевые вкладки .
 
  • Спасибо
Реакции: juk88

juk88

Client
Регистрация
30.05.2018
Сообщения
90
Благодарностей
12
Баллы
8
как зачем ? а если сбой в браузере ? она к примеру нулевая , код к ней обращается и вот тут хорошо если это просто сбой, а если браузер завис ? в первом случае проект по BAD END выйдет, а во втором случае получаешь зависший поток.... и к куче сообщений на форуме прибавиться твое , а что делать с зависшим шаблоном :-)
Ясно. Спасибо. В текущем шаблоне, мне это не пригодится, но, буду знать.
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
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
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
что то у меня не причесывается, а есть причесаный у кого нить ?
у меня иногда FullEmulationMouseClick не срабатывал по клику. элемент тупо не нажимался ни в проджект мейкере ни в постере. заменил на instance.Click и норм.
 
  • Спасибо
Реакции: luk911

andrey-ka

Client
Регистрация
03.06.2018
Сообщения
855
Благодарностей
246
Баллы
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");
  }
 
  • Спасибо
Реакции: Valandersi и luk911

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
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
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
вот эта строка
int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
может стать головной болью на некоторых сайтах под движком файрфокса. ее бы в try/catch по хорошему бы обернуть.
 
  • Спасибо
Реакции: Valandersi

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
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");
  }
Посмотреть вложение 45410
эту функцию надо в общий код пихать, а не в кубик c#
45411
 
  • Спасибо
Реакции: Valandersi и luk911

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
поясни дураку куда куда ?
45412

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

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
сюда добавить общий код, и там добавить эти процедуры в класс commonCode
потом из кубика вызывать OwnCode.CommonCode.FullEmulationMouseToCenterHtmlElement(параметры);
фух разобрался спасибо.
 
Последнее редактирование:

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
вот эта строка
int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
может стать головной болью на некоторых сайтах под движком файрфокса. ее бы в try/catch по хорошему бы обернуть.
Коль уж ты упомянул об этом то как правильно это сделать ?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
Коль уж ты упомянул об этом то как правильно это сделать ?
C#:
int windheight = 800;
try {windheight=int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));} catch{}
по умолчанию выставит 800, попытается выполнить скрипт и если будет ошибка то 800 так и останется
 

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