Дамп 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"];
	КонецЕсли;
	Возврат Неопределено;
КонецФункции  

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 2

  1. Вемпис:

    Ну наверное Сбер эту функциональность не руками пишет, а на фреймворке. Плюс это все собирается динамически на стороне сервера под сеанс/браузер и прочее, п.э. закладываться на имена классов css — это надо быть особо одаренным

    • ну у всех классов там есть постоянная часть, я думал, на имена классов ориентироваться надежнее, чем на имена столбцов таблицы. Но вышло наоборот.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *