Как задать координаты клику по типу RiseEvent?

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 333
Благодарностей
5 431
Баллы
113
Можно как-то настроить что бы клик стремился влево? Или конкретно задать по пикселям точку клика (в рамках элемента конечно же).
Клик обычный зеновский, включена полная эмуляция мыши. Возможно есть другой метод? Рассмотрел бы и другой.

C#:
// Конструктор действий, тип RiseEvent
HtmlElement he = instance.ActiveTab.FindElementByAttribute("div", "class", "ляля", "regexp", 0);
if (he.IsVoid) return -1;

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

volody00

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

C#:
//переход на яндекс и поиск элемента
instance.ActiveTab.Navigate("https://ya.ru/");
instance.ActiveTab.WaitDownloading();

//поиск элемента и определение координат
var yandex = instance.ActiveTab.FindElementByXPath("//a[@aria-label='Яндекс']", 0);
int xMin = yandex.DisplacementInBrowser.X;
int yMin = yandex.DisplacementInBrowser.Y;
int xMax = xMin + yandex.BoundingClientWidth - 3;
int yMax = yMin + yandex.BoundingClientHeight - 3;

//случайная координата
Random r = new Random();
int x = r.Next(xMin, xMax);
int y = r.Next(yMin, yMax);

//двигаем мышку и кликаем
instance.ActiveTab.FullEmulationMouseMove(x, y);
instance.ActiveTab.FullEmulationMouseClick("left", "click");


/*
    другой способ без движения мыши:
    instance.Click(xMin, xMax, yMin, yMax, "Left", "Normal");
*/
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 333
Благодарностей
5 431
Баллы
113
@volody00

Имелось ввиду что он по дефолту либо в центр кликает либо в левый верхний угол. Хотелось бы корректировать эти моменты. В целом код должен решить задачу. Бдагодарю!
 

Yuriy Zymlex

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

Можно использовать как образец такой вариант, взяв код и подправив в указаном месте, возможно потребуется убрать лишнее.
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B. и Dmitriy Ka

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
550
Благодарностей
306
Баллы
63
  • Спасибо
Реакции: Mikhail B.

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
550
Благодарностей
306
Баллы
63
В примере используется FullEmulationMouseMove, в последних версиях уже давно в него встроен более серьёзный Emulator.MouseMove,
но ни что не мешает использовать его напрямую, правда стоит потестить его работу в Chromium'е, на всякий.
Очень интересная библиотечка, сижу разбираюсь, много интересного вижу для себе.

Возник вопрос, в библиотеке используется метод Instance.Launch(), но в нем написано, что с ним может работать только ZP и PM. Вопрос, если подключить библиотеку к шаблону, то получается инстанс можно будет запускать из библиотеке?
 

Yuriy Zymlex

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

Библиотеку я создавал много лет назад для проектов CodeCreator'а, что бы шаблон был чисто из кода со всеми его преимуществами.
Я её уже много лет не тестил, а в те времена был только FF(!) и все настройки только под него.

Даже сохранился тестовый, как образец:
112616
и вроде как был вариант запаковки c dll.
 
Последнее редактирование:
  • Спасибо
Реакции: Dmitriy Ka

volody00

Client
Регистрация
06.09.2016
Сообщения
798
Благодарностей
817
Баллы
93
в последних версиях уже давно в него встроен более серьёзный Emulator.MouseMove,
но ни что не мешает использовать его напрямую, правда стоит потестить его работу в Chromium'е
@Yuriy Zymlex , ты сам когда последний раз код писал в ZennoPoster? Предложенному тобой методу уже больше 10 лет и предназначен он для FireFox
112618
В cef и Chrome он работает неверно (координаты берутся от левого верхнего угла пк, а не браузера). К тому же, у меня этот метод использует реальную (т.е. физическую) мышку на ПК и как это дело тогда будет работать в многопотоке?
 
  • Спасибо
Реакции: Dmitriy Ka и Yuriy Zymlex

Yuriy Zymlex

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

Ахилес

Client
Регистрация
11.11.2020
Сообщения
924
Благодарностей
377
Баллы
63
Очень интересная библиотечка, сижу разбираюсь, много интересного вижу для себе.
да там все не по человечески сделано, без статики :ap:
ну вот зачем вам создавать кучу ненужных объектов в своих проектах ? ;-)
 
  • Спасибо
Реакции: Yuriy Zymlex

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
550
Благодарностей
306
Баллы
63
  • Спасибо
Реакции: Yuriy Zymlex

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 383
Благодарностей
3 306
Баллы
113
Очень интересная библиотечка, сижу разбираюсь, много интересного вижу для себе.
Проверяйте всё и вся. Библиотека создавалась в процессе изучения C# и для самого процесса.
Так же в какой-то мере для изучения JS, так как одной из целью была работа через него, где это возможно (более низкоуровнего способа в ZP - нет).

В процессе изучения F# была какое-то время мысль переписать на него, но хорошо, что не стал заниматься подобной дичью)
да и тогда бы пришлось обновлять библиотеку под CEF...
 
  • Спасибо
Реакции: Dmitriy Ka

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 333
Благодарностей
5 431
Баллы
113
не совсем понял что значит "клик стремился влево". но в остальном вроде бы тебе это надо

C#:
//переход на яндекс и поиск элемента
instance.ActiveTab.Navigate("https://ya.ru/");
instance.ActiveTab.WaitDownloading();

//поиск элемента и определение координат
var yandex = instance.ActiveTab.FindElementByXPath("//a[@aria-label='Яндекс']", 0);
int xMin = yandex.DisplacementInBrowser.X;
int yMin = yandex.DisplacementInBrowser.Y;
int xMax = xMin + yandex.BoundingClientWidth - 3;
int yMax = yMin + yandex.BoundingClientHeight - 3;

//случайная координата
Random r = new Random();
int x = r.Next(xMin, xMax);
int y = r.Next(yMin, yMax);

//двигаем мышку и кликаем
instance.ActiveTab.FullEmulationMouseMove(x, y);
instance.ActiveTab.FullEmulationMouseClick("left", "click");


/*
    другой способ без движения мыши:
    instance.Click(xMin, xMax, yMin, yMax, "Left", "Normal");
*/
Работает лучше стандартных методов, что впрочем уже перестало удивлять. Благодарю за код, ничего не менял и не настраивал. Сразу делает то что нужно, попадает в цель!
 
  • Спасибо
Реакции: volody00

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