Xpath — поиск текста и части текста на странице
Поиск точного совпадения:
//div[@data-ng-if='!filter.query']/span[text()='20 из ']
Поиск по части текста:
//div[@data-ng-if='!filter.query']/span[contains(text(), '20')]
Жизнь замечательных грибов
Здесь собраны статьи, наработки, исправление ошибок и решение проблем связанных с разработкой для WEB
Поиск точного совпадения:
//div[@data-ng-if='!filter.query']/span[text()='20 из ']
Поиск по части текста:
//div[@data-ng-if='!filter.query']/span[contains(text(), '20')]
Задача: выкачать файлы уведомлений от ФССП приходящие для организации.

Почему нет штатного API для получения уведомлений на Госуслугах, вопрос интересный. В результате каждая организация которая в большом объеме работает со службой судебных приставов изобретает свой инструмент для автоматизации получения уведомлений. И я сей чаши не избежал 😉
Решение: напишем парсер на node.js с использование Selenium 2
// Начальные установки..
// количество выгружаемых уведомлений
cnt_uv=100;
// логин для входа в госуслуги
login="+094802к934к"
// пароль для входа
pass="уамцумцук ";
// путь для сохранения файлов
save_path="c:\\tmp";
// полное название организации
full_name="ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ «РОГА И КОПЫТА»";
var webdriver = require('selenium-webdriver');
const {Builder, By, Key, until} = require('selenium-webdriver');
(async function example() {
var chrome = require("selenium-webdriver/chrome");
var chromeOptions = new chrome.Options();
chromeOptions.addArguments("test-type");
// chromeOptions.addArguments("start-maximized");
// chromeOptions.addArguments("--js-flags=--expose-gc");
// chromeOptions.addArguments("--enable-precise-memory-info");
// chromeOptions.addArguments("--disable-popup-blocking");
// chromeOptions.addArguments("--disable-default-apps");
// chromeOptions.addArguments("--disable-infobars");
//chromeOptions.addArguments("--user-data-dir=C:\\tmp");
chromeOptions.addArguments("safebrowsing-disable-download-protection");
let driver = await new Builder().forBrowser('chrome').setChromeOptions(chromeOptions).build();
driver.setDownloadPath(save_path);
try {
console.log("-загружаем страницу авторизации");
await driver.get('https://lk.gosuslugi.ru');
console.log("--ok");
console.log("-ждем отрисовки");
elm= await driver.wait(until.elementLocated(By.xpath(".//button[@id='loginByPwdButton']"), 30000));
console.log("--ok");
console.log("-вставляем логин пароль и кликаем Enter");
await driver.findElement(By.id('login')).sendKeys(login,Key.TAB,pass,Key.RETURN);
console.log("--ok");
console.log("--ok");
console.log("-ищем full_name и кликаем по ней");
elm= await driver.wait(until.elementLocated(By.xpath(".//div[@title='"+full_name+"']"), 30000));
await driver.executeScript("arguments[0].click();", elm);
console.log("--ok");
console.log("-ждем пока не будет перехода на нужную страницу");
ccurl="";
while (ccurl!=="https://lk.gosuslugi.ru/info"){
await driver.getCurrentUrl().then(
url => {console.log('current url: "' + url + '"');ccurl=url;}
);
await driver.sleep(100);
};
//elm= await driver.wait(until.elementLocated(By.xpath(".//a[@data-ng-href='https://esia.gosuslugi.ru/profile/org/org.xhtml?orgOid=1087125902']"), 30000));
//await driver.sleep(2000)
console.log("--ok");
console.log("-идём на страницу уведомлений");
for (var i = 1; i < cnt_uv; i++) {
await driver.get("https://lk.gosuslugi.ru/notifications")
//console.log("--ok");
//console.log("-загружаю "+cnt_uv+" сообщений");
await GetNotifications(driver,cnt_uv);
//console.log("--ok");
//console.log("-кликаю по первому уведомлению и сохраняю файлы");
await UvedOpen(i);
console.log("--ok сохранен файл " +i+" из "+cnt_uv);
};
async function UvedOpen(n){
fl=await driver.findElements(By.xpath(".//a[@data-ng-click='openDetails(notification)' and @class='grid-wrap__col-lg-1 grid-wrap__col-md-1 grid-wrap__col-sm-1 grid-wrap__col-md-land-1 pad-top-24 pad-bottom-24']"))
await driver.executeScript("arguments[0].scrollIntoView()", fl[n]);
await driver.executeScript("arguments[0].click();", fl[n]);
elm= await driver.wait(until.elementLocated(By.linkText('Сохранить'), 30000));
//await driver.executeScript("arguments[0].click();", elm);
elm=await driver.findElements(By.linkText('Сохранить'));
elm[0].click();
elm[1].click();
await driver.sleep(1000);
}
async function GetNotifications(driver,cnt){
for (var i = 0; i < cnt/10; i++) {
pp=((i+1)*10);
//console.log("----ждем появления кнопки 'Показать еще ("+pp+")'");
elm= await driver.wait(until.elementLocated(By.linkText('Показать еще'), 30000));
//console.log("----ok");
//console.log("-нажимаю кнопку 'Показать еще'");
await driver.executeScript("arguments[0].scrollIntoView()", elm);
await driver.executeScript("arguments[0].click();", elm);
//console.log("--ok");
};
//console.log("-ждем полной прогрузки страницы");
fl= await driver.findElements(By.xpath(".//a[@data-ng-click='openDetails(notification)' and @class='grid-wrap__col-lg-1 grid-wrap__col-md-1 grid-wrap__col-sm-1 grid-wrap__col-md-land-1 pad-top-24 pad-bottom-24']"))
while (fl.length<cnt_uv){
fl= await driver.findElements(By.xpath(".//a[@data-ng-click='openDetails(notification)' and @class='grid-wrap__col-lg-1 grid-wrap__col-md-1 grid-wrap__col-sm-1 grid-wrap__col-md-land-1 pad-top-24 pad-bottom-24']"))
await driver.sleep(100);
// console.log("---ждем..");
};
};
} finally {
console.log("-вот и всё ребята..");
await driver.quit();
}
})();
Задача: в текущем выделенном элементе списка select заменить текст внутри скобок.
Решение:
Воспользуемся силой регулярки
$('#OutletSelectForCharging option:selected' ).text().replace(/\(.+\)/,'')+"("+current_status_connector_id+")";
Задача: по какому то условию (ну в моем случае это загрузка скрипта «Тура по сайту» если вдруг пользователь его не проходил), необходимо до грузить дополнительные JS и CSS файлы, а по завершению их загрузки — запустить.
Решение:
function TourStart(){
if ((localStorage.getItem(document.location.pathname+"_tour")==null)||(localStorage.getItem(document.location.pathname+"_tour")==false)){
element = document.createElement("script");
element.src = "https://shepherdjs.dev/dist/js/shepherd.js";
element.addEventListener('load', () => {
console.log("--загружаем тур!");
element = document.createElement("script");
element.src = "/js/tour.min.js";
document.body.appendChild(element);
});
document.body.appendChild(element);
element = document.createElement("link");
element.href = "https://shepherdjs.dev/dist/css/shepherd.css";
element.rel="stylesheet"
document.body.appendChild(element);
};
};
console.log("-- main.js загружен");
$(document).ready(function() {
TourStart(); // стартовать тур по странице если нужно..
});
В принципе алгоритм следующий и простой: при нажатии некой кнопки например, мы создаем ссылку с атрибутом download и программно её нажимаем. Код, что-то вроде:
var link = document.createElement('a');
link.setAttribute('href', 'https://цувцу.ru/u/'+POPUP_CODE_SMS.value);
link.setAttribute('download', 'uvцувцувed.pdf');
link.click();