Работа с онлайн досками от А до Я. Заполнение формы.
После того как мы определились с форматом данных для наших объявлений и получили их в нужном для скрипта виде далее мы будем с их помощью заполнять форму объявлений.
Как правило форма объявлений состоит из текстовых полей, списков выбора, элементов для добавления фотографий, а также галочек, ссылок и кнопок.
Рассмотрим как работать со всеми элементами формы в программе Human Emulator Studio.
Заполнение текстовых полей.
Списки выбора.
Загрузка фотографий.
Галочки, ссылки и кнопки.
Заполнение текстовых полей.
Текстовые поля это элементы формы с тэгом input type=text. Эти элементы используются для ввода небольшого текста в одну строку. Как правило с помощью этих элементов вводится такая информация из объявления как название, цена, телефон, имя, email и т.д.
Для работы с такими полями в программе используется объект input. Есть несколько команд для заполнения текстовых полей с помощью этого объекта. Для выбора нужной команды вызовем Контекстное меню программы. Для этого установим фокус на текстовое поле, которое собираемся заполнять и кликаем правой кнопкой мыши.
Команды которые вводят текст в текстовое поле находятся в пунктах меню Изменить элемент и Эмулировать клавиатуру.
Разница между этими командами состоит в том, что команды блока Изменить элемент заполняют поля просто изменяя соответствующие атрибуты. На выполнение этих команд уходят доли секунд. Использовать эти команды нужно в тех формах, которые не имеют скриптовых проверок на заполнение полей. Команды из блока Эмулировать клавиатуру заполняют поля таким образом, как будто это делается пользователем с клавиатуры. На выполнение этих команд в зависимости от настроек может уходить до нескольких секунд. Эти команды нужно использовать в тех формах, где на ввод текста в поля добавлены скриптовые проверки. Как правило все более или менее популярные доски используют проверки при вводе текста.
Выбираем из пункта меню Эмулировать клавиатуру команду $input->send_keyboard_input_by_name(«data[title]»,»», «20:40»);
В наш скрипт добавится следующая строка: $input->send_keyboard_input_by_name(«data[title]»,»», «20:40»);
Вместо пустой строки подставляется текст для ввода его в поле. К примеру:
1 2 |
$input->send_keyboard_input_by_name("data[title]","Заголовок объявления", "20:40"); |
Результат выполнения команды:
Помимо элементов для ввода простых строк текста в формах используются и элементы для ввода большого количества текста. Эти элементы служат для ввода описания товара или услуги и обозначены тэгом textarea. Для работы с ними в программе есть объект с соответствующим названием textarea. Работа с этими полями полностью аналогична работе с простыми текстовыми полями. Также вызываем Контекстное меню, используем болк команд Эмулировать клавиатуру и выбираем команду $textarea->send_keyboard_input_by_name(«data[description]»,»», «20:40»);.
Добавляем в команду текст для ввода $textarea->send_keyboard_input_by_name(«data[description]»,»Очень длинное описание нашего объявления», «20:40»);. И после выполнения нашего скрипта получим следующий результат:
Списки выбора.
Это элементы формы, которые служат для выбора уже известной информации, к примеру: выбор категории товара, марки и модели автомобиля, этажности дома, выбор валюты и т.д. Эти элементы могут быть простыми, состоящими просто из одного выпадающего списка или же могут быть сложными, когда по клику на элемент выбора списка, с помощью различных скриптов, подгружаются другие элементы или списки.
Простой выпадающий список.
Пример такого элемента можно увидеть на главной странице онлайн доски Avito.ru
Эти элементы в html обозначаются тэгом select и для работы c ними в программу добавлен объект listbox. Воспользуемся опять Контекстным меню программы и кликнем правой кнопкой мыши на выборе категории. В меню выберем пункт меню $listbox->Выбрать->$listbox->select_text_by_name(«category_id»,»Любая категорияТРАНСПОРТАвто»,false);.
В наш скрипт добавится следующий код $listbox->select_text_by_name(«category_id»,»Любая категорияТРАНСПОРТАвто»,false);. Исправим его для выбора интересующей нас категории, для выбора интересующей нас категории правим команду следующим образом:
1 2 |
$listbox->select_text_by_name("category_id","Автомобили"); |
Если по каким то причинам изменение не принимается формой и сбрасывается на стандартное значение, тогда нам нужно добавить к этому коду передачу события onchange. Для этого опять воспользуемся контекстным меню и на этот раз выберем пункт Послать Событие->$listbox->send_event_by_name(«category_id», «onclick»);.
В код нашего скрипта добавиться следующая строка:
1 2 |
$listbox->send_event_by_name("category_id", "onclick"); |
Поменяем событие onclick на onchange и получим:
1 2 |
$listbox->send_event_by_name("category_id", "onchange"); |
Таким образом, мы будем передавать событие изменения элемента и если к этому событию добавлено срабатывание какого то скрипта, то это будет происходить после вызова этой команды. Таким образом можно передавать элементам любые события.
Как правило при работе с такими списками достаточно вызова только команды выбора $listbox->select_text_by_name(«category_id»,»Автомобили»);
Сложные выпадающие списки.
Пример такого списка можно увидеть на доске olx.ua. Когда мы кликаем на этот список у нас появляется отдельное окно, которое представляет из себя набор ссылок. При нажатии на какую то из ссылок подгружается ещё ссылки и так пока не дойдём до конечного выбора. В данном случае всё обработка сводится к выбору команд клика по интересующим нас ссылкам.
Что бы сработал сложный список нам надо сначала кликнуть по самому элементу выбора, что бы он нам показал диалог выбора категории. Но так как этот элемент скрыт под несколькими другими элементами и не реагирует на функции из контекстного меню, будем кликать на элемент рядом с ним, который вызывает тот же диалог самый диалог с ссылками на категории. Выбираем в Контекстном меню следующий пункт Щёлкнуть->$anchor->click_by_id(«choose-category-ilu»);
В скрипт добавилась команда:
1 2 |
$anchor->click_by_id("choose-category-ilu"); |
Далее работаем с помощью контекстного меню и обрабатываем все ссылки в категориях через команды Щелкнуть.
Загрузка фотографий.
Загрузка фотографий на доску осуществляется через системный диалог Открытие файлов. Этот диалог может меняться в зависимости от системы и языка системы. Изменения в основном касаются Заголовка диалога и текста на кнопке Открыть.
Для обработки этого диалога в программу в объект window добавлена команда execute_open_file($text,$path,$btn_text,$exactly=true,$thread=false).
Команда работает следующем образом: по заголовку находит окно диалога, подставляет в этот диалог путь к файлу и нажимает на кнопку Открыть. Если всё работает верно, то при вызове команды окно диалога даже не будет открывать, а просто будет загружаться картинка.
Пример вызова команды применительно к окну с картинки выше:
1 2 |
$window->execute_open_file("Открытие файлов","test\\file.txt","&Open",false,true); |
Примечание: Текст кнопки должен быть полным и включать символ &. Если нажать кнопку Alt при открытом диалоге, то буква перед которой надо ставить символ & будет подчёркнута. Команду всегда нужно вызывать перед кликом на элемент, который вызывает этот диалог и параметр thread=true. Этот параметр говорит о том, что команда обработки запускается в отдельном потоке.
Что бы сработала команда нужно кликнуть на элемент, который вызывает диалог Открытие файлов. Этот элемент может быть картинкой, ссылкой, кнопкой и т.д. На всех популярных досках этот элемент обёрнут в скрипт, который выполняет вызов диалога и загрузку фотографии, поэтому добраться до этого элемента на этих досках довольно сложно. Для решения этой задачи мы можем использовать функционал определения подобных изображений.
Суть этой технологии простая делаем шаблонное изображение элемента, на который надо кликнуть. С помощью определения подобных изображений получаем координаты элемента и передаём событие мыши по этим координатам.
Для olx.ua пример обработки с помощью этой технологии будет следующим.
Шаблонная картинка:
Пример php кода для добавления нескольких фотографий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// путь к шаблонам кнопки в настройках скрипта $path_templ_imgs = $debug->get_cur_script_folder()."data\\add_photo.jpg"; for($a=0;$a<count($a_photos);$a++) { if($browser->get_model()=="Firefox") $window->execute_open_file("File", $img_path.trim($a_photos[$a]), "&Open", false, true); else $window->execute_open_file("файлов ", $img_path.trim($a_photos[$a]), "&Открыть", false, true); $pos = $webpage->get_pos_in_webpage_picture($path_templ_imgs ,0.9,4); echo "левый верхний угол картинки $pos->x x $pos->y<br>"; $mouse->send_move($pos->x,$pos->y); $mouse->send_click($pos->x,$pos->y); sleep(mt_rand(1,3)); } |
Пример добавления объявлений на доску OLX можно посмотреть на нашем форуме.
На доске ebay.com получается таже ситуация, мы не можем добраться до элементов добавления фотографии, поэтому также используем шаблонную картинку:
Пример php кода для ebay.com:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// путь к шаблону кнопки $path_templ_imgs = $debug->get_cur_script_folder()."data\\add_photo.jpg"; // добавляем все фотографии из папки foreach ($arr_imgs as $value) { $window->execute_open_file("файлов ", trim($value), "&Открыть", false, true); $pos = $webpage->get_pos_in_webpage_picture($path_templ_imgs ,0.9,4); // echo "левый верхний угол картинки $pos->x x $pos->y<br>"; $mouse->send_move($pos->x,$pos->y,false); $mouse->send_click($pos->x,$pos->y,false); sleep(mt_rand(1,3)); } |
Как видим из примеров выше добавление фотографий для обоих досок отличается только шаблонной картинкой.
А вот к примеру для доски объявлений realty.yandex.ru можно обойтись без шаблонных изображений, так как там можно кликнуть на элемент через передачу события клика мышки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// переходим на доску $browser->navigate("https://realty.yandex.ru/"); sleep(1); // кликаем на Добавить объявление $span->click_by_inner_text("Добавить объявление"); sleep(1); // выбираем Продать $btn->get_by_id("type-SELL")->send_mouse_click(3,5); sleep(1); // выбираем Квартира $btn->get_by_id("category-APARTMENT")->send_mouse_click(3,5); sleep(1); // задаём фокус $h3->set_focus_by_inner_text("Фотографии"); // добавляем обработку диалога $window->execute_open_file("файл",'C:\XWeb Studio\Human Emulator Studio\My Scripts\olx\images\img1.jpg',"&Открыть",false,true); sleep(1); // вызываем диалог добавления фотографии $span->get_by_inner_text("Выберите фотографии")->send_mouse_click(3,5); |
Галочки, ссылки и кнопки.
Как видно из примеров выше, все перечисленные элементы обрабатываются с помощью раздела Контекстного меню Щёлкнуть. И как правило обработка этих элементов не вызывает каких либо трудностей. Щёлкать на любые элементы мы можем по любым атрибутам или тексту. В случае если элементы не доступны мы можем использовать передачу событий от мыши через интерфейс элемента.
К примеру на доске realty.yandex.ru после перехода на подать объявление нам нужно кликнуть на большую кнопку Продать.
Простой клик на этой кнопке не срабатывает, поэтому нам нужно кликнуть на неё через передачу события мыши. Для этого в Контекстном меню отображаемом при клике на этом элементе правой кнопки мыши выбираем пункт Получить DOM интерфейс далее $btn->get_by_id(«type-SELL», false); далее Мышь и тут выбираем пункт $btn->get_by_id(«type-SELL», false)->send_mouse_click();
В наш скрипт добавится следующая команда:
1 2 |
$btn->get_by_id("type-SELL", false)->send_mouse_click(); |
Добавим координаты клика в рамках нашей кнопки и получим следующее:
1 2 |
$btn->get_by_id("type-SELL", false)->send_mouse_click(3,5); |
Примечание: Так как этот элемент довольно большой и под ним находится много разных элементов, то при клике в разных частях элемента может быть Контекстное меню для разных элементов.
С помощью передачи событий от мыши мы можем щёлкать на любые элементы таким образом, чтобы срабатывали скрипты прикрученные к этим элементам.
Как видно из статьи заполнение форм на досках объявлений не вызывает особых затруднений, особенно если это простые доски и для написания скрипта(сценария) заполнения формы подачи объявления вы можете обойтись работой с Контекстным меню программы.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.