Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将木偶师任务整合为一个任务_Javascript_Node.js_Puppeteer - Fatal编程技术网

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.

我创建了几个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.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,我怀疑其中是否有访问修饰符。