2017-12-18 255 views
0

我使用的是操纵chrome的NodeJS模块的puppeteer。Javascript/Node.js中的嵌套类实例

它有2个功能来启动一个新的浏览器和一个新的页面。

const的浏览器=等待puppeteer.launch()和browser.newPage()

我想创建一个类来创建一个新的一页,新的浏览器。

这是我这样做的旧方式,没有类,它的工作原理,但它不允许我创建新的页面。这就是为什么我想转移到使用类。

let chrome = {} 

chrome.init = async (options) => { 
    chrome.browser = await puppeteer.launch(options) 
    chrome.page = await chrome.browser.newPage() 
} 

chrome.pageContains = async (string) => { 

    return await chrome.page.evaluate((string) => { 

     const regex = new RegExp(string, 'i') 

     return regex.test(document.querySelector('body').innerText) 

    }, string) 
} 

module.exports = chrome 

这是我的新代码,但我不知道我在做什么,这显然是错误的,并没有任何意义。

chrome.init = async (options) => { 
    return {browser: await new Chrome(options) 
} 

class Chrome { 
    async constructor(options) { 
     this.browser = await puppeteer.launch(options) 
    } 

    newPage() { 
     return await this.browser.newPage() 
    } 
} 

class Page { 
    async constructor() { 
     this.page = await chrome.browser.newPage() 
    } 

} 

那么,如何让我的旧代码使用类而不是对象工作?

回答

0

你有一些错字和构造函数不是异步的。

除此之外,您只需将正确的浏览器功能传递给Page类。您可以使用页面扩展Chrome并使用super,或将它们保持分开,但该页面在某个时刻必须可以访问浏览器。

首先,我们将启动浏览器并将其返回。等待会照顾承诺。

const puppeteer = require('puppeteer'); 

class Chrome { 
    constructor(options) { 
     this.browser = puppeteer.launch(options); 
     return this.browser; 
    } 
} 

然后我们将它传递给页面构造函数并从那里使用它。

class Page { 
    constructor(browser) { 
     this.browser = browser; 
     this.page = browser.newPage(); 
     return this.page; 
    } 

    async pageContains(string){ 
     return await this.browser.page.evaluate((string) => { 
      const regex = new RegExp(string, 'i') 
      return regex.test(document.querySelector('body').innerText) 
     }, string) 
    } 
} 

然后,我们称它们并使它们可用。并根据需要返回浏览器和页面对象。

const getChrome = async (options) => { 
    const browser = await new Chrome(options); 
    const page = await new Page(browser); 
    return { browser, page } 
} 

现在我们可以使用它们。

(async()=>{ 
    const page = (await getChrome({headless: false})).page; 
    await page.goto('http://example.com'); 
})() 

我敢肯定它可以进行重构和我写在这里是不是最好的做法,但是这将让你去。