fix: avoid override of puppeteer browser

This commit is contained in:
Clark Du 2018-03-19 16:29:44 +08:00
parent be4adbd366
commit dde616fbdb
No known key found for this signature in database
GPG Key ID: D0E5986AF78B86D9
3 changed files with 79 additions and 77 deletions

View File

@ -1,8 +1,9 @@
import { Nuxt } from '../..' import { Nuxt } from '..'
import { loadFixture, getPort } from '../utils' import Browser from './utils/browser'
import * as browser from '../utils/browser' import { loadFixture, getPort } from './utils'
let port let port
const browser = new Browser()
const url = route => 'http://localhost:' + port + route const url = route => 'http://localhost:' + port + route
let nuxt = null let nuxt = null

View File

@ -1,8 +1,9 @@
import { Nuxt, Utils } from '../..' import { Nuxt, Utils } from '..'
import * as browser from '../utils/browser' import Browser from './utils/browser'
import { loadFixture, getPort } from '../utils' import { loadFixture, getPort } from './utils'
let port let port
const browser = new Browser()
const url = route => 'http://localhost:' + port + route const url = route => 'http://localhost:' + port + route
let nuxt = null let nuxt = null

View File

@ -1,76 +1,76 @@
import puppeteer from 'puppeteer' import puppeteer from 'puppeteer'
let browser = null export default class Browser {
async start(options = {}) {
export async function start(options = {}) { // https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions
// https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions this.browser = await puppeteer.launch(
browser = await puppeteer.launch( Object.assign(
Object.assign( {
{ args: ['--no-sandbox', '--disable-setuid-sandbox']
args: ['--no-sandbox', '--disable-setuid-sandbox'] },
}, options
options
)
)
}
export async function close() {
if (!browser) return
await browser.close()
}
export async function page(url) {
if (!browser) throw new Error('Please call start() before page(url)')
const page = await browser.newPage()
await page.goto(url)
await page.waitForFunction('!!window.$nuxt')
page.html = () =>
page.evaluate(() => window.document.documentElement.outerHTML)
page.$text = selector => page.$eval(selector, el => el.textContent)
page.$$text = selector =>
page.$$eval(selector, els => els.map(el => el.textContent))
page.$attr = (selector, attr) =>
page.$eval(selector, (el, attr) => el.getAttribute(attr), attr)
page.$$attr = (selector, attr) =>
page.$$eval(
selector,
(els, attr) => els.map(el => el.getAttribute(attr)),
attr
)
page.$nuxt = await page.evaluateHandle('window.$nuxt')
page.nuxt = {
async navigate(path, waitEnd = true) {
const hook = page.evaluate(() => {
return new Promise(resolve =>
window.$nuxt.$once('routeChanged', resolve)
).then(() => new Promise(resolve => setTimeout(resolve, 50)))
})
await page.evaluate(
($nuxt, path) => $nuxt.$router.push(path),
page.$nuxt,
path
) )
if (waitEnd) await hook )
return { hook } }
},
routeData() { async close() {
return page.evaluate($nuxt => { if (!this.browser) return
return { await this.browser.close()
path: $nuxt.$route.path, }
query: $nuxt.$route.query
} async page(url) {
}, page.$nuxt) if (!this.browser) throw new Error('Please call start() before page(url)')
}, const page = await this.browser.newPage()
loadingData() { await page.goto(url)
return page.evaluate($nuxt => $nuxt.$loading.$data, page.$nuxt) await page.waitForFunction('!!window.$nuxt')
}, page.html = () =>
errorData() { page.evaluate(() => window.document.documentElement.outerHTML)
return page.evaluate($nuxt => $nuxt.nuxt.err, page.$nuxt) page.$text = selector => page.$eval(selector, el => el.textContent)
}, page.$$text = selector =>
storeState() { page.$$eval(selector, els => els.map(el => el.textContent))
return page.evaluate($nuxt => $nuxt.$store.state, page.$nuxt) page.$attr = (selector, attr) =>
} page.$eval(selector, (el, attr) => el.getAttribute(attr), attr)
page.$$attr = (selector, attr) =>
page.$$eval(
selector,
(els, attr) => els.map(el => el.getAttribute(attr)),
attr
)
page.$nuxt = await page.evaluateHandle('window.$nuxt')
page.nuxt = {
async navigate(path, waitEnd = true) {
const hook = page.evaluate(() => {
return new Promise(resolve =>
window.$nuxt.$once('routeChanged', resolve)
).then(() => new Promise(resolve => setTimeout(resolve, 50)))
})
await page.evaluate(
($nuxt, path) => $nuxt.$router.push(path),
page.$nuxt,
path
)
if (waitEnd) await hook
return { hook }
},
routeData() {
return page.evaluate($nuxt => {
return {
path: $nuxt.$route.path,
query: $nuxt.$route.query
}
}, page.$nuxt)
},
loadingData() {
return page.evaluate($nuxt => $nuxt.$loading.$data, page.$nuxt)
},
errorData() {
return page.evaluate($nuxt => $nuxt.nuxt.err, page.$nuxt)
},
storeState() {
return page.evaluate($nuxt => $nuxt.$store.state, page.$nuxt)
}
}
return page
} }
return page
} }