Дамп HTML-страницы через Selenium в 1С
Считываю реестры Сбербанка через Selenium. У клиента возникла проблема — под одним из аккаунты реестры не находятся, решил делать дамп страницы, чтобы выяснить в чем проблема:
//НайденыЭлементы = ложь; ListItemIds = SeleniumGetElementsByXpath(Session, "//tr[contains(@class, 'pointer')]").ids; Реестры.Очистить(); Для Каждого ListItemID Из ListItemIds Цикл //Тут важна точка в начале, без нее ищет по всему документу NumberID = SeleniumGetElementByXpath(Session, ".//td[contains(@class, 'col-number')]", ListItemID).id; NumberText = SeleniumGetElementText(Session, NumberID); FileNameID = SeleniumGetElementByXpath(Session, ".//td[contains(@data-test-id, 'TableRow__fileName__tr')]", ListItemID).id; FileNameText = SeleniumGetElementText(Session, FileNameID); DateID = SeleniumGetElementByXpath(Session, ".//td[contains(@class, 'col-date')]", ListItemID).id; DateText = SeleniumGetElementText(Session, DateID); StatusID = SeleniumGetElementByXpath(Session, ".//td[contains(@class, 'col-status')]", ListItemID).id; StatusText = SeleniumGetElementText(Session, StatusID); ЛогНаКлиенте("Номер: " + NumberText + " Дата: " + DateText + " Имя файла: " + FileNameText + " Статус: " + StatusText); //Ищем только текстовые файлы Если НРег(Прав(FileNameText, 4)) <> ".txt" Тогда Продолжить; КонецЕсли; НСтр = Реестры.Добавить(); НСтр.Номер = NumberText; НСтр.ДатаСтрокой = DateText; НСтр.ИмяФайла = FileNameText; НСтр.NumberID = NumberID; НСтр.ListItemID = ListItemID; НСтр.Статус = StatusText; //SeleniumClick(Session, ButtonID); КонецЦикла; Если Реестры.Количество() > 0 Тогда ЛогНаКлиенте("Найдено реестров: " + Реестры.Количество()); ДампСтраницы(); Этап = "ЗапроситьРеестры"; Иначе CurrentURL = SeleniumGetCurrentURL(Session); ЛогНаКлиенте("Не найдены реестры на странице: " + CurrentURL + ". Переходим на конец загрузки реестров (пропускаем загрузку)"); ДампСтраницы(); Этап = "ФинишЗагрузкиРеестров"; КонецЕсли;
Вызываю методом ДампСтраницы:
&НаКлиенте Процедура ДампСтраницы() BodyID = SeleniumGetElementByXpath(Session, ".//body").id; BodyHTML = SeleniumGetElementProperty(Session, BodyId, "innerHTML"); ЛогНаКлиенте("===================== PAGE DUMP BEGIN =============================="); ЛогНаКлиенте(BodyHTML); ЛогНаКлиенте("===================== PAGE DUMP END =============================="); КонецПроцедуры
И действительно, оказалось, что под некоторыми аккаунтами разметка другая. Не знаю, почему Сбербанк так делает, может на разных серверах разный код генерации HTML. Придется опираться не на классы объектов, а искать через XPath по заголовкам колонок.
Но чтобы сделать дамп страницы, пришлось потрудиться. Я уже умел получать body страницы (через XPath).
Но при попытке получить атрибут innerHTML у страницы получал от Selenium Null. Попробовал на другом атрибуте — работает. Оказывается, надо получать не атрибут, а property. Надо же…
&НаКлиенте Функция SeleniumGetElementAttribute(Session, Element, Attribute) Экспорт Р = SeleniumGET(Session.sessionURL + "element/" + Element + "/attribute/" + Attribute); Если Р.ОК И Р.JSON <> Неопределено Тогда Возврат Р.JSON["value"]; КонецЕсли; Возврат Неопределено; КонецФункции &НаКлиенте Функция SeleniumGetElementProperty(Session, Element, property) Экспорт Р = SeleniumGET(Session.sessionURL + "element/" + Element + "/property/" + property); Если Р.ОК И Р.JSON <> Неопределено Тогда Возврат Р.JSON["value"]; КонецЕсли; Возврат Неопределено; КонецФункции
Ну наверное Сбер эту функциональность не руками пишет, а на фреймворке. Плюс это все собирается динамически на стороне сервера под сеанс/браузер и прочее, п.э. закладываться на имена классов css — это надо быть особо одаренным
ну у всех классов там есть постоянная часть, я думал, на имена классов ориентироваться надежнее, чем на имена столбцов таблицы. Но вышло наоборот.