rediffusion
11/8/2017 - 8:54 PM

MouseMove()

//Ссылка на онлайн-документацию по объектной модели для всех версий ZennoPoster: //http://zennolab.com/wiki/en:zennoposter:macros-documentation

//Ссылка на онлайн-документацию по объектной модели версии 5.11.0.0: //https://help.zennolab.com/en/v5/zennoposter/5.11.0.0/

//public void MouseMove
//Предназначение метода: Выполнение события перемещения указателя мыши от точки к точке в определённых координатах в текущей вкладке.

//Параметры:
//Перегрузка метода №1:
//    int fromX - Координата X стартовой точки внутри области вкладки для выполнения события mouse move.
//	int fromY - Координата Y стартовой точки внутри области вкладки для выполнения события mouse move.
//	int toX - Координата X конечной точки внутри области вкладки для выполнения события mouse move.
//	int toY - Координата Y конечной точки внутри области вкладки для выполнения события mouse move.
//	bool useClick - true если необходимо выполнить клик левой кнопкой мыши (left mouse click) в конечной точке: иначе false. Значение по умолчанию - это false.
//	bool considerScroll - true если необходимо учитывать текущую позицию прокрутки браузера; иначе false. Значение по умолчанию это false.
//Перегрузка метода №2:
//	int toX - Координата X конечной точки внутри области вкладки для выполнения события mouse move.
//	int toY - Координата Y конечной точки внутри области вкладки для выполнения события mouse move.
//	bool useClick - true если необходимо выполнить клик левой кнопкой мыши (left mouse click) в конечной точке: иначе false. Значение по умолчанию - это false.
//	bool considerScroll - true если необходимо учитывать текущую позицию прокрутки браузера; иначе false. Значение по умолчанию это false.
//Перегрузка метода №3:
//	Point[] points - массив точек, по которым должно идти последовательное перемещение указателя
//	int[] delay - массив задержек (пауз) между перемещениями
//	bool useClick - true если нужно выполнить клик в конечной точке перемещения, иначе и по умолчанию false.
//	bool considerScroll - true если необходимо учитывать текущую позицию прокрутки браузера; иначе false. Значение по умолчанию это false.

//Демонстрация:

Tab Tab1 = instance.ActiveTab;
HtmlElement elSearchQuery;
HtmlElement elSearchButton;

Tab1.Navigate("https://ya.ru");
Tab1.WaitDownloading();

elSearchQuery = Tab1.FindElementByXPath("//div[starts-with(@class, 'search2')]/descendant::input", 0);
elSearchButton = Tab1.FindElementByXPath("//button[contains(@class, 'button_theme_websearch')]/span", 0);

Tab1.MouseMove(elSearchQuery.DisplacementInTabWindow.X+15, elSearchQuery.DisplacementInTabWindow.Y+15, true, false);
instance.SendText("Проверка", 125);

//первая перегрузка метода MouseMove
Tab1.MouseMove(elSearchQuery.DisplacementInTabWindow.X+45, elSearchQuery.DisplacementInTabWindow.Y+10, 
	elSearchButton.DisplacementInTabWindow.X+15, elSearchButton.DisplacementInTabWindow.Y+15, true, false);

Thread.Sleep(3000);

Tab1.Navigate("https://ya.ru");
Tab1.WaitDownloading();

elSearchQuery = Tab1.FindElementByXPath("//div[starts-with(@class, 'search2')]/descendant::input", 0);
elSearchButton = Tab1.FindElementByXPath("//button[contains(@class, 'button_theme_websearch')]/span", 0);

Tab1.MouseMove(elSearchQuery.DisplacementInTabWindow.X+15, elSearchQuery.DisplacementInTabWindow.Y+15, true, false);
instance.SendText("Проверка", 125);

//настройки для формирования массива точек
int intQXSteps = 100; //количество точек для движения мыши
int intYLatency = 5; //случайный сдвиг "плюс-минус" от прямой линии перемещения указателя мыши
int intPauseBase = 5;
int intPauseLatency = 3;

//формируем массив точек для движения указателя
Random rndGenerator = new Random();
Point ptFrom = new Point(elSearchQuery.DisplacementInTabWindow.X-10, elSearchQuery.DisplacementInTabWindow.Y+10);
Point ptTo = new Point(elSearchButton.DisplacementInTabWindow.X+10, elSearchButton.DisplacementInTabWindow.Y+5);
int intDeltaX = ptTo.X - ptFrom.X;
int intDeltaY = ptTo.Y - ptFrom.Y;

double dbXPerStep =intDeltaX/intQXSteps;
double dbYPerStep = intDeltaY/intDeltaX;

List<Point> lstPoints = new List<Point>();
List<int> lstDelays = new List<int>();

lstPoints.Add(ptFrom);
lstDelays.Add(intPauseBase);

for (int i=0; i<intQXSteps-1; i++){
	int intNextX = ptFrom.X + (i * (int)Math.Round(dbXPerStep));
	int intNexyYOnLine = ptFrom.Y + (i * (int)Math.Round(dbYPerStep));
	int intNextY = rndGenerator.Next(intNexyYOnLine-intYLatency, intNexyYOnLine+intYLatency);
	lstPoints.Add(new Point(intNextX, intNextY));
	lstDelays.Add(rndGenerator.Next(intPauseBase-intPauseLatency, intPauseBase+intPauseLatency));
}

lstPoints.Add(ptTo);
lstDelays.Add(intPauseBase);

//третья перегрузка метода MouseMove
Tab1.MouseMove(lstPoints.ToArray(), lstDelays.ToArray(), true, false);

//Примечания:
//