blob: 747583ce3176650165a7000c309e3795873aa4a6 [file] [log] [blame]
# Copyright 2022 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import browserbench
import time
import logging
from selenium.webdriver.support.ui import WebDriverWait
class Speedometer(browserbench.BrowserBench):
def __init__(self):
super(Speedometer, self).__init__('speedometer', '2.1')
def AddExtraParserOptions(self, parser):
pass
def UpdateParseArgs(self, optargs):
pass
def RunAndExtractMeasurements(self, driver, optargs):
URL = 'https://browserbench.org/Speedometer2.1/'
driver.get(URL)
# Wait a short amount of time for the system to settle down before starting.
time.sleep(2)
WebDriverWait(driver, timeout=60).until(
lambda driver: driver.execute_script('''return Suites !== undefined &&
window.benchmarkClient !== undefined'''))
logging.info('Page should be ready, test count=%s' %
driver.execute_script('return Suites.length;'))
driver.execute_script('startTest();')
finished = False
# This gives 3 minutes for the test to run before stopping. Generally the
# test takes less than a minute, so this should be plenty of time.
for i in range(3):
time.sleep(60)
logging.info('Checking if done')
stepCount = driver.execute_script('''
return benchmarkClient.stepCount !== undefined ?
benchmarkClient.stepCount : -1''')
finishedTestCount = driver.execute_script('''
return benchmarkClient.stepCount !== undefined ?
benchmarkClient._finishedTestCount : -1''')
logging.info('Checking if done, stepCount %s finishedTestCount %s' %
(stepCount, finishedTestCount))
if stepCount != -1 and stepCount == finishedTestCount:
finished = True
break
if not finished:
logging.info('Test did not complete in time, restarting')
raise RuntimeError('Test did not complete in time')
logging.info('Test done, extracting measurements')
results = driver.execute_script('''
return benchmarkClient._computeResults(
benchmarkClient._measuredValuesList,
benchmarkClient.displayUnit);''')
measurements = {
'score': {
'value': 'score',
'measurement': results['mean'],
}
}
return measurements
def main():
Speedometer().Run()
if __name__ == '__main__':
main()