Last active
June 19, 2019 19:06
-
-
Save aomarks/9ae43b411dc0c713d634184ea656629e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 1) Install WebDriver for Node: | |
* $ npm install selenium-webdriver | |
* | |
* 2) Download the latest WebDriver plugins: | |
* http://chromedriver.chromium.org/downloads | |
* https://github.com/mozilla/geckodriver/releases | |
* https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ | |
* | |
* 3) Optionally settings block below. | |
* | |
* 4) Run the script: | |
* $ node test-webdriver-multi.js | |
*/ | |
const webdriver = require('selenium-webdriver'); | |
const path = require('path'); | |
const {performance} = require('perf_hooks'); | |
/** | |
* Settings | |
*/ | |
const browsers = ['firefox', 'chrome']; // MicrosoftEdge | |
const numTabs = 20; | |
// C:\\Program Files (x86)\\Google\\Chrome Beta\\Application\\chrome.exe | |
const chromeBinaryPath = ''; | |
const chromeLogPath = path.join(__dirname, "chromedriver.log.txt"); | |
async function buildChrome() { | |
const chrome = require('selenium-webdriver/chrome'); | |
const service = new chrome.ServiceBuilder() | |
.loggingTo(chromeLogPath) | |
.enableVerboseLogging() | |
.build(); | |
const options = new chrome.Options(); | |
if (chromeBinaryPath) { | |
options.setChromeBinaryPath(chromeBinaryPath); | |
} | |
driver = await chrome.Driver.createSession(options, service); | |
return driver; | |
} | |
async function runTest(driver) { | |
const tStart = performance.now(); | |
const firstTab = await driver.getWindowHandle(); | |
const tabTimes = []; | |
for (let i = 0; i < numTabs; i++) { | |
console.log(); | |
console.log('tab', i); | |
const tOpen = performance.now(); | |
await driver.executeScript('window.open()'); | |
const handles = await driver.getAllWindowHandles(); | |
await driver.switchTo().window(handles.filter((handle) => handle !== firstTab)[0]); | |
console.log(performance.now() - tOpen, 'open and switch to new tab'); | |
const tGet = performance.now(); | |
await driver.get('http://example.com/'); | |
console.log(performance.now() - tGet, 'get url'); | |
const tReset = performance.now(); | |
await driver.close(); | |
await driver.switchTo().window(firstTab); | |
console.log(performance.now() - tReset, 'close new tab and switch back to first tab'); | |
const tabTime = performance.now() - tOpen; | |
tabTimes.push(tabTime); | |
console.log(tabTime, `tab ${i} total`); | |
} | |
const tClose = performance.now(); | |
await driver.close(); | |
console.log(); | |
console.log(performance.now() - tClose, 'close first tab'); | |
console.log(); | |
const totalTime = performance.now() - tStart; | |
const avgTabTime = tabTimes.reduce((a, c) => a + c) / tabTimes.length; | |
return {totalTime, avgTabTime}; | |
} | |
async function main() { | |
const results = []; | |
for (const browser of browsers) { | |
console.log('==============='); | |
console.log(browser); | |
console.log('==============='); | |
console.log(); | |
const tBuild = performance.now(); | |
let driver; | |
if (browser === 'chrome') { | |
driver = await buildChrome(); | |
} else { | |
driver = await new webdriver.Builder().forBrowser(browser).build(); | |
} | |
console.log(performance.now() - tBuild, 'build driver'); | |
results.push({ | |
browser, | |
...await runTest(driver), | |
}); | |
} | |
results.sort((a, b) => a.avgTabTime - b.avgTabTime); | |
for (let i = 0; i < results.length; i++) { | |
const {browser, avgTabTime, totalTime} = results[i]; | |
console.log(browser) | |
console.log(` ${avgTabTime.toFixed(2)} ms avg time per tab`); | |
if (i !== 0) { | |
const slowdown = avgTabTime / results[0].avgTabTime; | |
console.log(` = ${slowdown.toFixed(2)}x slower than ${results[0].browser}`); | |
} | |
console.log(` ${totalTime.toFixed(2)} ms total time`, | |
i !== 0 ? (totalTime / results[0].totalTime).toFixed(2) : ''); | |
if (i !== 0) { | |
const slowdown = totalTime / results[0].totalTime; | |
console.log(` = ${slowdown.toFixed(2)}x slower than ${results[0].browser}`); | |
} | |
console.log(); | |
} | |
} | |
main(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment