Найти координаты 4х точек элемента и сделать рандомный клик внутри этих координат

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113
Привет.
Задача такая, по xPath найти координаты 4х точек элемента и сделать рандомный клик внутри этих координат, делается для того чтоб каждый клик был максимально уникальным.
Спасибо

Юзаю этот сниппет, он ищет верхний левый угол и прибавляет немного пикселей
C#:
//создайте переменные X и Y
Tab tab = instance.ActiveTab;

Random rand = new Random();
var x2 = rand.Next(3, 7);
var y2 = rand.Next(3, 7);
HtmlElement he = tab.FindElementByXPath("(//button[@type='submit'])[1]",0);

//тут были нужные тебе данные о позиции элемента
project.SendInfoToLog("Y:"+Convert.ToString(he.DisplacementInTabWindow.Y), false);
project.SendInfoToLog("X:"+Convert.ToString(he.DisplacementInTabWindow.X), false);
project.Variables["X"].Value = Convert.ToString(he.DisplacementInTabWindow.X + x2);
project.Variables["Y"].Value = Convert.ToString(he.DisplacementInTabWindow.Y + y2);


instance.WaitFieldEmulationDelay();
// Эмулировать клик
instance.Click(Convert.ToInt32(project.Variables["X"].Value), Convert.ToInt32(project.Variables["X"].Value), Convert.ToInt32(project.Variables["Y"].Value), Convert.ToInt32(project.Variables["Y"].Value), "Left", "Normal");
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
Юзаю этот сниппет, он ищет верхний левый угол и прибавляет немного пикселей
В идеале брать ширину и высоту элемента и в рамках этих данных делать клик. Лучше еще минуснуть 10 пикселей, что бы явно в край не тыкал.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113
  • Спасибо
Реакции: Mikhail B.

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 308
Благодарностей
865
Баллы
113
Юзаю это, отступ в %
C#:
        public void RndMoveOnElement(HtmlElement obj, double procents = 0.35)
        {
            Random rnd = new Random();
            int hMin = Convert.ToInt32(obj.GetAttribute("topinbrowser"));
            int wMin = Convert.ToInt32(obj.GetAttribute("leftinbrowser"));
            int h = Convert.ToInt32(obj.GetAttribute("clientHeight"));
            int w = Convert.ToInt32(obj.GetAttribute("clientWidth"));
            int hMax = hMin + h;
            int wMax = wMin + w;

            hMin = hMin + Convert.ToInt32(procents * h);
            wMin = wMin + Convert.ToInt32(procents * w);
            hMax = hMax - Convert.ToInt32(procents * h);
            wMax = wMax - Convert.ToInt32(procents * w);

            int y = rnd.Next(hMin, hMax);
            int x = rnd.Next(wMin, wMax);
            instance.ActiveTab.FullEmulationMouseMove(x, y);
        }
Искренне надеюсь что нечто подобное будет уже из коробки в ЗП. Ибо нынешняя эмуляция подходит далеко не везде.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113

Koqpe

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

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113

Koqpe

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

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Куда путь xpath вписать?
Это в общий код
C#:
namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
     
      
         public void RndMoveOnElement(Instance Instance, HtmlElement obj, double procents = 0.35)
        {
            Instance instance = Instance;
            Random rnd = new Random();
            int hMin = Convert.ToInt32(obj.GetAttribute("topinbrowser"));
            int wMin = Convert.ToInt32(obj.GetAttribute("leftinbrowser"));
            int h = Convert.ToInt32(obj.GetAttribute("clientHeight"));
            int w = Convert.ToInt32(obj.GetAttribute("clientWidth"));
            int hMax = hMin + h;
            int wMax = wMin + w;

            hMin = hMin + Convert.ToInt32(procents * h);
            wMin = wMin + Convert.ToInt32(procents * w);
            hMax = hMax - Convert.ToInt32(procents * h);
            wMax = wMax - Convert.ToInt32(procents * w);

            int y = rnd.Next(hMin, hMax);
            int x = rnd.Next(wMin, wMax);
            instance.ActiveTab.FullEmulationMouseMove(x, y);
        }
    }
}
Это в сниппет
C#:
ZennoLab.OwnCode.CommonCode Test = new ZennoLab.OwnCode.CommonCode();
Tab tab = instance.ActiveTab;

var he = tab.FindElementByXPath("//p", 0);//Получаем нужный реьд элемент
Test.RndMoveOnElement(instance, he);//Выполняем клик
 
  • Спасибо
Реакции: specialist и backoff

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Возможно так будет удобнее
Этот метод делает и клик, а не просто подводит мышку к нужному элементу

Это в общий код
C#:
namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
       
       
         public static void RndMoveOnElement(Instance Instance, string xPath, double procents = 0.35)
        {
            Instance instance = Instance;
            Tab tab = instance.ActiveTab;
            var he = tab.FindElementByXPath(xPath, 0);//Получаем нужный html элемент
            Random rnd = new Random();
            int hMin = Convert.ToInt32(he.GetAttribute("topinbrowser"));
            int wMin = Convert.ToInt32(he.GetAttribute("leftinbrowser"));
            int h = Convert.ToInt32(he.GetAttribute("clientHeight"));
            int w = Convert.ToInt32(he.GetAttribute("clientWidth"));
            int hMax = hMin + h;
            int wMax = wMin + w;

            hMin = hMin + Convert.ToInt32(procents * h);
            wMin = wMin + Convert.ToInt32(procents * w);
            hMax = hMax - Convert.ToInt32(procents * h);
            wMax = wMax - Convert.ToInt32(procents * w);

            int y = rnd.Next(hMin, hMax);
            int x = rnd.Next(wMin, wMax);
            instance.ActiveTab.FullEmulationMouseMove(x, y);
            instance.ActiveTab.FullEmulationMouseClick("left", "click");
        }
    }
}

Это в сниппет

C#:
ZennoLab.OwnCode.CommonCode.RndMoveOnElement(instance, "//p", 0.35);//Выполняем клик
 
Последнее редактирование:

backoff

Client
Регистрация
20.04.2015
Сообщения
6 055
Благодарностей
6 483
Баллы
113
юзаем пример работы
 

Вложения

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