Альтернатива COM объекту IE
Расширение, представляющее собой программную обертку для управления автономным сервером webdriver, а так же сервером selenium.
- Описание
- Подробнее
Описание
Иногда возникает необходимость написания разнообразных костыльных парсеров или, по-новому, роботов RPA. Возникает такая необходимость, например, когда у нужного сервиса банально нет API, либо за доступ к нему просят очень много денег, либо оно есть, но сотрудники тп о нем не знают и не могут ничем помочь (и такое бывало). Тут есть два пути, которые, к сожалению, программист, озадаченный написанием робота, не выбирает:
1. Писать парсер с помощью HTTP запросов. Этот вариант работает только если рендер страниц происходит полностью на сервере (статические сайты) и при нажатии всех кнопок просто происходит вызов сервера и весь код выполняется на нем.
2. Писать парсер, который использует браузер, например опять же COM объект IE.
Сейчас все чаще встречаются динамические сайты, на которых рендер страницы происходит на клиенте в зависимости от данных полученных с сервера, соответственно 1 вариант я практически не рассматриваю за редкими исключениями. Для создания роботов под динамические сайты до недавнего времени я использовал библиотеку selenium под python, неудобность заключалась в том, что на целевом компьютере должен быть установлен питон и сама библиотека, либо сам робот должен быть запихан в исполняемый файл библиотеками типа pyinstaller, так же нужно решать проблему с транспортом между 1с и роботом. И вот наткнувшись на статью Управление Selenium Web Driver из 1С (или парсинг из 1С по-взрослому) у меня возникла идея написать расширение для удобного управления сессиями сервера селениума из 1С. Пример простого робота с использованием расширения:
// Выводит названия топиков на форуме инфостарт на первой странице
Поиск = СерверСелениум.СпособыПоискаЭлемента();
Драйвер = Обработки.ДрайверChrome.Создать();
Драйвер.Открыть();
Драйвер.ПерейтиПоURL("//sale.itcity.ru/");
СписокКлассов = Драйвер.ЗначениеАтрибутаЭлемета(Драйвер.НайтиЭлемент(Поиск.ПоИмениТега, "body"), "class");
МенюСпрятано = СтрНайти(СписокКлассов, "hidden-menu") > 0 ИЛИ СтрНайти(СписокКлассов, "mobile-view-activated") > 0;
Если МенюСпрятано Тогда
Драйвер.Нажать(Драйвер.НайтиЭлемент(Поиск.ПоXPATH, "//a[@data-action=""toggleMenu""]"));
СерверСелениумСлужебный.Ожидать(1);
КонецЕсли;
Драйвер.Нажать(Драйвер.ПолучитьРодительскийЭлемент(Драйвер.НайтиЭлементПоТексту("Форум")));
СерверСелениумСлужебный.Ожидать(1);
Драйвер.Нажать(Драйвер.НайтиЭлементПоТексту("Все вопросы"));
Топики = Драйвер.НайтиЭлементыПоКлассу("ft-topic-name");
Для Каждого Топик Из Топики Цикл
Сообщить(Драйвер.ТекстЭлемента(Топик));
КонецЦикла;
Драйвер.Закрыть();
Функционал
На текущий момент реализовано:
1. Сессии:
-Создание сессии (открытие браузера)
-Удаление сессии (закрытие браузера)
2. Навигация:
-Переход по url
-Получение текущего url
-Переход вперед и назад по истории
-Обновление страницы
-Получение заголовка документа (страницы)
Работа с DOM:
-Поиск элемента(ов) по xpath, селекторам css, тексту ссылки, имени тега и xpath.
-Поиск элементов от заданного элемента по xpath, селекторам css, тексту ссылки, имени тега и xpath.
-Получение значений атрибутов элемента, значений свойств элемента, и значений css свойств элемента.
-Получение текста элемента, имени тега.
Действия с элементами:
-Клик по элементу.
-Очистка поля.
-Отправка нажатий клавиш в поле, в том числе клавиш типо ENTER, BACKSPACE и т.д.
Работа с документом:
-Получение кода страницы.
Прочие функции:
-Выполнение произвольного скрипта в текущем контексте агента пользователя, в т.ч. с работающей передачей аргументов, например:
Функция ПолучитьРодительскийЭлемент(Элемент) Экспорт
// Элемент - коллекция полученная функциями поиска элементов
ТекстСкрипта = "return arguments[0].parentNode";
Аргументы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Элемент);
Возврат СерверСелениум.ВыполнитьСкрипт(ИдентификаторСессии, ТекстСкрипта, Аргументы, Соединение)["value"]
КонецФункции
-Получение, установка и удаление cookie текущего документа.
-Создание скриншота текущей области.
-Создание скриншота определенного элемента.
Инструкция
1) Установить расширение в конфигурацию с БСП.
2) В случае если вы хотите запустить сервер драйвера для одного робота, то достаточно запустить хромдрайвер на нужном порте (аргумент —port). В случае если нужен сервер для управления множественными сессиями, то нужно выполнить первые два пункта из статьи Управление Selenium Web Driver из 1С (или парсинг из 1С по-взрослому).
3) Установить порт, на котором вы запускаете сервер в СерверСелениумПереопределяемый.ПортСервера().
4) При желании установить свою процедуру слипа в СерверСелениумПереопределяемый.Ожидать().
5) Писать своих роботов.
Тестировалось на БП 3.0.133.17, УТ 11.5.8.435 и очень древней УНФ.
Интерфейс только программный, графического никакого нет, обработка — просто пример использования этого интерфейса.