blob: a043d693054bd1ab785ce49358653e87335d488f [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
from selenium.webdriver.support.ui import WebDriverWait
class MotionMark(browserbench.BrowserBench):
def __init__(self):
super(MotionMark, self).__init__('motionmark', '1.2')
def AddExtraParserOptions(self, parser):
parser.add_option('-s',
'--suite',
dest='suite',
help='Run only the specified suite of tests.')
def UpdateParseArgs(self, optargs):
optargs.suite = optargs.suite or 'MotionMark'
def RunAndExtractMeasurements(self, driver, optargs):
suite = optargs.suite
URL = 'https://browserbench.org/MotionMark1.2/'
driver.get(URL + 'developer.html')
WebDriverWait(driver, timeout=0).until(lambda driver: driver.execute_script(
'''return document.querySelector("tree > li") !== undefined'''))
counter = driver.execute_script('''function Select(benchmark) {
const list = document.querySelectorAll('.tree > li');
let counter = 0;
for (const row of list) {
const name = row.querySelector('label.tree-label').textContent;
const checked = name.trim() === benchmark;
const labels = row.querySelectorAll('input[type=checkbox]');
for (const label of labels) {
label.checked = checked;
if (checked) { ++counter; }
}
}
return counter - 2; // Each suite has two extra checkboxes. *shrug*
} return Select("%s");''' % (suite))
time.sleep(2)
if counter <= 0:
return {
'error': 'No tests found to run for %s' % suite,
}
driver.execute_script('window.benchmarkController.startBenchmark()')
print('Running %d tests.' % counter)
time.sleep(40 * counter) # Each test takes approximately 40 seconds.
while True:
results = driver.execute_script(
'''return window.benchmarkRunnerClient.results._results ?
window.benchmarkRunnerClient.results.results[0] :
undefined''')
if results: break
print('Test still running? Trying again in a few seconds.')
time.sleep(10)
def _extractScore(results):
return [{
'value': 'score',
'measurement': results['score']
}, {
'value': 'min',
'measurement': results['scoreLowerBound'],
}, {
'value': 'max',
'measurement': results['scoreUpperBound'],
}]
measurements = {'score': _extractScore(results)}
for suite in results['testsResults']:
for test in results['testsResults'][suite]:
s = results['testsResults'][suite][test]
measurements[test] = _extractScore(s)
return measurements
def main():
MotionMark().Run()
if __name__ == '__main__':
main()