Javascript 将木偶师任务整合为一个任务
我创建了几个javascript文件,如下所示:Javascript 将木偶师任务整合为一个任务,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我创建了几个javascript文件,如下所示: const somedata = "" const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const pages = await browser.pages(); const page = pages[0]; await page.goto('https://somewebsite.
const somedata = ""
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const pages = await browser.pages();
const page = pages[0];
await page.goto('https://somewebsite.com');
///Do some task
browser.close();
})();
// myPuppeteerTask.ts
export class MyPuppeteerTask {
// Inject the BrowserService into the task.
public constructor(private browserService: BrowserService) { }
public async execTask(): Promise<void> {
const page = await this.browserService.getPage();
await page.goto('https://somewebsite.com');
///Do some task
this.browserService.closePage(page);
}
}
我设法使用每个单独的文件执行单个操作。现在,我只想创建一个浏览器实例,并执行这些文件中指定的任务。我想在每个任务中传递一些数据。同时,每次只能打开五页
我正在使用Puppeter和NodeJS。您可以创建一个
浏览器服务
,它是一个单例并封装页面创建和删除:
// BrowserService.ts
export class BrowserService {
public static instance: BrowserService | null = null;
public static async getInstance(): Promise<BrowserService> {
if (this.instance == null) {
this.instance = new BrowserService();
await this.instance.initialise();
}
return this.instance;
}
private browser: PuppeteerBrowser;
private numberPages: number = 0;
private constructor() { }
/**
* Get a browser page.
*/
public async getPage(): Promise<PuppeteerPage> {
// Handle the logic of page creation and limit the number of created pages.
// ...
const page = (await this.browser.pages())[0];
// ...
return page;
}
/**
* Close a page.
*/
public async closePage(page: PuppeteerPage): Promise<void> {
// Handle the logic of page deletion and browser closing.
// ...
if(this.numberPages === 0) {
await this.browser.close();
BrowserService.instance = null;
}
// ...
}
/**
* Initialise the instance.
*/
public async initialise(): Promise<void> {
this.browser = puppeteer.launch();
}
}
browservice
是手工创建的单例服务,但是您可以使用依赖项注入(例如使用NestJs或Awilix)来改进此体系结构。您可以获得更好的可维护性、可读性和可测试性
它看起来是这样的:
const somedata = ""
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const pages = await browser.pages();
const page = pages[0];
await page.goto('https://somewebsite.com');
///Do some task
browser.close();
})();
// myPuppeteerTask.ts
export class MyPuppeteerTask {
// Inject the BrowserService into the task.
public constructor(private browserService: BrowserService) { }
public async execTask(): Promise<void> {
const page = await this.browserService.getPage();
await page.goto('https://somewebsite.com');
///Do some task
this.browserService.closePage(page);
}
}
//mypuppetertask.ts
导出类MyPuppeterTask{
//将BrowserService注入到任务中。
公共构造函数(私有browserService:browserService){}
public async execTask():承诺{
const page=等待这个.browservice.getPage();
等待页面。转到('https://somewebsite.com');
///做一些工作
此.browserService.closePage(第页);
}
}
您可以创建一个单独的浏览器服务
,并封装页面创建和删除:
// BrowserService.ts
export class BrowserService {
public static instance: BrowserService | null = null;
public static async getInstance(): Promise<BrowserService> {
if (this.instance == null) {
this.instance = new BrowserService();
await this.instance.initialise();
}
return this.instance;
}
private browser: PuppeteerBrowser;
private numberPages: number = 0;
private constructor() { }
/**
* Get a browser page.
*/
public async getPage(): Promise<PuppeteerPage> {
// Handle the logic of page creation and limit the number of created pages.
// ...
const page = (await this.browser.pages())[0];
// ...
return page;
}
/**
* Close a page.
*/
public async closePage(page: PuppeteerPage): Promise<void> {
// Handle the logic of page deletion and browser closing.
// ...
if(this.numberPages === 0) {
await this.browser.close();
BrowserService.instance = null;
}
// ...
}
/**
* Initialise the instance.
*/
public async initialise(): Promise<void> {
this.browser = puppeteer.launch();
}
}
browservice
是手工创建的单例服务,但是您可以使用依赖项注入(例如使用NestJs或Awilix)来改进此体系结构。您可以获得更好的可维护性、可读性和可测试性
它看起来是这样的:
const somedata = ""
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const pages = await browser.pages();
const page = pages[0];
await page.goto('https://somewebsite.com');
///Do some task
browser.close();
})();
// myPuppeteerTask.ts
export class MyPuppeteerTask {
// Inject the BrowserService into the task.
public constructor(private browserService: BrowserService) { }
public async execTask(): Promise<void> {
const page = await this.browserService.getPage();
await page.goto('https://somewebsite.com');
///Do some task
this.browserService.closePage(page);
}
}
//mypuppetertask.ts
导出类MyPuppeterTask{
//将BrowserService注入到任务中。
公共构造函数(私有browserService:browserService){}
public async execTask():承诺{
const page=等待这个.browservice.getPage();
等待页面。转到('https://somewebsite.com');
///做一些工作
此.browserService.closePage(第页);
}
}
问题是,我已经分别创建了每个函数,但它们每次都会创建新的浏览器实例。我只想把这些单独的函数整合成一个。我还发现了木偶师集群,它看起来很有前途,但对我来说有点复杂。我还发现了codeceptJS,但为此我必须从头开始编写整个程序。你认为我提供的解决方案会有什么问题?我使用的是javascript,我怀疑其中是否有访问修饰符。问题是我已经分别创建了每个函数,但它们每次都会创建新的浏览器实例。我只想把这些单独的函数整合成一个。我还发现了木偶师集群,它看起来很有前途,但对我来说有点复杂。我还发现了codeceptJS,但为此我必须从头开始编写整个程序。你认为我提供的解决方案会有什么问题?我使用的是javascript,我怀疑其中是否有访问修饰符。