From aa4d573fb1af2009eaee4a535a41f6c41dcfe0d9 Mon Sep 17 00:00:00 2001 From: spiduler Date: Fri, 23 Oct 2020 11:05:36 +0900 Subject: [PATCH] ewrewr --- src/component/SeleniumBrowser.js | 42 +++++++++++++---------- test.js | 59 ++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 18 deletions(-) create mode 100644 test.js diff --git a/src/component/SeleniumBrowser.js b/src/component/SeleniumBrowser.js index a39205f..8c3f995 100644 --- a/src/component/SeleniumBrowser.js +++ b/src/component/SeleniumBrowser.js @@ -16,31 +16,41 @@ class SeleniumBrowser { this.sleep = m => new Promise(r => setTimeout(r, m)) this.pool = pool.createPool({ create: () => { + logger.info('Create new driver instance') return this.getDriver(); }, - destroy: function (driver) { - driver.close() - driver.quit() + destroy: (driver) => { + logger.info('Quitting driver') + return driver.quit() + }, + validate: (driver) => { + return driver.getSession().then(s => { + logger.info('Driver session validation checked (id: %s)', s.getId()) + return true + }).catch(err => { + this.pool.destroy(driver) + logger.debug({ message: err.message }, 'Driver session expired and destroy it') + return false + }) } }, { - max: 20, min: 1, evictionRunIntervalMillis: 1000 * 10, - acquireTimeoutMillis: 1000 * 5, - fifo: false, - softIdleTimeoutMillis: 1000 * 5 + max: 100, min: 1 }); this.pool.on('factoryCreateError', function (err) { - logger.error(err.message, 'pool error') + logger.error({ message: err.message }, 'pool error') }) this.pool.on('factoryDestroyError', function (err) { - logger.error(err.message, 'pool error') + logger.error({ message: err.message }, 'pool error') }) - this.pool.use(async driver => { - let session = await driver.getSession() - return session && session.getId() ? driver : this.getDriver() - }).then(/* a promise that will run after myTask resolves */) + this.pool.use(driver => { + return driver.getSession().then(s => driver).catch(err => { + this.pool.destroy(driver) + throw new Error('Driver session expired pool should create new instance') + }) + }) } getDriver() { @@ -59,16 +69,12 @@ class SeleniumBrowser { logger.info('URL %s', uri) if (uri.indexOf('://') > 3) { return this.pool.acquire() - // return this.getDriver() .then(async driver => { let html = await driver.get(uri) .then(() => driver.findElement(By.css('body'))) .then(body => body.getAttribute('innerHTML')) let htmlPromise = this.isCaptchaPage(html) ? this.resolveCaptcha(driver) : this.getHtml(driver, html, params) - html = await htmlPromise - driver.close() - driver.quit() - this.pool.destroy(driver) + html = await htmlPromise return html }) } else { diff --git a/test.js b/test.js new file mode 100644 index 0000000..8d9ca6f --- /dev/null +++ b/test.js @@ -0,0 +1,59 @@ +const logger = require("logops") + , { Builder, Capabilities, By, Key, until } = require('selenium-webdriver') + , url = require('url') + , fetch = require('node-fetch') + , pool = require('generic-pool') + , { Options } = require('selenium-webdriver/chrome'); + + + + +class Test { + + constructor() { + this.config = { + useHub: true, browser: 'chrome', + browserArgs: ['--no-sandbox', '--headless', '--disable-dev-shm-usage', '--proxy-server=spiduler-tor:8118'] + } + this.capabilities = Capabilities.chrome() + + this.getDriver().then(driver => { + driver.get('https://www.naver.com/') + .then(() => driver.findElement(By.css('body'))) + .then(body => body.getAttribute('innerHTML')) + driver.getSession().then(s => { + let id = s.getId() + console.log(id) + // driver.close() + // driver.quit() + driver.get('https://www.naver.com/') + .then(() => driver.findElement(By.css('body'))) + .then(body => body.getAttribute('innerHTML')) + .finally(() => { + // driver.close().then(a => console.log(a)) + driver.quit().then(q => console.log(q)) + }) + // driver.quit() + return '' + }).catch(err => { + console.log(err.message) + }) + }) + + + } + + async getDriver() { + let opts = new Options; + opts.addArguments(this.config.browserArgs) + return new Builder() + .usingServer('http://spiduler-chrome:4444/wd/hub') + .withCapabilities(this.capabilities) + .forBrowser(this.config.browser) + .setChromeOptions(opts) + .build(); + } +} + +const test = new Test +