def MeasureMemory(self, deterministic_mode=False): """Add a memory measurement to the trace being recorded. Behaves as a no-op if tracing is not enabled. TODO(perezju): Also behave as a no-op if tracing is enabled but memory-infra is not. Args: deterministic_mode: A boolean indicating whether to attempt or not to control the environment (force GCs, clear caches) before making the measurement in an attempt to obtain more deterministic results. Returns: GUID of the generated dump if one was triggered, None otherwise. """ if not self.tab.browser.platform.tracing_controller.is_tracing_running: logging.warning( 'Tracing is off. No memory dumps are being recorded.') return None if deterministic_mode: self.Wait(_MEMORY_DUMP_WAIT_TIME) self.ForceGarbageCollection() dump_id = self.tab.browser.DumpMemory() if not dump_id: raise exceptions.StoryActionError('Unable to obtain memory dump') return dump_id
def _Scroll(self, action_runner, distance, step_size): """ This function scrolls the webpage by the given scroll distance in multiple steps, where each step (except the last one) has the given size. If scrolling gets stuck, the functions retries scrolling MAX_SCROLL_RETRIES times waiting TIME_BEFORE_SCROLL_RETRY_IN_SECONDS seconds between retries. """ remaining = distance - action_runner.EvaluateJavaScript( 'window.scrollY') retry_count = 0 # Scroll until the window.scrollY is within 1 pixel of the target distance. while remaining > 1: action_runner.ScrollPage(distance=min(remaining, step_size) + 1) new_remaining = ( distance - action_runner.EvaluateJavaScript('window.scrollY')) if remaining <= new_remaining: # Scrolling is stuck. This can happen if the page is loading # resources. Give the page some time and retry scrolling. if retry_count == self.MAX_SCROLL_RETRIES: raise exceptions.StoryActionError('Scrolling stuck at %d' % remaining) retry_count += 1 action_runner.Wait(self.TIME_BEFORE_SCROLL_RETRY_IN_SECONDS) else: retry_count = 0 remaining = new_remaining
def __init__(self, inspector_socket, timeout): self._websocket = inspector_socket self._websocket.RegisterDomain('ServiceWorker', self._OnNotification) # ServiceWorker.enable RPC must be called before calling any other methods # in ServiceWorker domain. res = self._websocket.SyncRequest({'method': 'ServiceWorker.enable'}, timeout) if 'error' in res: raise exceptions.StoryActionError(res['error']['message'])
def StopAllWorkers(self, timeout): res = self._websocket.SyncRequest( {'method': 'ServiceWorker.stopAllWorkers'}, timeout) if 'error' in res: code = res['error']['code'] if code == inspector_websocket.InspectorWebsocket.METHOD_NOT_FOUND_CODE: raise NotImplementedError( 'DevTools method ServiceWorker.stopAllWorkers is not supported by ' 'this browser.') raise exceptions.StoryActionError(res['error']['message'])
def ClearDataForOrigin(self, url, timeout): res = self._websocket.SyncRequest( { 'method': 'Storage.clearDataForOrigin', 'params': { 'origin': url, 'storageTypes': 'all', } }, timeout) if 'error' in res: raise exceptions.StoryActionError(res['error']['message'])
def ClearDataForOrigin(self, url, timeout=DEFAULT_TAB_TIMEOUT): """Clears storage data for the origin of url. With assigning 'all' to params.storageTypes, Storage.clearDataForOrigin clears all storage of app cache, cookies, file systems, indexed db, local storage, shader cache, web sql, service workers and cache storage. See StorageHandler::ClearDataForOrigin() for more details. Raises: exceptions.StoryActionError """ res = self._inspector_backend._websocket.SyncRequest( { 'method': 'Storage.clearDataForOrigin', 'params': { 'origin': url, 'storageTypes': 'all' } }, timeout) if 'error' in res: raise exceptions.StoryActionError(res['error']['message'])
def ExitOverviewMode(self): if not self._tab.browser.supports_overview_mode: raise exceptions.StoryActionError('Overview mode is not supported') self._tab.browser.ExitOverviewMode()
def ExitOverviewMode(self, timeout): # pylint: disable=unused-argument raise exceptions.StoryActionError('Overview mode is not supported')
def GetUIDevtoolsBackend(self, port): # pylint: disable=unused-argument raise exceptions.StoryActionError('UI Devtools not supported')
def SetDownloadBehavior(self, behavior, downloadPath, timeout): # pylint: disable=unused-argument raise exceptions.StoryActionError( 'Set download behavior not supported')
def ExecuteBrowserCommand(self, command_id, timeout): # pylint: disable=unused-argument raise exceptions.StoryActionError( 'Execute browser command not supported')