| # Copyright 2023 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Utility functions for extracting features.""" |
| |
| import dataclasses |
| import html |
| import logging |
| import os |
| import sys |
| |
| from typing import List |
| |
| from chrome.test.variations.fixtures import features |
| from chrome.test.variations.fixtures import test_options |
| |
| from selenium import webdriver |
| from selenium.common.exceptions import NoSuchElementException |
| from selenium.webdriver.common.by import By |
| from selenium.webdriver.support import expected_conditions as EC |
| from selenium.webdriver.support.wait import WebDriverWait |
| |
| |
| from chrome.test.variations.test_utils import SRC_DIR |
| sys.path.append(os.path.join(SRC_DIR, 'tools')) |
| from variations.split_variations_cmd import ParseVariationsCmdFromString |
| |
| _GET_VERSIONS_COMMAND_URL = 'chrome://version/?show-variations-cmd' |
| |
| |
| def _extract_features_from_commandline( |
| commandline_html: str) -> features.Features: |
| # Remove flag which is not handled by split_variations_cmd. |
| text = html.unescape(commandline_html).replace( |
| '--disable-field-trial-config', '') |
| logging.info('Parsing variations command line data') |
| switches_dict = ParseVariationsCmdFromString(text) |
| return features.Features( |
| enabled=[ |
| feature.key for feature in switches_dict.get('enable-features', []) |
| ], |
| disabled=[ |
| feature.key for feature in switches_dict.get('disable-features', []) |
| ], |
| ) |
| |
| |
| |
| class DriverUtil: |
| def __init__( |
| self, driver: webdriver.Remote, test_options: test_options.TestOptions): |
| self._driver = driver |
| self._test_options = test_options |
| |
| def get_features(self) -> features.Features: |
| # Cannot use the chrome version page on webview. |
| if self._test_options.platform in ['webview', 'android_webview']: |
| logging.info('Skipping feature logging on webview') |
| return features.Features([], []) |
| logging.info('Fetching data from chrome://version/?show-variations-cmd') |
| self._driver.get(_GET_VERSIONS_COMMAND_URL) |
| WebDriverWait(self._driver, 5).until( |
| EC.presence_of_element_located((By.TAG_NAME, 'body'))) |
| try: |
| command_element = self._driver.find_element(By.ID, "variations-cmd") |
| except NoSuchElementException: |
| logging.warning( |
| 'Cannot get features: error in getting variations command') |
| return features.Features([], []) |
| command_line_text = command_element.get_attribute('innerHTML') |
| return _extract_features_from_commandline(command_line_text) |