Skip to content

Instantly share code, notes, and snippets.

@aomarks
Last active June 19, 2019 19:06
Show Gist options
  • Save aomarks/9ae43b411dc0c713d634184ea656629e to your computer and use it in GitHub Desktop.
Save aomarks/9ae43b411dc0c713d634184ea656629e to your computer and use it in GitHub Desktop.
/**
* 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