From 21871140c8c7bdafc559d6b140ee707b77ba4d51 Mon Sep 17 00:00:00 2001 From: Huan LI Date: Thu, 24 Aug 2017 01:11:14 +0800 Subject: [PATCH] fix(open) re-init web driver with right order --- src/puppet-web/browser.ts | 126 ++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 72 deletions(-) diff --git a/src/puppet-web/browser.ts b/src/puppet-web/browser.ts index 885363cb..fa34a1de 100644 --- a/src/puppet-web/browser.ts +++ b/src/puppet-web/browser.ts @@ -17,6 +17,8 @@ * */ import { EventEmitter } from 'events' +import { promisify } from 'util' + const psTree = require('ps-tree') const retryPromise = require('retry-promise').default // https://github.com/olalonde/retry-promise import { StateSwitch } from 'state-switch' @@ -131,7 +133,7 @@ export class Browser extends EventEmitter { } public async open(url?: string): Promise { - log.verbose('PuppetWebBrowser', `open(${url})`) + log.verbose('PuppetWebBrowser', 'open(%s)', url) if (!url) { const hostname = this.cookie.hostname() @@ -150,48 +152,43 @@ export class Browser extends EventEmitter { while (ttl--) { log.verbose('PuppetWebBrowser', 'open() begin for ttl:%d', ttl) try { - await new Promise(async (resolve, reject) => { - - const timer = setTimeout(async _ => { - try { - await this.driver.close() - await this.driver.quit() - await this.driver.init() - log.verbose('PuppetWebBrowser', 'open() driver.{close,quit,init}() done') - } catch (e) { - log.warn('PuppetWebBrowser', 'open() timeout, close driver exception: %s', - e.message, - ) - } + await new Promise(async (resolve, reject) => { + const timer = setTimeout(_ => { const e = new Error('timeout after ' + Math.round(TIMEOUT / 1000) + ' seconds' + 'at ttl:' + ttl, ) - reject(e) + return reject(e) }, TIMEOUT) try { await this.driver.get(openUrl) - resolve() + // open successful! + log.verbose('PuppetWebBrowser', 'open(%s) end at ttl:%d', openUrl, ttl) + return resolve() + } catch (e) { - reject(e) + return reject(e) + } finally { clearTimeout(timer) } }) - // open successful! - log.verbose('PuppetWebBrowser', 'open() end at ttl:%d', ttl) - return - } catch (e) { log.error('PuppetWebBrowser', 'open() exception: %s', e.message) + + await this.driver.close() + await this.driver.quit() + await this.driver.init() + log.verbose('PuppetWebBrowser', 'open() driver.{close,quit,init}() done') } } + await this.driver.close() + await this.driver.quit() throw new Error('open fail because ttl expired') - } public async refresh(): Promise { @@ -315,64 +312,49 @@ export class Browser extends EventEmitter { }) } - public getBrowserPidList(): Promise { + public async getBrowserPidList(): Promise { log.verbose('PuppetWebBrowser', 'getBrowserPidList()') const head = this.setting.head - return new Promise((resolve, reject) => { - /** - * Reject - */ - const timer = setTimeout(() => { - const e = new Error('clean() psTree() timeout.') - log.error('PuppetWebBrowser', e.message) - reject(e) - }, 10 * 1000) - - psTree(process.pid, (err, children) => { - if (err) { - log.error('PuppetWebBrowser', 'getBrowserPidList() %s', err.message || err) - reject(err) - return - } - let browserRe - - switch (head) { - case 'phantomjs': - browserRe = 'phantomjs' - break - - case 'chrome': - case 'chrome-headless': - browserRe = 'chrome(?!driver)|chromium' - break - - default: - const e = new Error('unsupported head: ' + head) - log.warn('PuppetWebBrowser', 'getBrowserPids() for %s', e.message) - throw e + try { + const children = await promisify(psTree)(process.pid) + + let regexText: string + + switch (head) { + case 'phantomjs': + regexText = 'phantomjs' + break + + case 'chrome': + case 'chrome-headless': + regexText = 'chrome(?!driver)|chromium' + break + + default: + const e = new Error('unsupported head: ' + head) + log.warn('PuppetWebBrowser', 'getBrowserPids() for %s', e.message) + throw e + } + + const matchRegex = new RegExp(regexText, 'i') + const pids: number[] = children.filter(child => { + // https://github.com/indexzero/ps-tree/issues/18 + if (matchRegex.test('' + child.COMMAND + child.COMM)) { + log.silly('PuppetWebBrowser', 'getBrowserPids() child: %s', JSON.stringify(child)) + return true } + return false - const matchRegex = new RegExp(browserRe, 'i') - const pids: number[] = children.filter(child => { - // https://github.com/indexzero/ps-tree/issues/18 - if (matchRegex.test('' + child.COMMAND + child.COMM)) { - log.silly('PuppetWebBrowser', 'getBrowserPids() child: %s', JSON.stringify(child)) - return true - } - return false + }).map(child => child.PID) - }).map(child => child.PID) + return pids - /** - * Resolve - */ - clearTimeout(timer) - resolve(pids) - return - }) - }) + } catch (e) { + log.error('PuppetWebBrowser', 'getBrowserPidList() exception: %s', e.message || e) + throw e + } } public async execute(script, ...args): Promise { -- GitLab