Попытка проверить страницу https://publicindex.sccourts.org/anderson/publicindex/ При переходе к странице в стандартном браузере навигация заканчивается на запрошенной странице (https://publicindex.sccourts.org/anderson/publicindex/), на которой отображается «принять» "кнопка.
Однако при тестировании с кукловодом в режиме без головы запрос перенаправляется на https://publicindex.sccourts.org.
У меня есть приблизительное представление о том, что происходит, но не может предотвратить перенаправление на https://publicindex.sccourts.org, когда страница запрашивается с помощью puppeteer. вот что, я считаю, происходит с браузером, управляемым пользователем:
запрос страницы отправлен. (при первом посещении)
ответ чистый JS,
Код js указывает на:
копировать заголовки запроса начальной страницы
добавить указанный c заголовок и повторно запрашивать ту же страницу (xhr)
копирует URL-адрес из одного из заголовков ответа и заменяет местоположение
(или)
проверяет историю страницы,
добавляет URL из ответа на страницу в историю,
открывает новое окно,
записывает ответ xhr на новую страницу
закрывает новое окно
добавляет прослушиватель событий для функции в возвращенном запросе xhr
запускает событие
С помощью puppeteer я попытался отследить js, записать har, контролировать файлы cookie, просмотреть цепочку запросов, перехватить запросы страниц и настроить заголовки, просмотреть историю .... et c . Я в тупике. Вот самая базовая c версия сценария кукловода:
function run () {
let url = 'https://publicindex.sccourts.org/anderson/publicindex/';
const puppeteer = require('puppeteer');
const PuppeteerHar = require('puppeteer-har');
puppeteer.launch({headless: true}).then(async browser => {
const page = await browser.newPage();
await page.setJavaScriptEnabled(true);
await page.setViewport({width: 1920, height: 1280});
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
const har = new PuppeteerHar(page);
await har.start({path: 'results.har'});
const response = await page.goto(url);
await page.waitForNavigation();
await har.stop();
let bodyHTML = await page.content();
console.log(bodyHTML);
});
};
run();
почему я не могу заставить кукловода просто воспроизвести процесс, который выполняется js, когда я перехожу на страницу в chrome, и завершаю навигацию на страница "принять"?
вот версия с более подробным ведением журнала:
function run () {
let url = 'https://publicindex.sccourts.org/anderson/publicindex/';
const puppeteer = require('puppeteer');
const PuppeteerHar = require('puppeteer-har');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.setJavaScriptEnabled(true);
await page.setViewport({width:1920,height:1280});
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
await page.setRequestInterception(true);
page.on('frameattached', frame =>{ console.log('frame attached ');});
page.on('framedetached', frame =>{ console.log('frame detached ');});
page.on('framenavigated', frame =>{ console.log('frame navigated '); });
page.on('requestfailed', req =>{ console.log('request failed ');});
page.on('requestfinished', req =>{ console.log('frame finished '); console.log(req.url())});
let count = 0;
let headers = '';
page.on('request', interceptedRequest => {
console.log('requesting ' + count + 'times');
console.log('request for ' + interceptedRequest.url());
console.log(interceptedRequest);
if (count>2) {
interceptedRequest.abort();
return;
}
if (interceptedRequest.url() == url) {
count++;
if (count == 1) {
const headers = interceptedRequest.headers();
headers['authority'] = 'publicindex.sccourts.org';
headers['sec-fetch-dest'] = 'empty';
headers['sec-fetch-mode'] = 'cors';
headers['sec-fetch-site'] = 'same-origin';
headers['upgrade-insecure-requests'] = '1';
interceptedRequest.continue({headers});
return;
} else {
interceptedRequest.continue();
return;
}
}
count++;
interceptedRequest.continue();
return;
});
const har = new PuppeteerHar(page);
await har.start({ path: 'results.har' });
await page.tracing.start({path: 'trace.json'});
await Promise.all([page.coverage.startJSCoverage({reportAnonymousScripts : true})]);
const response = await page.goto(url);
const session = await page.target().createCDPSession();
await session.send('Page.enable');
await session.send('Page.setWebLifecycleState', {state: 'active'});
const jsCoverage = await Promise.all([page.coverage.stopJSCoverage()]);
console.log(jsCoverage);
const chain = response.request().redirectChain();
console.log(chain + "\n\n");
await page.waitForNavigation();
await har.stop();
let bodyHTML = await page.content();
console.log(bodyHTML);
});
};
run();