# 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()