| Index: tools/telemetry/telemetry/page/action_runner.py
|
| diff --git a/tools/telemetry/telemetry/page/action_runner.py b/tools/telemetry/telemetry/page/action_runner.py
|
| deleted file mode 100644
|
| index aa11bdd995ce933225f450268707b3dc745d675c..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/page/action_runner.py
|
| +++ /dev/null
|
| @@ -1,726 +0,0 @@
|
| -# Copyright 2014 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -import logging
|
| -import time
|
| -import urlparse
|
| -
|
| -from telemetry.internal.actions.drag import DragAction
|
| -from telemetry.internal.actions.javascript_click import ClickElementAction
|
| -from telemetry.internal.actions.load_media import LoadMediaAction
|
| -from telemetry.internal.actions.loop import LoopAction
|
| -from telemetry.internal.actions.mouse_click import MouseClickAction
|
| -from telemetry.internal.actions.navigate import NavigateAction
|
| -from telemetry.internal.actions.page_action import GESTURE_SOURCE_DEFAULT
|
| -from telemetry.internal.actions.page_action import SUPPORTED_GESTURE_SOURCES
|
| -from telemetry.internal.actions.pinch import PinchAction
|
| -from telemetry.internal.actions.play import PlayAction
|
| -from telemetry.internal.actions.repaint_continuously import (
|
| - RepaintContinuouslyAction)
|
| -from telemetry.internal.actions.repeatable_scroll import RepeatableScrollAction
|
| -from telemetry.internal.actions.scroll import ScrollAction
|
| -from telemetry.internal.actions.scroll_bounce import ScrollBounceAction
|
| -from telemetry.internal.actions.seek import SeekAction
|
| -from telemetry.internal.actions.swipe import SwipeAction
|
| -from telemetry.internal.actions.tap import TapAction
|
| -from telemetry.internal.actions.wait import WaitForElementAction
|
| -from telemetry.web_perf import timeline_interaction_record
|
| -
|
| -
|
| -class ActionRunner(object):
|
| -
|
| - def __init__(self, tab, skip_waits=False):
|
| - self._tab = tab
|
| - self._skip_waits = skip_waits
|
| -
|
| - @property
|
| - def tab(self):
|
| - """Returns the tab on which actions are performed."""
|
| - return self._tab
|
| -
|
| - def _RunAction(self, action):
|
| - action.WillRunAction(self._tab)
|
| - action.RunAction(self._tab)
|
| -
|
| - def CreateInteraction(self, label, repeatable=False):
|
| - """ Create an action.Interaction object that issues interaction record.
|
| -
|
| - An interaction record is a labeled time period containing
|
| - interaction that developers care about. Each set of metrics
|
| - specified in flags will be calculated for this time period.
|
| -
|
| - To mark the start of interaction record, call Begin() method on the returned
|
| - object. To mark the finish of interaction record, call End() method on
|
| - it. Or better yet, use the with statement to create an
|
| - interaction record that covers the actions in the with block.
|
| -
|
| - e.g:
|
| - with action_runner.CreateInteraction('Animation-1'):
|
| - action_runner.TapElement(...)
|
| - action_runner.WaitForJavaScriptCondition(...)
|
| -
|
| - Args:
|
| - label: A label for this particular interaction. This can be any
|
| - user-defined string, but must not contain '/'.
|
| - repeatable: Whether other interactions may use the same logical name
|
| - as this interaction. All interactions with the same logical name must
|
| - have the same flags.
|
| -
|
| - Returns:
|
| - An instance of action_runner.Interaction
|
| - """
|
| - flags = []
|
| - if repeatable:
|
| - flags.append(timeline_interaction_record.REPEATABLE)
|
| -
|
| - return Interaction(self._tab, label, flags)
|
| -
|
| - def CreateGestureInteraction(self, label, repeatable=False):
|
| - """ Create an action.Interaction object that issues gesture-based
|
| - interaction record.
|
| -
|
| - This is similar to normal interaction record, but it will
|
| - auto-narrow the interaction time period to only include the
|
| - synthetic gesture event output by Chrome. This is typically use to
|
| - reduce noise in gesture-based analysis (e.g., analysis for a
|
| - swipe/scroll).
|
| -
|
| - The interaction record label will be prepended with 'Gesture_'.
|
| -
|
| - e.g:
|
| - with action_runner.CreateGestureInteraction('Scroll-1'):
|
| - action_runner.ScrollPage()
|
| -
|
| - Args:
|
| - label: A label for this particular interaction. This can be any
|
| - user-defined string, but must not contain '/'.
|
| - repeatable: Whether other interactions may use the same logical name
|
| - as this interaction. All interactions with the same logical name must
|
| - have the same flags.
|
| -
|
| - Returns:
|
| - An instance of action_runner.Interaction
|
| - """
|
| - return self.CreateInteraction('Gesture_' + label, repeatable)
|
| -
|
| - def Navigate(self, url, script_to_evaluate_on_commit=None,
|
| - timeout_in_seconds=60):
|
| - """Navigates to |url|.
|
| -
|
| - If |script_to_evaluate_on_commit| is given, the script source string will be
|
| - evaluated when the navigation is committed. This is after the context of
|
| - the page exists, but before any script on the page itself has executed.
|
| - """
|
| - if urlparse.urlparse(url).scheme == 'file':
|
| - url = self._tab.browser.platform.http_server.UrlOf(url[7:])
|
| -
|
| - self._RunAction(NavigateAction(
|
| - url=url,
|
| - script_to_evaluate_on_commit=script_to_evaluate_on_commit,
|
| - timeout_in_seconds=timeout_in_seconds))
|
| -
|
| - def WaitForNavigate(self, timeout_in_seconds_seconds=60):
|
| - start_time = time.time()
|
| - self._tab.WaitForNavigate(timeout_in_seconds_seconds)
|
| -
|
| - time_left_in_seconds = (start_time + timeout_in_seconds_seconds
|
| - - time.time())
|
| - time_left_in_seconds = max(0, time_left_in_seconds)
|
| - self._tab.WaitForDocumentReadyStateToBeInteractiveOrBetter(
|
| - time_left_in_seconds)
|
| -
|
| - def ReloadPage(self):
|
| - """Reloads the page."""
|
| - self._tab.ExecuteJavaScript('window.location.reload()')
|
| - self._tab.WaitForDocumentReadyStateToBeInteractiveOrBetter()
|
| -
|
| - def ExecuteJavaScript(self, statement):
|
| - """Executes a given JavaScript expression. Does not return the result.
|
| -
|
| - Example: runner.ExecuteJavaScript('var foo = 1;');
|
| -
|
| - Args:
|
| - statement: The statement to execute (provided as string).
|
| -
|
| - Raises:
|
| - EvaluationException: The statement failed to execute.
|
| - """
|
| - self._tab.ExecuteJavaScript(statement)
|
| -
|
| - def EvaluateJavaScript(self, expression):
|
| - """Returns the evaluation result of the given JavaScript expression.
|
| -
|
| - The evaluation results must be convertible to JSON. If the result
|
| - is not needed, use ExecuteJavaScript instead.
|
| -
|
| - Example: num = runner.EvaluateJavaScript('document.location.href')
|
| -
|
| - Args:
|
| - expression: The expression to evaluate (provided as string).
|
| -
|
| - Raises:
|
| - EvaluationException: The statement expression failed to execute
|
| - or the evaluation result can not be JSON-ized.
|
| - """
|
| - return self._tab.EvaluateJavaScript(expression)
|
| -
|
| - def Wait(self, seconds):
|
| - """Wait for the number of seconds specified.
|
| -
|
| - Args:
|
| - seconds: The number of seconds to wait.
|
| - """
|
| - if not self._skip_waits:
|
| - time.sleep(seconds)
|
| -
|
| - def WaitForJavaScriptCondition(self, condition, timeout_in_seconds=60):
|
| - """Wait for a JavaScript condition to become true.
|
| -
|
| - Example: runner.WaitForJavaScriptCondition('window.foo == 10');
|
| -
|
| - Args:
|
| - condition: The JavaScript condition (as string).
|
| - timeout_in_seconds: The timeout in seconds (default to 60).
|
| - """
|
| - self._tab.WaitForJavaScriptExpression(condition, timeout_in_seconds)
|
| -
|
| - def WaitForElement(self, selector=None, text=None, element_function=None,
|
| - timeout_in_seconds=60):
|
| - """Wait for an element to appear in the document.
|
| -
|
| - The element may be selected via selector, text, or element_function.
|
| - Only one of these arguments must be specified.
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element.
|
| - text: The element must contains this exact text.
|
| - element_function: A JavaScript function (as string) that is used
|
| - to retrieve the element. For example:
|
| - '(function() { return foo.element; })()'.
|
| - timeout_in_seconds: The timeout in seconds (default to 60).
|
| - """
|
| - self._RunAction(WaitForElementAction(
|
| - selector=selector, text=text, element_function=element_function,
|
| - timeout_in_seconds=timeout_in_seconds))
|
| -
|
| - def TapElement(self, selector=None, text=None, element_function=None):
|
| - """Tap an element.
|
| -
|
| - The element may be selected via selector, text, or element_function.
|
| - Only one of these arguments must be specified.
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element.
|
| - text: The element must contains this exact text.
|
| - element_function: A JavaScript function (as string) that is used
|
| - to retrieve the element. For example:
|
| - '(function() { return foo.element; })()'.
|
| - """
|
| - self._RunAction(TapAction(
|
| - selector=selector, text=text, element_function=element_function))
|
| -
|
| - def ClickElement(self, selector=None, text=None, element_function=None):
|
| - """Click an element.
|
| -
|
| - The element may be selected via selector, text, or element_function.
|
| - Only one of these arguments must be specified.
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element.
|
| - text: The element must contains this exact text.
|
| - element_function: A JavaScript function (as string) that is used
|
| - to retrieve the element. For example:
|
| - '(function() { return foo.element; })()'.
|
| - """
|
| - self._RunAction(ClickElementAction(
|
| - selector=selector, text=text, element_function=element_function))
|
| -
|
| - def DragPage(self, left_start_ratio, top_start_ratio, left_end_ratio,
|
| - top_end_ratio, speed_in_pixels_per_second=800, use_touch=False,
|
| - selector=None, text=None, element_function=None):
|
| - """Perform a drag gesture on the page.
|
| -
|
| - You should specify a start and an end point in ratios of page width and
|
| - height (see drag.js for full implementation).
|
| -
|
| - Args:
|
| - left_start_ratio: The horizontal starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - top_start_ratio: The vertical starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - left_end_ratio: The horizontal ending coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - top_end_ratio: The vertical ending coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - speed_in_pixels_per_second: The speed of the gesture (in pixels/s).
|
| - use_touch: Whether dragging should be done with touch input.
|
| - """
|
| - self._RunAction(DragAction(
|
| - left_start_ratio=left_start_ratio, top_start_ratio=top_start_ratio,
|
| - left_end_ratio=left_end_ratio, top_end_ratio=top_end_ratio,
|
| - speed_in_pixels_per_second=speed_in_pixels_per_second,
|
| - use_touch=use_touch, selector=selector, text=text,
|
| - element_function=element_function))
|
| -
|
| - def PinchPage(self, left_anchor_ratio=0.5, top_anchor_ratio=0.5,
|
| - scale_factor=None, speed_in_pixels_per_second=800):
|
| - """Perform the pinch gesture on the page.
|
| -
|
| - It computes the pinch gesture automatically based on the anchor
|
| - coordinate and the scale factor. The scale factor is the ratio of
|
| - of the final span and the initial span of the gesture.
|
| -
|
| - Args:
|
| - left_anchor_ratio: The horizontal pinch anchor coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - top_anchor_ratio: The vertical pinch anchor coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - scale_factor: The ratio of the final span to the initial span.
|
| - The default scale factor is
|
| - 3.0 / (window.outerWidth/window.innerWidth).
|
| - speed_in_pixels_per_second: The speed of the gesture (in pixels/s).
|
| - """
|
| - self._RunAction(PinchAction(
|
| - left_anchor_ratio=left_anchor_ratio, top_anchor_ratio=top_anchor_ratio,
|
| - scale_factor=scale_factor,
|
| - speed_in_pixels_per_second=speed_in_pixels_per_second))
|
| -
|
| - def PinchElement(self, selector=None, text=None, element_function=None,
|
| - left_anchor_ratio=0.5, top_anchor_ratio=0.5,
|
| - scale_factor=None, speed_in_pixels_per_second=800):
|
| - """Perform the pinch gesture on an element.
|
| -
|
| - It computes the pinch gesture automatically based on the anchor
|
| - coordinate and the scale factor. The scale factor is the ratio of
|
| - of the final span and the initial span of the gesture.
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element.
|
| - text: The element must contains this exact text.
|
| - element_function: A JavaScript function (as string) that is used
|
| - to retrieve the element. For example:
|
| - 'function() { return foo.element; }'.
|
| - left_anchor_ratio: The horizontal pinch anchor coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - the element.
|
| - top_anchor_ratio: The vertical pinch anchor coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - the element.
|
| - scale_factor: The ratio of the final span to the initial span.
|
| - The default scale factor is
|
| - 3.0 / (window.outerWidth/window.innerWidth).
|
| - speed_in_pixels_per_second: The speed of the gesture (in pixels/s).
|
| - """
|
| - self._RunAction(PinchAction(
|
| - selector=selector, text=text, element_function=element_function,
|
| - left_anchor_ratio=left_anchor_ratio, top_anchor_ratio=top_anchor_ratio,
|
| - scale_factor=scale_factor,
|
| - speed_in_pixels_per_second=speed_in_pixels_per_second))
|
| -
|
| - def ScrollPage(self, left_start_ratio=0.5, top_start_ratio=0.5,
|
| - direction='down', distance=None, distance_expr=None,
|
| - speed_in_pixels_per_second=800, use_touch=False,
|
| - synthetic_gesture_source=GESTURE_SOURCE_DEFAULT):
|
| - """Perform scroll gesture on the page.
|
| -
|
| - You may specify distance or distance_expr, but not both. If
|
| - neither is specified, the default scroll distance is variable
|
| - depending on direction (see scroll.js for full implementation).
|
| -
|
| - Args:
|
| - left_start_ratio: The horizontal starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - top_start_ratio: The vertical starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - direction: The direction of scroll, either 'left', 'right',
|
| - 'up', 'down', 'upleft', 'upright', 'downleft', or 'downright'
|
| - distance: The distance to scroll (in pixel).
|
| - distance_expr: A JavaScript expression (as string) that can be
|
| - evaluated to compute scroll distance. Example:
|
| - 'window.scrollTop' or '(function() { return crazyMath(); })()'.
|
| - speed_in_pixels_per_second: The speed of the gesture (in pixels/s).
|
| - use_touch: Whether scrolling should be done with touch input.
|
| - synthetic_gesture_source: the source input device type for the
|
| - synthetic gesture: 'DEFAULT', 'TOUCH' or 'MOUSE'.
|
| - """
|
| - assert synthetic_gesture_source in SUPPORTED_GESTURE_SOURCES
|
| - self._RunAction(ScrollAction(
|
| - left_start_ratio=left_start_ratio, top_start_ratio=top_start_ratio,
|
| - direction=direction, distance=distance, distance_expr=distance_expr,
|
| - speed_in_pixels_per_second=speed_in_pixels_per_second,
|
| - use_touch=use_touch, synthetic_gesture_source=synthetic_gesture_source))
|
| -
|
| - def RepeatableBrowserDrivenScroll(self, x_scroll_distance_ratio=0.0,
|
| - y_scroll_distance_ratio=0.5,
|
| - repeat_count=0,
|
| - repeat_delay_ms=250,
|
| - timeout=60):
|
| - """Perform a browser driven repeatable scroll gesture.
|
| -
|
| - The scroll gesture is driven from the browser, this is useful because the
|
| - main thread often isn't resposive but the browser process usually is, so the
|
| - delay between the scroll gestures should be consistent.
|
| -
|
| - Args:
|
| - x_scroll_distance_ratio: The horizontal length of the scroll as a fraction
|
| - of the screen width.
|
| - y_scroll_distance_ratio: The vertical length of the scroll as a fraction
|
| - of the screen height.
|
| - repeat_count: The number of additional times to repeat the gesture.
|
| - repeat_delay_ms: The delay in milliseconds between each scroll gesture.
|
| - """
|
| - self._RunAction(RepeatableScrollAction(
|
| - x_scroll_distance_ratio=x_scroll_distance_ratio,
|
| - y_scroll_distance_ratio=y_scroll_distance_ratio,
|
| - repeat_count=repeat_count,
|
| - repeat_delay_ms=repeat_delay_ms, timeout=timeout))
|
| -
|
| - def ScrollElement(self, selector=None, text=None, element_function=None,
|
| - left_start_ratio=0.5, top_start_ratio=0.5,
|
| - direction='down', distance=None, distance_expr=None,
|
| - speed_in_pixels_per_second=800, use_touch=False,
|
| - synthetic_gesture_source=GESTURE_SOURCE_DEFAULT):
|
| - """Perform scroll gesture on the element.
|
| -
|
| - The element may be selected via selector, text, or element_function.
|
| - Only one of these arguments must be specified.
|
| -
|
| - You may specify distance or distance_expr, but not both. If
|
| - neither is specified, the default scroll distance is variable
|
| - depending on direction (see scroll.js for full implementation).
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element.
|
| - text: The element must contains this exact text.
|
| - element_function: A JavaScript function (as string) that is used
|
| - to retrieve the element. For example:
|
| - 'function() { return foo.element; }'.
|
| - left_start_ratio: The horizontal starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - the element.
|
| - top_start_ratio: The vertical starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - the element.
|
| - direction: The direction of scroll, either 'left', 'right',
|
| - 'up', 'down', 'upleft', 'upright', 'downleft', or 'downright'
|
| - distance: The distance to scroll (in pixel).
|
| - distance_expr: A JavaScript expression (as string) that can be
|
| - evaluated to compute scroll distance. Example:
|
| - 'window.scrollTop' or '(function() { return crazyMath(); })()'.
|
| - speed_in_pixels_per_second: The speed of the gesture (in pixels/s).
|
| - use_touch: Whether scrolling should be done with touch input.
|
| - synthetic_gesture_source: the source input device type for the
|
| - synthetic gesture: 'DEFAULT', 'TOUCH' or 'MOUSE'.
|
| - """
|
| - assert synthetic_gesture_source in SUPPORTED_GESTURE_SOURCES
|
| - self._RunAction(ScrollAction(
|
| - selector=selector, text=text, element_function=element_function,
|
| - left_start_ratio=left_start_ratio, top_start_ratio=top_start_ratio,
|
| - direction=direction, distance=distance, distance_expr=distance_expr,
|
| - speed_in_pixels_per_second=speed_in_pixels_per_second,
|
| - use_touch=use_touch, synthetic_gesture_source=synthetic_gesture_source))
|
| -
|
| - def ScrollBouncePage(self, left_start_ratio=0.5, top_start_ratio=0.5,
|
| - direction='down', distance=100,
|
| - overscroll=10, repeat_count=10,
|
| - speed_in_pixels_per_second=400):
|
| - """Perform scroll bounce gesture on the page.
|
| -
|
| - This gesture scrolls the page by the number of pixels specified in
|
| - distance, in the given direction, followed by a scroll by
|
| - (distance + overscroll) pixels in the opposite direction.
|
| - The above gesture is repeated repeat_count times.
|
| -
|
| - Args:
|
| - left_start_ratio: The horizontal starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - top_start_ratio: The vertical starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - direction: The direction of scroll, either 'left', 'right',
|
| - 'up', 'down', 'upleft', 'upright', 'downleft', or 'downright'
|
| - distance: The distance to scroll (in pixel).
|
| - overscroll: The number of additional pixels to scroll back, in
|
| - addition to the givendistance.
|
| - repeat_count: How often we want to repeat the full gesture.
|
| - speed_in_pixels_per_second: The speed of the gesture (in pixels/s).
|
| - """
|
| - self._RunAction(ScrollBounceAction(
|
| - left_start_ratio=left_start_ratio, top_start_ratio=top_start_ratio,
|
| - direction=direction, distance=distance,
|
| - overscroll=overscroll, repeat_count=repeat_count,
|
| - speed_in_pixels_per_second=speed_in_pixels_per_second))
|
| -
|
| - def ScrollBounceElement(
|
| - self, selector=None, text=None, element_function=None,
|
| - left_start_ratio=0.5, top_start_ratio=0.5,
|
| - direction='down', distance=100,
|
| - overscroll=10, repeat_count=10,
|
| - speed_in_pixels_per_second=400):
|
| - """Perform scroll bounce gesture on the element.
|
| -
|
| - This gesture scrolls on the element by the number of pixels specified in
|
| - distance, in the given direction, followed by a scroll by
|
| - (distance + overscroll) pixels in the opposite direction.
|
| - The above gesture is repeated repeat_count times.
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element.
|
| - text: The element must contains this exact text.
|
| - element_function: A JavaScript function (as string) that is used
|
| - to retrieve the element. For example:
|
| - 'function() { return foo.element; }'.
|
| - left_start_ratio: The horizontal starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - top_start_ratio: The vertical starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - direction: The direction of scroll, either 'left', 'right',
|
| - 'up', 'down', 'upleft', 'upright', 'downleft', or 'downright'
|
| - distance: The distance to scroll (in pixel).
|
| - overscroll: The number of additional pixels to scroll back, in
|
| - addition to the given distance.
|
| - repeat_count: How often we want to repeat the full gesture.
|
| - speed_in_pixels_per_second: The speed of the gesture (in pixels/s).
|
| - """
|
| - self._RunAction(ScrollBounceAction(
|
| - selector=selector, text=text, element_function=element_function,
|
| - left_start_ratio=left_start_ratio, top_start_ratio=top_start_ratio,
|
| - direction=direction, distance=distance,
|
| - overscroll=overscroll, repeat_count=repeat_count,
|
| - speed_in_pixels_per_second=speed_in_pixels_per_second))
|
| -
|
| - def MouseClick(self, selector=None):
|
| - """Mouse click the given element.
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element.
|
| - """
|
| - self._RunAction(MouseClickAction(selector=selector))
|
| -
|
| - def SwipePage(self, left_start_ratio=0.5, top_start_ratio=0.5,
|
| - direction='left', distance=100, speed_in_pixels_per_second=800):
|
| - """Perform swipe gesture on the page.
|
| -
|
| - Args:
|
| - left_start_ratio: The horizontal starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - top_start_ratio: The vertical starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - document.body.
|
| - direction: The direction of swipe, either 'left', 'right',
|
| - 'up', or 'down'
|
| - distance: The distance to swipe (in pixel).
|
| - speed_in_pixels_per_second: The speed of the gesture (in pixels/s).
|
| - """
|
| - self._RunAction(SwipeAction(
|
| - left_start_ratio=left_start_ratio, top_start_ratio=top_start_ratio,
|
| - direction=direction, distance=distance,
|
| - speed_in_pixels_per_second=speed_in_pixels_per_second))
|
| -
|
| - def SwipeElement(self, selector=None, text=None, element_function=None,
|
| - left_start_ratio=0.5, top_start_ratio=0.5,
|
| - direction='left', distance=100,
|
| - speed_in_pixels_per_second=800):
|
| - """Perform swipe gesture on the element.
|
| -
|
| - The element may be selected via selector, text, or element_function.
|
| - Only one of these arguments must be specified.
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element.
|
| - text: The element must contains this exact text.
|
| - element_function: A JavaScript function (as string) that is used
|
| - to retrieve the element. For example:
|
| - 'function() { return foo.element; }'.
|
| - left_start_ratio: The horizontal starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - the element.
|
| - top_start_ratio: The vertical starting coordinate of the
|
| - gesture, as a ratio of the visible bounding rectangle for
|
| - the element.
|
| - direction: The direction of swipe, either 'left', 'right',
|
| - 'up', or 'down'
|
| - distance: The distance to swipe (in pixel).
|
| - speed_in_pixels_per_second: The speed of the gesture (in pixels/s).
|
| - """
|
| - self._RunAction(SwipeAction(
|
| - selector=selector, text=text, element_function=element_function,
|
| - left_start_ratio=left_start_ratio, top_start_ratio=top_start_ratio,
|
| - direction=direction, distance=distance,
|
| - speed_in_pixels_per_second=speed_in_pixels_per_second))
|
| -
|
| - def LoadMedia(self, selector=None, event_timeout_in_seconds=0,
|
| - event_to_await='canplaythrough'):
|
| - """Invokes load() on media elements and awaits an event.
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element. If none is
|
| - specified, play the first media element on the page. If the
|
| - selector matches more than 1 media element, all of them will
|
| - be played.
|
| - event_timeout_in_seconds: Maximum waiting time for the event to be fired.
|
| - 0 means do not wait.
|
| - event_to_await: Which event to await. For example: 'canplaythrough' or
|
| - 'loadedmetadata'.
|
| -
|
| - Raises:
|
| - TimeoutException: If the maximum waiting time is exceeded.
|
| - """
|
| - self._RunAction(LoadMediaAction(
|
| - selector=selector, timeout_in_seconds=event_timeout_in_seconds,
|
| - event_to_await=event_to_await))
|
| -
|
| - def PlayMedia(self, selector=None,
|
| - playing_event_timeout_in_seconds=0,
|
| - ended_event_timeout_in_seconds=0):
|
| - """Invokes the "play" action on media elements (such as video).
|
| -
|
| - Args:
|
| - selector: A CSS selector describing the element. If none is
|
| - specified, play the first media element on the page. If the
|
| - selector matches more than 1 media element, all of them will
|
| - be played.
|
| - playing_event_timeout_in_seconds: Maximum waiting time for the "playing"
|
| - event (dispatched when the media begins to play) to be fired.
|
| - 0 means do not wait.
|
| - ended_event_timeout_in_seconds: Maximum waiting time for the "ended"
|
| - event (dispatched when playback completes) to be fired.
|
| - 0 means do not wait.
|
| -
|
| - Raises:
|
| - TimeoutException: If the maximum waiting time is exceeded.
|
| - """
|
| - self._RunAction(PlayAction(
|
| - selector=selector,
|
| - playing_event_timeout_in_seconds=playing_event_timeout_in_seconds,
|
| - ended_event_timeout_in_seconds=ended_event_timeout_in_seconds))
|
| -
|
| - def SeekMedia(self, seconds, selector=None, timeout_in_seconds=0,
|
| - log_time=True, label=''):
|
| - """Performs a seek action on media elements (such as video).
|
| -
|
| - Args:
|
| - seconds: The media time to seek to.
|
| - selector: A CSS selector describing the element. If none is
|
| - specified, seek the first media element on the page. If the
|
| - selector matches more than 1 media element, all of them will
|
| - be seeked.
|
| - timeout_in_seconds: Maximum waiting time for the "seeked" event
|
| - (dispatched when the seeked operation completes) to be
|
| - fired. 0 means do not wait.
|
| - log_time: Whether to log the seek time for the perf
|
| - measurement. Useful when performing multiple seek.
|
| - label: A suffix string to name the seek perf measurement.
|
| -
|
| - Raises:
|
| - TimeoutException: If the maximum waiting time is exceeded.
|
| - """
|
| - self._RunAction(SeekAction(
|
| - seconds=seconds, selector=selector,
|
| - timeout_in_seconds=timeout_in_seconds,
|
| - log_time=log_time, label=label))
|
| -
|
| - def LoopMedia(self, loop_count, selector=None, timeout_in_seconds=None):
|
| - """Loops a media playback.
|
| -
|
| - Args:
|
| - loop_count: The number of times to loop the playback.
|
| - selector: A CSS selector describing the element. If none is
|
| - specified, loop the first media element on the page. If the
|
| - selector matches more than 1 media element, all of them will
|
| - be looped.
|
| - timeout_in_seconds: Maximum waiting time for the looped playback to
|
| - complete. 0 means do not wait. None (the default) means to
|
| - wait loop_count * 60 seconds.
|
| -
|
| - Raises:
|
| - TimeoutException: If the maximum waiting time is exceeded.
|
| - """
|
| - self._RunAction(LoopAction(
|
| - loop_count=loop_count, selector=selector,
|
| - timeout_in_seconds=timeout_in_seconds))
|
| -
|
| - def ForceGarbageCollection(self):
|
| - """Forces JavaScript garbage collection on the page."""
|
| - self._tab.CollectGarbage()
|
| -
|
| - def SimulateMemoryPressureNotification(self, pressure_level):
|
| - """Simulate memory pressure notification.
|
| -
|
| - Args:
|
| - pressure_level: 'moderate' or 'critical'.
|
| - """
|
| - self._tab.browser.SimulateMemoryPressureNotification(pressure_level)
|
| -
|
| - def PauseInteractive(self):
|
| - """Pause the page execution and wait for terminal interaction.
|
| -
|
| - This is typically used for debugging. You can use this to pause
|
| - the page execution and inspect the browser state before
|
| - continuing.
|
| - """
|
| - raw_input("Interacting... Press Enter to continue.")
|
| -
|
| - def RepaintContinuously(self, seconds):
|
| - """Continuously repaints the visible content.
|
| -
|
| - It does this by requesting animation frames until the given number
|
| - of seconds have elapsed AND at least three RAFs have been
|
| - fired. Times out after max(60, self.seconds), if less than three
|
| - RAFs were fired."""
|
| - self._RunAction(RepaintContinuouslyAction(
|
| - seconds=0 if self._skip_waits else seconds))
|
| -
|
| -
|
| -class Interaction(object):
|
| -
|
| - def __init__(self, action_runner, label, flags):
|
| - assert action_runner
|
| - assert label
|
| - assert isinstance(flags, list)
|
| -
|
| - self._action_runner = action_runner
|
| - self._label = label
|
| - self._flags = flags
|
| - self._started = False
|
| -
|
| - def __enter__(self):
|
| - self.Begin()
|
| - return self
|
| -
|
| - def __exit__(self, exc_type, exc_value, traceback):
|
| - if exc_value is None:
|
| - self.End()
|
| - else:
|
| - logging.warning(
|
| - 'Exception was raised in the with statement block, the end of '
|
| - 'interaction record is not marked.')
|
| -
|
| - def Begin(self):
|
| - assert not self._started
|
| - self._started = True
|
| - self._action_runner.ExecuteJavaScript(
|
| - 'console.time("%s");' %
|
| - timeline_interaction_record.GetJavaScriptMarker(
|
| - self._label, self._flags))
|
| -
|
| - def End(self):
|
| - assert self._started
|
| - self._started = False
|
| - self._action_runner.ExecuteJavaScript(
|
| - 'console.timeEnd("%s");' %
|
| - timeline_interaction_record.GetJavaScriptMarker(
|
| - self._label, self._flags))
|
|
|