【发布时间】:2020-02-26 04:09:30
【问题描述】:
我正在使用 puppeteer。 我需要加载多个页面并注入一个 javascript。
我正在创建两个浏览器,每个浏览器都有一个页面(选项卡)并注入了 javascript。
我有一个节点服务器,其中包含到加载的每个页面的路由。
我用“100”和“101”为每个页面命名了一个会话。运行应用程序后会创建两个 userdata 文件夹(100 和 101)。这些会话也用于分隔路由。
浏览器已正确创建,没有问题。
我的问题是当我使用路由时,节点服务器总是向两个页面返回相同的结果:
如果我使用 Postman 或其他 chrome 浏览器进行测试:
http://localhost:3007/teste100/getMyNumber
and http://localhost:3007/teste101/getMyNumber
它们返回相同的值。 但是每个浏览器页面的值都不同。 似乎没有根据请求考虑该页面,并且它向两个页面返回相同的结果。但是,正如我所说,函数“getMyNumber”应该向每个页面返回不同的值。我的示例函数使用本地存储,但我还有许多其他函数不使用本地存储,并且都有相同的问题。
请问,我做错了什么?
我怀疑我没有传递正确的浏览器页面来路由。 但是,我没有发现错误。
//server.js
const express = require('express')
const app = express()
const server = require('http').Server(app)
const port = 3001
const host = 'http://localhost'
const callbackUrl = `${host}:${port}`;
const browser_pages = {};
startUp = async (sessionId) => {
if (browser_pages[sessionId]) return browser_pages[sessionId];
let clientBrowser = require('./src/clientbrowser')({}, sessionId)
let cb = await clientBrowser.startWhats(sessionId || "user_data");
let page = cb.getPage();
browser_pages[sessionId] = cb;
const troutes = require('./src/routes/testroutes')(page)
app.use('/teste' + sessionId, troutes)
}
startUp('100');
startUp('101');
server.listen(port, () => {
console.log(`Listening on ${callbackUrl}...`);
});
//clientBrowser.js
const path = require('path');
const EventEmitter = require('events');
....
const puppeteer = require('puppeteer');
class ClientBrowser extends EventEmitter {
constructor(options, sessionId) {
super();
this.options = fUtils.mergeDefault(DefaultOptions, options);
this.app = app;
this.pPage = null;
}
getPage = () => {
return this.pPage;
}
createBrowser = async (sessionId) => {
let browser = await puppeteer.launch({
headless: false,
userDataDir: path.join(process.cwd(), sessionId || 'session'),
args: DEFAULT_CHROMIUM_ARGS,
ignoreHTTPSErrors: true,
devtools: false,
defaultViewport: null
});
return browser;
}
LoadPageWhatsApp = async (page) => {
page.setUserAgent(UserAgent);
await page.setBypassCSP(true);
await page.setViewport({
width: 800,
height: 900
})
await page.goto(WEB_WHATS_APP, {
waitUntil: 'networkidle0',
timeout: 0
})
return page;
}
initWhatsApp = async (sessionId) => {
let browser = await this.createBrowser(sessionId);
let pages = await browser.pages();
let page = pages[0];
await this.LoadPageWhatsApp(page);
return page;
}
startWhats = async (sessionId) => {
const page = await this.initWhatsApp(sessionId);
this.pPage = page;
let fpath = './web/teste.js';
//inject test script
await page.addScriptTag({ path: require.resolve(fpath) });
console.log("Injected Script:" + path.basename(fpath));
return this;
}
}
module.exports = (params, sessionId) => { return new ClientBrowser(params, sessionId)}
//testroutes.js
const express = require('express');
const router = express.Router();
const path = require('path');
module.exports = function (page) {
router.get('/getMyNumber', async (req, res) => {
const cc = await page.evaluate(() => {
return getMyNumber();
});
console.log(cc);
res.send({ "data": cc });
});
return router;
}
//teste.js
function getMyNumber() {
return localStorage.getItem('last-wid');
}
【问题讨论】: