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(); ?>