Last active
June 18, 2019 21:42
-
-
Save aomarks/48308c009eb72d4c8b0dd8506374f02d to your computer and use it in GitHub Desktop.
Repro script for Chrome Windows WebDriver performance issue
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
/** | |
* 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