Skip to content

Instantly share code, notes, and snippets.

@aomarks
Last active June 18, 2019 21:42
Show Gist options
  • Save aomarks/48308c009eb72d4c8b0dd8506374f02d to your computer and use it in GitHub Desktop.
Save aomarks/48308c009eb72d4c8b0dd8506374f02d to your computer and use it in GitHub Desktop.
Repro script for Chrome Windows WebDriver performance issue
/**
* This Node script is to demonstrate an issue whereby WebDriver for
* Chrome on Windows runs very slowly -- significantly slower than both
* Chrome on macOS and Firefox on Windows.
*
* Results:
*
* macOS Mojave / Chrome 76: 2,806 ms
* macOS Mojave / Firefox 67: 3,504 ms
* Windows 10 / Firefox 67: 2,380 ms
* Windows 10 / Chrome 75: 21,620 ms
* Windows 10 / Chrome 76: 19,626 ms
*
* Note that most of the time in Windows / Chrome cases is spent in the call
* to `await driver.get('http://example.com');`, which each take ~4 seconds.
*
* Repro instructions:
*
* 1) Install WebDriver for Node:
* $ npm install selenium-webdriver
*
* 2) Download the latest WebDriver plugin for Chrome and Firefox:
* http://chromedriver.chromium.org/downloads
* https://github.com/mozilla/geckodriver/releases
*
* 3) Test on Chrome:
* $ node test-webdriver.js chrome
*
* 4) Test on Firefox:
* $ node test-webdriver.js firefox
*
* System details:
*
* Windows 10 Home, 64-bit, Version 1903, OS build 18362.175
*
* Chrome 75.0.3770.100
* ChromeDriver 75.0.3770.90
*
* Chrome 76.0.3809.25
* ChromeDriver 76.0.3809.25
*
* Firefox 67.0.2
* geckodriver 0.24.0
*
* macOS Mojave 10.14.5
*
* Chrome 76.0.3809.25
* ChromeDriver 76.0.3809.25
*
* Firefox 67.0.3
* geckodriver 0.24.0
*/
const webdriver = require('selenium-webdriver');
const {performance} = require('perf_hooks');
const browser = process.argv[2] || 'chrome';
const numTabs = Number(process.argv[3] || 3);
async function main() {
const tBuild = performance.now();
const driver = await new webdriver.Builder()
.forBrowser(process.argv[2] || 'chrome')
.build();
console.log(performance.now() - tBuild, 'build driver');
console.log();
const firstTab = await driver.getWindowHandle();
for (let i = 0; i < numTabs; i++) {
console.log('tab', i);
const tOpen = performance.now();
await driver.executeScript('window.open()');
console.log(performance.now() - tOpen, 'window.open() for new tab');
const tSwitchNew = performance.now();
const handles = await driver.getAllWindowHandles();
await driver.switchTo().window(handles[1]);
console.log(performance.now() - tSwitchNew, 'switch to new tab');
const tGet = performance.now();
await driver.get('http://example.com/');
console.log(performance.now() - tGet, 'get url');
const tScript = performance.now();
const r = await driver.executeScript('return 1 + 1;');
console.log(performance.now() - tScript, '1 + 1 =', r);
const tClose = performance.now();
await driver.close();
console.log(performance.now() - tClose, 'close new tab');
const tSwitchBack = performance.now();
await driver.switchTo().window(firstTab);
console.log(performance.now() - tSwitchBack, 'switch back to first tab');
console.log(performance.now() - tOpen, `(total tab ${i})`);
console.log();
}
const tClose = performance.now();
await driver.close();
console.log(performance.now() - tClose, 'close first tab');
console.log();
console.log(performance.now() - tBuild, '(total)');
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment