Загрузка файла на сайт. Использование объекта inputfile. Функция execute_open_file.

По многочисленным просьбам наших читателей мы решили начать цикл статей, которые помогут вам понять, как самостоятельно можно решать те или иные задачи с помощью Human Emulator. И начнём мы с загрузки файла на сайт.

Очень часто, когда мы даём объявление на доску то нам предлагают загрузить фото размещаемого товара на сайт.

Это может выглядеть следующим образом:

Доска объявлений ria.ua

Доска объявлений emarket.ua

Доска объявлений slando.ua

Или же нам нужно залить файл на файлообменник, например на depositfiles.com:

Файлообменник depositfiles.com

Или же на любой другой сайт, где используются поля загрузки файла

Примеры полей загрузки файла на полигоне humanemulator.net

Загрузка файла в html осуществляется через тэг

Для работы с этим тэгом в Human Emulator есть объект inputfile.
Возможности этого объекта описаны тут
Для заполнения полей загрузки файла используются команды $inputfile->set_value_by_name и $inputfile->set_value_by_number. Скрипты с примерами этих команд можно найти в закладке Быстрый старт в папке «Tests\DOM\inputfile\common\».

Теперь напишем скрипт для доски emarket.ua.
Итак, переходим в Хумане на emarket.ua. Далее заходим на страницу добавления товара и находим поле, в которое нужно добавить фотографии. Вместо поля ввода пути к файлу видим кнопку с текстом «+Добавить». После нажатия на неё у нас появляется системный диалог открытия файла с заголовком «Выберите файлы для отправки с помощью emarket.ua». На разных системах заголовок диалога может отличаться.

Для обработки этих диалогов в Human Emulator есть специальная функция $window->execute_open_file($text,$path,$btn_text,$exactly=true,$thread=false);. Теперь в скрипте нам просто нужно нажать на кнопку и вызвать обработку появившегося диалога.

Для этого кликнем правой кнопкой мыши на кнопке с текстом добавить «+Добавить». Выберем пункт меню «Щелкнуть», подменю $object->click_in_by_name(«uploadButton»);. Эта строка появиться в скрипте.

Примечание: Для работы с объектами лучше использовать функции, которые работают по имени или id или другому уникальному атрибуту элемента, так как при добавлении ещё одного элемента такого же типа номера могут измениться и скрипт прекратит работу. Вам опять придётся проставлять в скрипте номера. Если сайт меняется не часто, то в принципе в этом нет ничего страшного, если же сайт меняется регулярно, то это может быстро утомить.

Запустим скрипт. Ничего не происходит. Функция click_in_by_name имеет параметры($name,$x=-1,$y=-1,$frame=-1); Попробуем передать координаты кнопки в эту функцию. Для получения координат воспользуемся функциями $object->get_x_by_name и $object->get_y_by_name в скрипте это будет выглядит так:

Если кнопка не видима в браузере, то клик на неё может не пройти. Поэтому при клике на какой-либо элемент в Human Emulator, браузер программы автоматом переходит на этот элемент, так что бы он стал видимым. При этом может измениться Y координата элемента. Но элемент при этом будет всегда в нижней части браузера, поэтому мы можем привязать Y элемента к высоте браузера.
В итоге скрипт будет:

Запускаем скрипт. Открылся диалог выбора файла. Теперь нам нужно добавить обработку этого диалога с помощью функции $window->execute_open_file($text,$path,$btn_text,$exactly=true,$thread=false).
К сожалению, описания этой функции на humanemulator.net нету. Поэтому опишем параметры, которые нужно передавать в функцию:
$text — это заголовок диалога полностью или частично;
$path — путь к одной или нескольким картинкам, если вы передаёте несколько картинок, то они должны быть в кавычках и через пробел — «c:\\picture1.jpg» «c:\\picture2.jpg» «c:\\picture3.jpg» и т.д.;
$btn_text — текст кнопки, на которую надо кликнуть, причём текст этот должен полностью соответствовать тексту внутри окна кнопки. То есть, если мы нажмём на alt, то увидим подчёркнутую букву, значит перед этой буквой стоит символ &. Так в нашем случае текст кнопки будет &Открыть.
$exactly — говорит о том полностью или частично задан заголовок диалога. По умолчанию этот параметр true, то есть строгое соответствие параметра $text заголовку диалога.
$thread — последний параметр говорит, о том нужно ли запускать эту функцию в отдельном потоке или нет. Что это значит? Диалоги могут быть модальные и не модальные.
Модальный диалог блокирует все остальные окна приложения так, что пользователь не может с ними ничего сделать, пока не закроет диалог.
Не модальный диалог больше похож на обычные окна, т. к. он даёт пользователю возможность доступа к остальным окнам приложения.
Самый простой способ определить модальный или не модальный диалог это открыть его и кликнуть на любое другое окно программы, если мы услышим звук beep, то это модальный диалог, если же мы перешли на окно, значит диалог не модальный. В случае с модальным диалогом параметр thread должен быть равен true и функция execute_open_file должна вызываться перед кликом на элемент, который открывает диалог выбора файла. Для не модального диалога thread=false и функцию можно вызывать после появления диалога.

На emarket.ua как и на большинстве досок используется модальный диалог, то есть он блокирует доступы ко всем остальным окнам программы. Теперь скрипт будет:

Вот и готово. Но у данного способа есть свои минусы. При многопоточном использовании скрипта с таким кодом может возникнуть ситуация, когда один скрипт вставляет файлы в диалоговое окно открытое другим скриптом. Если файлы одинаковые то это не страшно, а вот если нет, то это уже не хорошо. Можно, конечно, написать код который будет проверять обрабатывает ли в данный момент какой то скрипт этот диалог или нет, но лучше пойти по пути использования
непосредственно поля <input type=»file»> через функции set_value_by_*. Обработка загрузки файлов таким способом будет проще и работать быстрее. В последних версиях программы данная проблема решена и теперь каждая копия работает со своим открытым диалогом.

Для данной доски это можно решить через нажатие на ссылку с текстом «простой формой загрузки фото». После нажатия на эту ссылку показываются поля ввода пути к файлу, который надо загрузить. И в данном случае скрипт будет:

Из практики написания скриптов, есть моменты, когда $inputfile->set_value_by_name нужно вызывать дважды иначе он не заполняет поле. Или если поле находится в форме, то он может не отображать текст в поле на сайте, но при сабмите формы этот путь будет проходить. Так же можно, находить скрытые элементы <input type=»file»>, в которые добавляется вводимый вами путь через java script и пробовать добавлять путь к файлу напрямую в этот элемент, даже если его не видно на странице. Так же нужно обратить внимание на то, что при добавлении пути к файлу должен быть соблюден формат пути, то есть путь должен начинаться с диска, например: c:\\, иначе текст может не вставляться в поле.

Ниже приведены примеры скриптов для работы с досками и файлообменниками, на которые нужно загрузить два рисунка из заданной папки. При этом можно использовать, как работу через диалоги выбора файла, так и через задание значения поля ввода пути к файлу.

Скрипт добавления нескольких файлов на emarket.ua

Скрипт добавления нескольких файлов на ria.ua

Скрипт добавления нескольких файлов на depositfiles.com

Пример загрузки фото на одну из досок, используя функцию set_value_by_name

Скрипты написаны в Xweb Human Emulator 4.4.19 MT.

скачать примеры скриптов