Функция прокручивания скрола и клика по номеру элемента

Тестирование сайтов эмуляцией посещений пользователей
Ответить
Аватара пользователя
spaiker
Сообщения: 33
Зарегистрирован: 14 сен 2017, 02:01

Функция прокручивания скрола и клика по номеру элемента

Сообщение spaiker » 26 сен 2017, 00:44

Может кому то пригодится.

scroll_move_click_element($number, true);


Находим нужный элемент и при необходимости скролируем на него и после чего выполняем:


// кликаем по координатам
	$element->set_focus_by_number($number);
	$element->send_event_by_number($number,"onmouseover");
	$element->send_event_by_number($number, "onclick");
	$mouse->click($x1, $y1, false);
	$element->click_by_number($number);

Правда код работает не так как хотелось бы :) Так что можно растащить на запчасти, ну или если будет у кого желание - отладить. Если будут какие то вопросы по коду отвечу.

Скрипт со всем кодом выглядит так:

<?php

$xhe_host = "127.0.0.1:7012";

// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");

$number = $anchor->get_number_by_inner_text("Карта сайта");

scroll_move_click_element($number, true);

// скролинг
function scroll_move_click_element($number,$full_emul = false)
{
	global $browser, $keyboard, $mouse, $frame, $anchor, $element;

	echo("Будем кликать элемент под номером: $number");
	
	// определяемся с координатами элемента по которому будем кликать
	$x = 0; $y = 0;
	// получаем координаты левого верхнего угла ссылки
	$x = $element->get_x_by_number($number);
	$y = $element->get_y_by_number($number);
	
	echo( "Координаты левого вехнего угла элемента для клика: x=$x   y=$y");
	// не получили координат 
	if ($x <= 0 and $y <= 0)
	{
		echo("Не получили координат искомой ссылки - кликаем просто.<br>");
		$element->set_focus_by_number($number);
		$element->send_event_by_number($number,"onmouseover");
		$element->click_by_number($number);
		$element->send_event_by_number($number, "onclick");
		$element->click_by_number(0, $number);
		return false;
	}
	// получаем ширину элемента
	$element_width = 0;
	$element_width = $element->get_width_by_number($number);
	if ($element_width <= 0)
	{
		echo( "Не получили ширину элемента");
		$element_width = 2;
	}
	//$element_width = 270; // это для баннера
	echo( "ширина элемента для клика: $element_width");
	
	// получаем высоту элемента
	$element_height = 0;
	$element_height = $element->get_height_by_number($number);
	if ($element_height <= 0)
	{
		echo( "Не получили высоту элемента");
		$element_height = 2;
	}
	//$element_height = 20; // только для баннера
	echo( "Высота элемента: $element_height");
	
	// получаем случайную координату внутри ссылки для клика
	$x1 = 0; $y1 = 0;
	$x1 = $x + 17 + rand(1, $element_width);
	$y1 = $y + 4 + rand(1, $element_height);
	echo( "Координаты для клика внутри элемента: x = $x1 y = $y1");
	
	// определяем позицию вертикального скрола
	echo( "Позиция вертикального скрола: ");
        $vertical_scroll = $browser->get_vertical_scroll_pos();
        echo($vertical_scroll);

	// определяем позицию горизонтального скрола
	echo( "Позиция горизонтального скрола: ");
	$horizontal_scroll = $browser->get_horizontal_scroll_pos();
        echo($horizontal_scroll);
	
	// определяем высоту окна браузера
	echo( "высота окна браузера: ");
        $height_browser = $browser->get_window_height();
        echo($height_browser);
	
	// определяем ширину окна браузера
	echo( "ширина окна браузера: ");
        $width_browser = $browser->get_window_width();
        echo( $width_browser);
	// двигаем мышь вниз на позицию для клика на нужной ссылке
	while (true)
	{
		// определяемся куда ехать вверх, вниз или уже приехали
		// приехали
		if (($y1 < ($vertical_scroll + $height_browser - 30)) and ($y1 > $vertical_scroll + 30))
		{
			echo( "Нужный нам элемент в пределах окна браузера по высоте");
			// определяем соответствие по х
			while (true)
			{
				if (($x1 < ($horizontal_scroll + $width_browser)) and ($x1 >= $horizontal_scroll))
				{
					echo( "Нужный нам элемент в пределах окна браузера и по ширине");
					sleep(2);
					break 2;
				}
				elseif ($x1 >= ($horizontal_scroll + $width_browser))
				{
					echo( "едем вправо<br>");
					$keyboard->send_key("39", true);
					sleep(1);
				}
				elseif ($x1 < $horizontal_scroll)
				{
					echo( "едем влево<br>");
					$keyboard->send_key("37", true);
					sleep(1);
				}
				else
				{
					echo( "<b>Чепуха!! Мы не должны здесь быть!!! Обратитесь к разработчику.</b><br>");
					return false;
				}
				// определяем текущую позицию горизонтального скрола
				echo( "<br>Текущая позиция горизонтального скрола: ");
				$horizontal_scroll = $browser->get_horizontal_scroll_pos();
				echo( $horizontal_scroll);
			}
		}
		// ехать вниз
		elseif ($y1 >= ($vertical_scroll + $height_browser - 30))
		{
			echo( "едем вниз<br>");
			scroll_down_page_slow1(true);
		}
		// ехать наверх
		elseif ($y1 <= $vertical_scroll + 30)
		{
			echo( "едем наверх<br>");
			scroll_up_page_slow1(true);
		}
		else
		{
			echo( "<b>Чепуха!!124 Мы не должны здесь быть!!! Обратитесь к разработчику.</b><br>");
			return false;
		}
		echo( "<br>Текущая позиция вертикального скрола: ");
		$vertical_scroll = $browser->get_vertical_scroll_pos();
                echo( $vertical_scroll);	
}

	// определяемся с координатами ссылки для клика
	$y1 = $y1 - $vertical_scroll;
	$x1 = $x1 - $horizontal_scroll;
	
	        // прокручиваем страницу
        if ($full_emul)
	{
		// двигаем мышку к нужным координатам
	$mouse->move($x1, $y1, false, rand(1, 2), rand(3, 7));
	usleep(rand(600000, 900000));
	}
	else
	{
        // двигаем мышку к нужным координатам
	$mouse->send_move($x1, $y1, false, rand(1, 2), rand(3, 7));
	usleep(rand(600000, 900000));	
        }
	
	// кликаем по координатам
	$element->set_focus_by_number($number);
	$element->send_event_by_number($number,"onmouseover");
	$element->send_event_by_number($number, "onclick");
	$mouse->click($x1, $y1, false);
	$element->click_by_number($number);
		
	return true;
}

// медленный скролинг вниз по странице (для клика по ссылке)
function scroll_down_page_slow1($full_emul = false)
{
	global $mouse, $browser;
 
	// получаем текущие координаты мышки
        $x = $mouse->get_x(true);
        $y = $mouse->get_y(true);

	echo("получаем текущие координаты мышки : $x и $y");
	
	// мышь за пределами браузера
	if (($x <= 0) or ($y >= $browser->get_window_height()))
	{
		echo( "мышка находится за пределами браузера<br>");
		echo( "ставим мышку в случайную точку браузера<br>");
                if($full_emul)
      		    $mouse->move(rand(10, $browser->get_window_width()-20), rand(10, $browser->get_window_height()-20), false, 1, 5);
                else
                    $mouse->send_move(rand(10, $browser->get_window_width()-20), rand(10, $browser->get_window_height()-20), false, 1, 5);


		sleep(1);
		// снова получаем текущие координаты мышки
		$x = $mouse->get_x(true);
		$y = $mouse->get_y(true);
                echo("получаем текущие координаты мышки : $x и $y");
	}
	
	// получаем длинну страницы (для ввода коэфициента скрола когда страница длинная)
	$y_page_height = ""; 
	$y_page_height = $browser->get_page_height();
	if (($y_page_height - $y) > 5000)
	{
		$k = 2;
	}
	else
	{
		$k = 1;
	}
	// прокручиваем страницу
        if ($full_emul)
	{
		// прокручиваем вниз несколько раз
		$mouse->wheel(-rand(1*$k, 4*$k), $x, $y);
		usleep(rand(200000, 900000));
		// дергнем мышку
		$mouse->move($x+rand(-10,10), $y+rand(-10,10), false, 0, rand(3, 7));
		sleep(rand(2, 5));
	}
	else
	{
		// прокручиваем вниз несколько раз
		$mouse->send_wheel(-rand(1*$k, 4*$k), $x, $y);
		usleep(rand(200000, 900000));
		// дергнем мышку
		$mouse->send_move($x+rand(-10,10), $y+rand(-10,10), false, 0, rand(3, 7));
		sleep(rand(2, 5));
	}
}

// медленный скролинг вверх по странице (для клика по ссылке)
function scroll_up_page_slow1($full_emul = false)
{
	global $mouse, $browser;
 
	// получаем текущие координаты мышки
	$x = $mouse->get_x(true);
	$y = $mouse->get_y(true);

        echo("получаем текущие координаты мышки : $x и $y");
	
	// мышь за пределами браузера
	if (($x <= 0) or ($y >= $browser->get_window_height()))
	{
		echo( "мышка находится за пределами браузера<br>");
		echo( "ставим мышку в случайную точку браузера<br>");
                if($full_emul)
		    $mouse->move(rand(10, $browser->get_window_width()-20), rand(10, $browser->get_window_height()-20), false, 1, 5);
                else
                    $mouse->send_move(rand(10, $browser->get_window_width()-20), rand(10, $browser->get_window_height()-20), false, 1, 5);

		sleep(1);
		// снова получаем текущие координаты мышки
		$x = $mouse->get_x(true);
		$y = $mouse->get_y(true);
                echo("получаем текущие координаты мышки : $x и $y");
	}

   // прокручиваем страницу
   if ($full_emul)
	{
		// прокручиваем вниз несколько раз
		$mouse->wheel(rand(2, 3), $x, $y);
		usleep(rand(200000, 900000));
		// дергнем мышку
		$mouse->move($x+rand(-10,10), $y+rand(-10,10), false, 0, rand(3, 7));
		sleep(rand(2, 5));
	}
	else
	{
		// прокручиваем вниз несколько раз
		$mouse->send_wheel(rand(2, 3), $x, $y);
		usleep(rand(200000, 900000));
		// дергнем мышку
		$mouse->send_move($x+rand(-10,10), $y+rand(-10,10), false, 0, rand(3, 7));
		sleep(rand(2, 5));
	}
}

function scroll_move_click($number,$full_emul = false)
{
	global $browser, $keyboard, $mouse, $anchor, $webpage;

	// определяемся с координатами элемента по которому будем кликать
	$x = 0; $y = 0;
	// получаем координаты левого верхнего угла ссылки
	$x = $anchor->get_x_by_number($number);
	$y = $anchor->get_y_by_number($number);
	echo( "Координаты левого верхнего угла ссылки для клика x=$x   y=$y<br>");
	// не получили координат 
	if ($x <= 0 and $y <= 0)
	{
		echo("Не получили координат искомой ссылки - кликаем просто.<br>");
		// добиваем чтоб наверняка
		$anchor->set_focus_by_number($number);
		$anchor->send_event_by_number($number, "onmouseover");
		$anchor->click_by_number($number);
		$anchor->send_event_by_number($number, "onclick");
		return false;
	}
	// получаем ширину ссылки
	$anchor_width = 0;
	$anchor_width = $anchor->get_width_by_number($number);
	if ($anchor_width <= 0)
	{
		echo( "Не получили ширину ссылки<br>");
		$anchor_width = 2;
	}
	echo( "Ширина ссылки: $anchor_width<br>");
	
	// получаем высоту ссылки
	$anchor_height = 0;
	$anchor_height = $anchor->get_height_by_number($number);
	if ($anchor_height <= 0)
	{
		echo( "Не получили высоту ссылки<br>");
		$anchor_height = 2;
	}
	echo( "Высота ссылки: $anchor_height<br>");

	// получаем случайную координату внутри ссылки для клика
	$x1 = 0; $y1 = 0;
	//$x1 = $x + rand(1, (floor($anchor_width/2)));
	//$y1 = $y + rand(1, (floor($anchor_height/2)));
    $x1 = $x + rand(1, (floor($anchor_width/4)));
    $y1 = $y + 3;
	echo( "Координаты внутри ссылки: x = $x1    y = $y1<br>");
	
	// определяем позицию вертикального скрола
        $vertical_scroll = $browser->get_vertical_scroll_pos();
	echo( "Позиция вертикального скрола: $vertical_scroll");

	// определяем позицию горизонтального скрола
	$horizontal_scroll = $browser->get_horizontal_scroll_pos();
	echo( "<br>Позиция горизонтального скрола: $horizontal_scroll");
	
	// определяем высоту окна браузера
        $height_browser = $browser->get_window_height();
	echo( "высота окна браузера: $height_browser");
	
	// определяем ширину окна браузера
        $width_browser = $browser->get_window_width();
	echo( "ширина окна браузера: $width_browser");

	// двигаем мышь вниз на позицию для клика на нужной ссылке
	while (true)
	{
		// определяемся куда ехать вверх, вниз или уже приехали
		// приехали
		if (($y1 < ($vertical_scroll + $height_browser - 30)) and ($y1 > $vertical_scroll + 30))
		{
			echo( "Нужная нам ссылка в пределах окна браузера по высоте<br>");
			// определяем соответствие по х
			while (true)
			{
				if (($x1 < ($horizontal_scroll + $width_browser)) and ($x1 >= $horizontal_scroll))
				{
					echo( "Нужная нам ссылка в пределах окна браузера и по ширине<br>");
					//sleep(1);
					break 2;
				}
				elseif ($x1 >= ($horizontal_scroll + $width_browser))
				{
					echo( "едем вправо<br>");
					$keyboard->send_key("39", true);
					//sleep(1);
				}
				elseif ($x1 < $horizontal_scroll)
				{
					echo( "едем влево<br>");
					$keyboard->send_key("37", true);
					//sleep(1);
				}
				else
				{
					echo( "<b>Чепуха!! Мы не должны здесь быть!!! Обратитесь к разработчику351.</b><br>");
					return false;
				}
				// определяем текущую позицию горизонтального скрола

				$horizontal_scroll = $browser->get_horizontal_scroll_pos();
                                echo( "<br>Текущая позиция горизонтального скрола: $horizontal_scroll");
			}
		}
		// ехать вниз
		elseif ($y1 >= ($vertical_scroll + $height_browser - 30))
		{

                        $vertical_scroll = $browser->get_vertical_scroll_pos();
			echo( "<br>Текущая позиция вертикального скрола: $vertical_scroll");

                        $page_height = $browser->get_page_height();
			echo( "<br>Высота страницы: $page_height");
			if (($vertical_scroll + $height_browser) > $page_height)
			{
				
				$vertical_scroll = $vertical_scroll + 31;
                                echo( "скролл находится в самом низу: $vertical_scroll");
				continue;
			}
			echo( "едем вниз<br>");
			scroll_down_page_slow1(true);
		}
		// ехать наверх
		elseif ($y1 <= $vertical_scroll + 30)
		{

			$vertical_scroll = $browser->get_vertical_scroll_pos();
			echo( "<br>Текущая позиция вертикального скрола: $vertical_scroll");
			if ($vertical_scroll == 0)
			{

				$vertical_scroll = -31;
				echo( "скролл находится в самом верху<br>");
				continue;
			}
			echo( "едем наверх<br>");
			scroll_up_page_slow1(true);
		}
		else
		{
			echo( "<b>Чепуха!! Мы не должны здесь быть!!! Обратитесь к разработчику373.</b>");
			return false;
		}

		$vertical_scroll = $browser->get_vertical_scroll_pos();
		echo( "<br>Текущая позиция вертикального скрола: $vertical_scroll");
	}

	// определяемся с координатами ссылки для клика
	$vertical_scroll = $browser->get_vertical_scroll_pos();
	$x1 = $x1 - $horizontal_scroll-1;
	$y1 = $y1 - $vertical_scroll-1;
	echo( "<br>Координаты клика: x1=$x1   y1=$y1<br>");	
	
	// двигаем мышку к нужным координатам
        if($full_emul)
    	   $mouse->move($x1, $y1, false, rand(1, 2), rand(3, 7));
        else
           $mouse->send_move($x1, $y1, false, rand(1, 2), rand(3, 7));

	usleep(rand(600000, 900000));
	
	// запоминаем урл
	$url = $webpage->get_location_url();
		
	// кликаем по координатам
	$anchor->set_focus_by_number($number);
	$anchor->send_event_by_number($number, "onmouseover");
	$mouse->click($x1, $y1, false);
	sleep(3);
	
	$x_2 = $anchor->get_x_by_number($number);
	$y_2 = $anchor->get_y_by_number($number);
	echo( "x = $x   y = $y<br>");
	echo( "x_2 = $x_2   y_2 = $y_2<br>");
	
	// запоминаем новый урл
	$url2 = $webpage->get_location_url();

	if ($url == $url2)
	{
		if (($x_2 == $x) and ($y_2 == $y))
		{
			echo( "Мы все еще на этой странице - кликаем по другому<br>");
			$anchor->click_by_number($number);
			sleep();
		}
	}
	while ($browser->is_busy())
	{
		sleep(1);
	}
		
	return true;
}

// Quit
$app->quit();
?>

Аватара пользователя
milukov
Сообщения: 2
Зарегистрирован: 20 авг 2017, 08:55

Re: Функция прокручивания скрола и клика по номеру элемента

Сообщение milukov » 26 сен 2017, 01:29

ну или если будет у кого желание - отладить
По моему проще будет самому написать, чем твой код править :D

kutuzoff
Сообщения: 19
Зарегистрирован: 06 ноя 2014, 03:57

Re: Функция прокручивания скрола и клика по номеру элемента

Сообщение kutuzoff » 26 сен 2017, 13:34

Если это были отлаженные функции, то могло и пригодится 8)
А можно ли узнать в чем их недостаток на данный момент ?

Аватара пользователя
spaiker
Сообщения: 33
Зарегистрирован: 14 сен 2017, 02:01

Re: Функция прокручивания скрола и клика по номеру элемента

Сообщение spaiker » 26 сен 2017, 22:35

kutuzoff писал(а):
26 сен 2017, 13:34
Если это были отлаженные функции, то могло и пригодится 8)
А можно ли узнать в чем их недостаток на данный момент ?
Ну оно вроде как работает, но не всегда срабатывает так как надо. По идее должен быть плавный скрол к элементу для клика, но функция при выполнении может резко сдвинуть скрол на элемент. Может это зависит ещё от сайтов на которых мы скролируем...

kutuzoff
Сообщения: 19
Зарегистрирован: 06 ноя 2014, 03:57

Re: Функция прокручивания скрола и клика по номеру элемента

Сообщение kutuzoff » 27 сен 2017, 01:03

Понятно.
На свой страх и риск значит , ну все равно респект за труды :) , может и пригодиться.

Ответить