Это у меня так потомок от общего кода называется, там где не заметил, можно убрать CC - будет работать.Интересно что такое CC.rnd, а именно СС ?
Это у меня так потомок от общего кода называется, там где не заметил, можно убрать CC - будет работать.Интересно что такое CC.rnd, а именно СС ?
Спасибо. Вот описание метода. Прибавлять куда?Прибавляй к координатам по половине ширины/высоты элемента.
СпасибоКод не много не причесан, прошу понять и простить.
Подробная инструкция в коде - в комментариях.
Кратко: - вызываем из кубика 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"); }
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));
Наверное никак, это баг. Репортить в баги, мб пофиксят...Клик происходит как бы под списком.
Это баг зенки, такое же поведение на всех сайтах где список реализован Select->option.Кто подскажет как кликать по option - нам в select с помощью мышки.
Помогите плз.
Кто подскажет как кликать по option - нам в select с помощью мышки.
Наверное никак, это баг. Репортить в баги, мб пофиксят...
Зарепортил баг.Это баг зенки
Вроде все понятно, но почему-то отказывается работать, выдает ошибку "CSharp OwnCode Входная строка имела неверный формат.". Вызываю вот так:Код не много не причесан, прошу понять и простить.
Подробная инструкция в коде - в комментариях.
Кратко: - вызываем из кубика FullEmulMoveToCenterOfElm - прописываем, все что подсказывает компилятор и радуемся жизни. )
UPD: Убрал в коде пару лишних символов.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"); }
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("-1").FindElementByAttribute("a", "href", "news", "regexp", 19);
CenterClick.FullEmulMoveToCenterOfElm(instance, he, false, false);
Попробуй в отладчике прогнать.Что я не так делаю?
int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));
int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;", true));
Ошибка вылезает при выполнении строки "int windheight = int.Parse(tab.MainDocument.EvaluateScript("return window.innerWidth;"));".Попробуй в отладчике прогнать.
Скорей всего не срабатывает определение ширины окна в собственном коде.
Попробуй, так сделать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.
instance.SetBrowserPreference("security.csp.enable", false);
Спасибо, заработало ЗаценимВот и ответ.
Способ устранения:
В шаблоне перед всеми загрузками страниц, нужно выполнить кубик
C#:instance.SetBrowserPreference("security.csp.enable", false);
Решение легко ищется на форуме - такая же пилюля
Можно попробовать активировать меню-список и выполнять код:А кто нибудь подскажет, как скролить не саму страницу, а выпадающий список?
instance.WaitFieldEmulationDelay();
instance.SendText("{DOWN}", 15);
Вроде решил вопрос, мышку в поле списка завести, и срабатывает.. А не подскажете, чистить куки и кеш надо кубиками?, в настройках проекта и настройках записи проекта галки стоятМожно попробовать активировать меню-список и выполнять код:
Код:instance.WaitFieldEmulationDelay(); instance.SendText("{DOWN}", 15);
Кеш не обязательно, раз стоит галка в настройках шаблона.Вроде решил вопрос, мышку в поле списка завести, и срабатывает.. А не подскажете, чистить куки и кеш надо кубиками?, в настройках проекта и настройках записи проекта галки стоят
Что то про куки ен совсем понял, если галка стоит, то будкт очищаться автоматом, если нет, то только после кубика, если он есть в проекте, так?.. кубик при создании шаблона не создается автоматом ни с галкой, ни без галкиКеш не обязательно, раз стоит галка в настройках шаблона.
Насчет кубика очистки куков, если галку в Настройках ПМ снимете, то кубик не будет создаваться при создании шаблона.
Посмотреть вложение 37185
С галкой в настройках кубик очистки куков должен создаваться при создании нового проекта, если создавать его c активной Записью:Что то про куки ен совсем понял, если галка стоит, то будкт очищаться автоматом, если нет, то только после кубика, если он есть в проекте, так?.. кубик при создании шаблона не создается автоматом ни с галкой, ни без галки
Понял, спасибоС галкой в настройках кубик очистки куков должен создаваться при создании нового проекта, если создавать его c активной Записью:
Посмотреть вложение 37191
Если кубика очистки куков на полотне проекта нет, то очистки куков не будет.
Если у кого-то возникнут такие же проблемы, то решение оказалось простым, нужно увеличить размер окна инстанса, что бы все элементы были в видимой области. instance.SetWindowSize(1920, 1680); // можно вставить свое значение вместо 1920, 1680Подскажите как решить проблему с эмуляцией мыши. Проблема в том, что если выполнять шаблон в ЗП и не включить отображение инстанса, то эмуляция кликов по нужным элементам не происходит (если включить отображение инстанса то все ок). Тоже самое и в ПМ, если клик по элементу происходит за пределами видимой области (прокрутка лево право в браузере ПМ), то клик по элементу не происходит.
Какой поисковик?Приветствую. Оч интересная тема. Как сделать 1) поиск нужного урла в поисковой выдаче? 2) затем клик по нему? Не соображу как переменные куда подставить.. Может подскажете строчку кода?
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");//ЛКМ по ссылке
Поисковик яндекс, но думаю принцип тот же, что вы указали) СпасибоКакой поисковик?
Для 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");//ЛКМ по ссылке
Главное правильно найти элемент по атрибуту. А там подставляете три строчки последние.Поисковик яндекс, но думаю принцип тот же, что вы указали) Спасибо
Поисковик яндекс, но думаю принцип тот же, что вы указали) Спасибо
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");//нажимает левой кнопкой мыши на элемент
Благодарю. Вместе урла, где википедия стоит, можно свою переменную подставить, чтобы урл брался из файла?На случай, если нужен рандомный клик.Код: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". Так можно подставить?