如何配置Puppeteer以正确渲染外部JS页面?仅适用于Localhost URL

问题描述 投票:1回答:2

我正在尝试为外部Javascript页面配置服务器端呈现。我正在使用Puppeteer这个目的,当我提供任何外部URL(不是localhost页面)时,Puppeteer只获取URL的源代码(你可以在所请求页面的view-source模式中看到),而不渲染整个DOM 。当我尝试SSR任何localhost Javascript页面URL(由我的本地主机上的同一节点js服务器生成的页面) - 一切正常。

请告知我是否遗漏了某些东西,或者我需要尝试其他方法。

我设法在我的localhost上配置了所有依赖项的puppeteer,如下所示:

目前'html'变量只返回获取的URL的源代码,我需要接收所请求URL的完全呈现的DOM。

server.js中的代码

var puppeteer = require('puppeteer');

async function ssr(url) {
  console.info('rendering the page in ssr mode');
  const browser = await puppeteer.launch({headless: true});
  const page = await browser.newPage();

  try {
    await page.goto(url, {waitUntil: 'domcontentloaded'});
  } catch (err) {
    console.error(err);
    throw new Error('page.goto/waitForSelector timed out.');
  }

  const html = await page.content();
  await browser.close();
  return {html};
}

module.exports = ssr;

app.js中的代码

var err = require('http-errors');
var express = require('express');
var path = require('path');
var ssr = require('./ssr.js');

var app = express();

app.listen(3000, function(){ console.info('Server listening on port '); });

app.use('/index/', async(req, res) => {
  const { html } = await ssr(`www.example.com`);
  return res.send(html);
});
node.js puppeteer google-chrome-headless serverside-javascript
2个回答
2
投票

问题很可能是,您没有给页面足够的时间来呈现DOM内容。 {waitUntil: 'domcontentloaded'}只会等待DOMContentLoaded事件,而不是任何AJAX请求或DOM修改。

尝试使用'networkidle0''load'作为waitUntil函数的page.goto值。

如果这不起作用,您有两种选择:


0
投票

尝试

const html = 'what ever you selector is but since you want the html just type in "html"'; 

let gg = await page.evaluate((sel) => {
        let element = document.querySelector(sel);
        console.log ('got Boom');
        return element? element.innerHTML: null;
    }, html);


    console.log (gg);

© www.soinside.com 2019 - 2024. All rights reserved.