маяк и кукловод, аудит страницы требует аутентификации - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть веб-приложение SPA, созданное vue. страница защищена страницей входа (на самом деле vue маршрутизатор),

после входа в систему, токен сохраняется в sessionStorage, а затем переходит на домашнюю страницу (еще один vue маршрутизатор.)

Я хочу использовать маяк для проверки домашней страницы, но не могу войти с кукольником. мой код:

'use strict';

const puppeteer = require('puppeteer-core')
const lighthouse = require('lighthouse')
const http = require('http')
const PORT = 8041;

const opts = {
    hostname: 'x.x.x.x',
    port: 9876,
    path: '/lighthouse/scores',
    method: 'POST',
    timeout: 5000,
    headers : {
        'Accept' : 'application/json',
        'Content-Type' : 'application/json'
    }
}

var session;
// 登录
async function login(broswer, origin){
    const loginPage =  (await broswer.pages())[0];
    await loginPage.goto(origin);
    await loginPage.waitForSelector('#pane-pwd > form > div:nth-child(1) > div > div > input', {visible: true});
    const userInput =  await loginPage.$('#pane-pwd > form > div:nth-child(1) > div > div > input');
    await userInput.type('admin');
    const pswdInput =  await loginPage.$('#pane-pwd > form > div:nth-child(2) > div > div > input');
    await pswdInput.type('123456');
    const loginButton = await loginPage.$('#app > div > div.main > div.tabs > div.bt-wrap > button');
    await loginButton.click();

    await loginPage.waitForSelector('.home');

    const states = await loginPage.evaluate(() => {
        //alert(sessionStorage.getItem('default'));
        return JSON.stringify(sessionStorage);
    })
    session = JSON.parse(states);

    return session;
}

// 上传lighthouse结果
function uploadReport(scores){
    console.log('--------------------- uploading lighthouse report --------------------- ');
    const req = http.request(opts, res => {
        console.log(`Update : statusCode: ${res.statusCode}`)
        if(res.statusCode != '204'){
            console.error(res.statusMessage)
        }else{

        }
    });
    req.on('error', error => {
        console.error(error)
    });
    req.write(scores);
    req.end();
}

async function main(){
    const broswer = await puppeteer.launch({
        args : [`--remote-debugging-port=${PORT}`],
        headless : false,
        defaultViewport : null,
        executablePath : '/usr/bin/google-chrome-stable'
    });

    const session = await login(broswer, 'http://x.x.x.x/');

    console.log(session);

    broswer.once('targetchanged', async target => {
        console.log('------- target changed -------');
        const page  = await target.page();
        await page.waitForNavigation();
        page.evaluate((session) => {
            console.log('------- copy session state -------')
            sessionStorage.setItem('___un__solvable___secrets__', session['___un__solvable___secrets__']);
            sessionStorage.setItem('default', session['default']);
        }, session);
    });


    const result = await lighthouse('http://x.x.x.x/#/admin/home', {port: PORT, disableStorageReset : true, disableDeviceEmulation: true, emulatedFormFactor : 'desktop'})
    const scores = {
        project : 'P364',
        url : '/',
        performance : result.lhr.categories.performance.score,
        accessibility : result.lhr.categories.accessibility.score,
        bestPractice : result.lhr.categories['best-practices'].score,
        pwa : result.lhr.categories.pwa.score,
        seo : result.lhr.categories.seo.score,
    }

    console.log(scores);

    uploadReport(JSON.stringify(scores));

    //await broswer.close();

}

if(require.main === module){
    main();
}else{
    module.exports = {
        login
    };
}

Я хочу сначала использовать puppeteer для входа, на отдельной вкладке, затем извлечь токен из sessionStorage и в какой-то момент, когда маяк начнет загружать URL (еще одна вкладка), ввести токен для sessionStorage. но не удалось: execution context was destroyed, в слушателе targetchange, пожалуйста, помогите.

кроме того, я хочу знать, настаиваю ли я на том, чтобы настаивать на проверке домашней страницы, поскольку это vue SPA? так как большинство ресурсов уже загружены на странице входа.

...