Кликнуть по картинке

ErikMoor

Client
Регистрация
24.03.2016
Сообщения
121
Благодарностей
22
Баллы
18
Задача найти и кликнуть по картинке
Подскажите пожалуйста как можно подставить свою картинку и кликнуть по ней ?
Есть проблема с одним сайтом, при нажатии на "Поиск по картинке" он мигает и нормально фото PM сделать не может


93973
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
Если только использовать сторонние dll, для поиска по изображению.

Мигает обычно на движке Хромиума, на CEF тоже мигает ?
 
  • Спасибо
Реакции: ErikMoor

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 765
Благодарностей
2 407
Баллы
113
Задача найти и кликнуть по картинке
Подскажите пожалуйста как можно подставить свою картинку и кликнуть по ней ?
Есть проблема с одним сайтом, при нажатии на "Поиск по картинке" он мигает и нормально фото PM сделать не может


Посмотреть вложение 93973
Чтобы убрать мигание достаточно наверно увеличит размер окна браузера.
Происходить мигание может потому, что стили сайта пытаются переключаться между медиа запросами CSS.

Если этого не достаточно, чтобы решить проблему (ну, например на сайте просто анимация), тогда мы должны сделать скриншот нужного элемента самостоятельно. В идеальном случае необходимо сохранить в bmp, и убедиться что не были применены какие-то алгоритмы сжатия (намучался однажды с этим, так как jpg по умолчанию сжимается...).

Дальше уже этот скриншот нужно будет прочитать в base64, так как метод, который ищет прямоугольник принимает именно base64.
Дальше необходимо определиться с тем, где мы будем искать изображение, по которому собрались кликать.
Если это должно происходить в браузере - значит берем нужный элемент, например:
C#:
HtmlElement el = instance.ActiveTab.FindElementByAttribute("html", "fulltagname", "html", "text", 0);
Если мы должны создать прямоугольник, в котором собрались искать изображение.
Вот пример как искать например 250 пикселей от центра во все стороны, используя элемент который взял выше.
C#:
var rect = System.Drawing.Rectangle(el.Width/2-250, el.Height/2-250, el.Width/2+250, el.Height/2+250);
После этого, мы уже можем получить массив координат, где находится искомое изображение.

C#:
string search = instance.ActiveTab.FindImage(
    base64,  // base64 картинка
    new[] { rect }, // массив прямоугольников в которых будем производить поиск
    99 // % совпадения
);
Таким образом, с поиском нужной картинки мы разобрались.
Остается кликнуть по нужным координатам.
Значит, нужно разбить результат, создать новый прямоугольник:
C#:
int[] points = search.Split(',').Select(x=>int.Parse(x)).ToArray();
var rec2 = new System.Drawing.Rectangle(points[0], points[1], points[2],points[3]);
Прежде убеждаемся, что мы там нашли что-то дельное.
Ну, и после этого уже можно произвести клик, передав прямоугольник в метод RiseEvent.

C#:
if (rec2.IsEmpty) throw new Exception("Не нашли");
instance.ActiveTab.RiseEvent("click", rec2, "Left"); // производим клик
Как видим, задача не сложная, хотя и необходимо разбить её на мелкие шаги....
 

Phoenix78

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

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 765
Благодарностей
2 407
Баллы
113
это все замечательно.... вот только скорость поиска.... она ужасает o_O
Разницы между стандартным кубиком и решением которое я предложил нет совсем.
Это значит, что я помогал человеку решить те проблемы, которые были указаны в первом посте, а именно как кликнуть по своей картинке, так как стандартным способом не получается победить мигание.
Но, я однозначно не претендую что это самое быстрое и самое правильное решение - это решение только решает поставленную проблему пользователя, которая описана в первом сообщении.

В вопросе пользователя не было ничего о том, что ему важно, чтобы поиск происходил например на 5 секунд, а 1.
Если бы такой вопрос был, как переписать стандартный кубик, чтобы ускорить поиск изображения - я бы просто прошел мимо, потому что сторонними dll для данных задач не пользовался.
Но, если вдруг у Вас есть альтернативное решение, которое будет выполнять то же самое, и делать это в 10 раз быстрее - поделитесь пожалуйста, думаю многим людям пригодится.

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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
да не будут они ничего актуализировать... так как по их рекомендациям поиск по картинкам не следует использовать в ботах. чисто в крайнем случае. поэтому увы и ах.

из альтернативы можно заюзать openCV, но в этом способе надо поднять планку скила в программировании чуть чуть выше :bk:
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 765
Благодарностей
2 407
Баллы
113
да не будут они ничего актуализировать... так как по их рекомендациям поиск по картинкам не следует использовать в ботах. чисто в крайнем случае. поэтому увы и ах.

из альтернативы можно заюзать openCV, но в этом способе надо поднять планку скила в программировании чуть чуть выше :bk:
Если например игра на юнити, есть необходимость её автоматизировать, то другими средствами без клика по картинкам варианта получить доступ к элементам может быть не предоставлен. Так что было бы хорошо, чтобы все же сделали перезагрузку метода поиска изображения в браузере даже через тот же openCV с коробки, чтобы пользователям не приходилось изучать такие тонкости. Пользователь не должен знать как это работает - он должен просто получить функционал, в который подал что-то на вход, получил нужное действие на выходе.... Но, как Вы и говорите - Зеннолаб делает упор на другой функционал...
 
  • Спасибо
Реакции: Sho и Alex.A

afk

Client
Регистрация
28.11.2016
Сообщения
98
Благодарностей
25
Баллы
18
Чтобы убрать мигание достаточно наверно увеличит размер окна браузера.
Происходить мигание может потому, что стили сайта пытаются переключаться между медиа запросами CSS.

Если этого не достаточно, чтобы решить проблему (ну, например на сайте просто анимация), тогда мы должны сделать скриншот нужного элемента самостоятельно. В идеальном случае необходимо сохранить в bmp, и убедиться что не были применены какие-то алгоритмы сжатия (намучался однажды с этим, так как jpg по умолчанию сжимается...).

Дальше уже этот скриншот нужно будет прочитать в base64, так как метод, который ищет прямоугольник принимает именно base64.
Дальше необходимо определиться с тем, где мы будем искать изображение, по которому собрались кликать.
Если это должно происходить в браузере - значит берем нужный элемент, например:
C#:
HtmlElement el = instance.ActiveTab.FindElementByAttribute("html", "fulltagname", "html", "text", 0);
Если мы должны создать прямоугольник, в котором собрались искать изображение.
Вот пример как искать например 250 пикселей от центра во все стороны, используя элемент который взял выше.
C#:
var rect = System.Drawing.Rectangle(el.Width/2-250, el.Height/2-250, el.Width/2+250, el.Height/2+250);
После этого, мы уже можем получить массив координат, где находится искомое изображение.

C#:
string search = instance.ActiveTab.FindImage(
    base64,  // base64 картинка
    new[] { rect }, // массив прямоугольников в которых будем производить поиск
    99 // % совпадения
);
Таким образом, с поиском нужной картинки мы разобрались.
Остается кликнуть по нужным координатам.
Значит, нужно разбить результат, создать новый прямоугольник:
C#:
int[] points = search.Split(',').Select(x=>int.Parse(x)).ToArray();
var rec2 = new System.Drawing.Rectangle(points[0], points[1], points[2],points[3]);
Прежде убеждаемся, что мы там нашли что-то дельное.
Ну, и после этого уже можно произвести клик, передав прямоугольник в метод RiseEvent.

C#:
if (rec2.IsEmpty) throw new Exception("Не нашли");
instance.ActiveTab.RiseEvent("click", rec2, "Left"); // производим клик
Как видим, задача не сложная, хотя и необходимо разбить её на мелкие шаги....
Пытаюсь использовать ваше решение - но выдаёт ошибку что Rectangle не может использоваться как метод
Прикрепляю скрины
В чём может быть причина?


UPD: решил эту проблему инициализированием структуры Rectangle конструктором по умолчанию, а нужные параметры прописал в соотв. свойствах

C#:
HtmlElement el = instance.ActiveTab.FindElementByAttribute("html", "fulltagname", "html", "text", 0);
var rect = System.Drawing.Rectangle.Empty;
rect.X = 0;
rect.Y = 0;
rect.Width = 250;
rect.Height = 250;
 

Вложения

Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 765
Благодарностей
2 407
Баллы
113
C#:
HtmlElement el = instance.ActiveTab.FindElementByAttribute("html", "fulltagname", "html", "text", 0);
var rect = System.Drawing.Rectangle.Empty;
rect.X = 0;
rect.Y = 0;
rect.Width = 250;
rect.Height = 250;
C#:
var rec2 = new System.Drawing.Rectangle(points[0], points[1], points[2],points[3]);
У Вас в коде на скриншоте нет слова new - это и выдавало ошибку.
Возможно я допустил опечатку, когда набирал код здесь.
 
  • Спасибо
Реакции: afk

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