2017-12-18 143 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'); 
})() 

我敢肯定它可以進行重構和我寫在這裏是不是最好的做法,但是這將讓你去。