This commit is contained in:
spiduler
2020-10-25 11:27:51 +09:00
parent aded3dadc4
commit 1c96201d46
2 changed files with 79 additions and 69 deletions

View File

@@ -1,77 +1,15 @@
const logger = require("logops")
, config = require('../../config')
, { Builder, Capabilities, By, Key, until } = require('selenium-webdriver')
, { By, until } = require('selenium-webdriver')
, url = require('url')
, poolingService = require('../service/PoolingService')
, fetch = require('node-fetch')
, pool = require('generic-pool')
, { Options } = require('selenium-webdriver/chrome');
class SeleniumBrowser {
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.sleep = m => new Promise(r => setTimeout(r, m))
this.createPool()
}
createPool() {
this.pool = pool.createPool({
create: () => {
logger.info('Create new driver instance')
return this.getDriver();
},
destroy: (driver) => {
logger.info('Quitting driver')
return driver.quit().catch(err => {
logger.debug({ message: err.message }, 'Quitting error')
this.pool.release(driver)
})
},
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: 10, min: 1, testOnBorrow: true
});
this.pool.on('factoryCreateError', function (err) {
logger.error({ message: err.message }, 'pool error')
})
this.pool.on('factoryDestroyError', function (err) {
logger.error({ message: err.message }, 'pool error')
})
setInterval(() => {
logger.debug({
spare: this.pool.spareResourceCapacity,
size: this.pool.size,
available: this.pool.available,
borrowed: this.pool.borrowed,
pending: this.pool.pending
}, 'Pool info')
}, 1000 * 60 * 5)
}
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();
this.pool = poolingService.pool
}
async request(params) {
@@ -161,5 +99,4 @@ class SeleniumBrowser {
}
}
const browser = new SeleniumBrowser
module.exports = browser
module.exports = new SeleniumBrowser

View File

@@ -0,0 +1,73 @@
const logger = require("logops")
, config = require('../../config')
, { Builder, Capabilities } = require('selenium-webdriver')
, pool = require('generic-pool')
, { Options } = require('selenium-webdriver/chrome');
class PoolingService {
constructor() {
this.config = {
pool: { max: 10, min: 1, testOnBorrow: true },
browser: 'chrome',
browserArgs: ['--no-sandbox', '--headless', '--disable-dev-shm-usage', '--proxy-server=spiduler-tor:8118']
}
this.pool = this.createPool()
}
createPool() {
setInterval(() => this.debugPoolStatus(), 1000 * 60 * 5)
return pool.createPool({
create: () => this.create(),
destroy: (driver) => this.destroy(driver),
validate: (driver) => this.validate(driver)
}, this.config.pool);
}
create() {
logger.info('Create new driver instance')
return this.getDriver();
}
destroy(driver) {
logger.info('Quitting driver')
return driver.quit().catch(err => {
logger.debug({ message: err.message }, 'Quitting error')
this.pool.release(driver)
})
}
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
})
}
getDriver() {
let opts = new Options;
let capabilities = Capabilities.chrome()
opts.addArguments(this.config.browserArgs)
return new Builder()
.usingServer('http://spiduler-chrome:4444/wd/hub')
.withCapabilities(capabilities)
.forBrowser(this.config.browser)
.setChromeOptions(opts)
.build();
}
debugPoolStatus() {
logger.debug({
spare: this.pool.spareResourceCapacity,
size: this.pool.size,
available: this.pool.available,
borrowed: this.pool.borrowed,
pending: this.pool.pending
}, 'Pool status')
}
}
module.exports = new PoolingService