Перестраховаться во время клика мышки C#

xuroo

Client
Регистрация
07.10.2016
Сообщения
161
Благодарностей
41
Баллы
28
Ребят привет! Хочу гарантировать попадание мышки в нужное поле прямо в кубике С#
Мышку эмулирую так:



эмуляция клика мышкой:
.ToInt32(project.Variables["topinbrowser"].Value);
int leftinbrowser = Convert.ToInt32(project.Variables["leftinbrowser"].Value);
Random rnd = new Random();
int[] delay = new int[10] {
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150),
    rnd.Next(50, 150)
};
instance.ActiveTab.FullEmulationMouseMove(leftinbrowser + rnd.Next(13, 45), topinbrowser + rnd.Next(23, 36));
instance.ActiveTab.FullEmulationMouseMove(leftinbrowser + rnd.Next(13, 45), topinbrowser + rnd.Next(23, 76));
instance.ActiveTab.FullEmulationMouseMove(leftinbrowser + rnd.Next(3, 15), topinbrowser + rnd.Next(3, 26));
instance.ActiveTab.FullEmulationMouseMove(leftinbrowser + rnd.Next(3, 15), topinbrowser + rnd.Next(3, 6));
instance.ActiveTab.FullEmulationMouseClick("left", "click");
И хотел бы туда добавить клик зенковского стандартного кубика чтобы с гарантией попасть в нужное место.

стандартный клик зенки:
// Конструктор действий, тип RiseEvent
HtmlElement he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("span", "class", "sendcode-verify-right", "regexp", 0);
if (he.IsVoid) return -1;

// Задержка эмуляции
instance.WaitFieldEmulationDelay();
// Вызвать событие "click"
he.RiseEvent("click", instance.EmulationLevel);

Вопрос как добавить

he.RiseEvent("click", instance.EmulationLevel);

этот клик который будет основан на координатах объекта
project.Variables["topinbrowser"].Value и project.Variables["leftinbrowser"].Value ?

Спасибо что прочитали.
 
Последнее редактирование:

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 383
Благодарностей
3 306
Баллы
113

volody00

Client
Регистрация
06.09.2016
Сообщения
798
Благодарностей
817
Баллы
93
Получайте элемент на который указывает курсор и сравнивайте его в целевым.

Так же учитывайте, что курсор может указывать на дочерний внутренний элемент и т.д.
Хорошо бы сниппет от тебя. Я пробовал - ничего не вышло. Там довольно серьёзно заморочиться надо, чтобы работало
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 694
Баллы
113
  • Спасибо
Реакции: usboff

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 383
Благодарностей
3 306
Баллы
113
Да, к сожалению надо доделывать под задачу, так как
курсор может указывать на дочерний внутренний элемент и т.д.
 

p-sergei

Client
Регистрация
20.12.2016
Сообщения
525
Благодарностей
256
Баллы
63
Xорошо бы сниппет от тебя. Я пробовал - ничего не вышло. Там довольно серьёзно заморочиться надо, чтобы работало
C#:
 public static bool ElementIsBlocked(Instance instance, HtmlElement he)
        {
            string url = he.GetAttribute("href");

            int he_x = int.Parse(he.GetAttribute("leftInTab"));
            int he_y = int.Parse(he.GetAttribute("topInTab"));
            int width = he.Width;
            int height = he.Height;


            double tg = (double)height / (double)width;

            for (int i = 0; i < 5; i++)
            {

                int y = height / (10 - i);

                int x;

                try
                {
                    x = Convert.ToInt32(y / tg);

                }
                catch
                {
                    return false;
                }

                HtmlElement heNew = instance.ActiveTab.GetElementFromPoint(he_x + x, he_y + y);

                string urlNew = heNew.GetAttribute("href");

                if (url == urlNew || he.OuterHtml.Contains(heNew.OuterHtml) || heNew.OuterHtml.Contains(he.OuterHtml))
                    return true;
        
            }

            return false;
        }
Я как-то так делаю, долблю элемент по диагонали и ищу совпадения, как сказали выше задача специфичная надо под себя дорабатывать.
 
  • Спасибо
Реакции: volody00

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 383
Благодарностей
3 306
Баллы
113
Для подсказки, текст родительского элемента содержит в себе текст дочерних. Можно подниматься по родителям и сверять текст с целевым.
А то захочется кликнуть по кнопке, а попадёт на текст.
 

usboff

Client
Регистрация
25.08.2021
Сообщения
47
Благодарностей
22
Баллы
8
Прикладываю мой довольно универсальный метод проверки перекрытия элементов. Огромное спасибо
Phoenix78 за наводку!


C#:
var xpath = "//div[contains(@class, 'lol')]";

HtmlElement he = instance.ActiveTab.FindElementByXPath(xpath, 0);

string he_html = he.OuterHtml;

int he_x = int.Parse(he.GetAttribute("clientWidth"));
int he_y = int.Parse(he.GetAttribute("clientHeight"));

int he_left_x = int.Parse(he.GetAttribute("leftInTab"));
int he_top_y = int.Parse(he.GetAttribute("topInTab"));

int rand_x = rand.Next(1, he_x) + he_left_x;
int rand_y = rand.Next(1, he_y) + he_top_y;

var test = instance.ActiveTab.GetElementFromPoint(rand_x, rand_y);

string test_html = test.OuterHtml;

if (he_html == test_html)
{
    project.SendInfoToLog("совпали", true);

}
else
{
    project.SendInfoToLog("НЕ совпали", true);

}
 
Последнее редактирование:
  • Спасибо
Реакции: doc и xuroo

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