кукловод перенаправляется, когда браузер не - PullRequest
0 голосов
/ 01 августа 2020

Попытка проверить страницу https://publicindex.sccourts.org/anderson/publicindex/ При переходе к странице в стандартном браузере навигация заканчивается на запрошенной странице (https://publicindex.sccourts.org/anderson/publicindex/), на которой отображается «принять» "кнопка.

Однако при тестировании с кукловодом в режиме без головы запрос перенаправляется на https://publicindex.sccourts.org.

У меня есть приблизительное представление о том, что происходит, но не может предотвратить перенаправление на https://publicindex.sccourts.org, когда страница запрашивается с помощью puppeteer. вот что, я считаю, происходит с браузером, управляемым пользователем:

  1. запрос страницы отправлен. (при первом посещении)

  2. ответ чистый JS,

  3. Код 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();

1 Ответ

1 голос
/ 01 августа 2020

У меня нет полного разрешения, но я знаю, где происходит перенаправление.

Я проверил ваш скрипт локально, как показано ниже:

const puppeteer = require('puppeteer');
const PuppeteerHar = require('puppeteer-har');

function run () {
    let url = 'https://publicindex.sccourts.org/anderson/publicindex/';
    puppeteer.launch({headless: false, devtools: true }).then(async browser => {
        const page = await browser.newPage();
        await page.setRequestInterception(true);
        page.on('request', request => {
            console.log('GOT NEW REQUEST', request.url());
            request.continue();
        });

        page.on('response', response => {
            console.log('GOT NEW RESPONSE', response.status(), response.headers());
        });
        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();
    });
};
run();

Я редактировал три части:

  • Удален безголовый режим и автоматически открываются инструменты разработчика
  • Перехват всех сетевых запросов (которые я проверял)
  • Поднятый require импорт, потому что это режет мне глаза. Я всегда вижу, как они звонят без вложенности

Оказывается, страница https://publicindex.sccourts.org/anderson/publicindex/ делает запрос https://publicindex.sccourts.org/

Однако этот запрос возвращает 302 Redirect в https://www.sccourts.org/caseSearch/ местоположение, поэтому браузер действует соответственно

enter image description here

I would try to investigate this weird request if it is legit or not and why it redirects on chrome puppeteer

This сообщение может помочь, может быть что-то связано с тем, что хром считается небезопасным

Я также пытался передать args: ['--disable-web-security', '--allow-running-insecure-content'] для запуска () параметр объекта, но без результатов

Пожалуйста, дайте нам знать, как это происходит! Было весело открывать для себя Хар!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...