Index: tools/telemetry/telemetry/page/actions/action_runner.py |
diff --git a/tools/telemetry/telemetry/page/actions/action_runner.py b/tools/telemetry/telemetry/page/actions/action_runner.py |
index d81c5b3acc07d0a0d5f544ee18af73387b00a0e7..b63a904671cf1f93acd1f56907df6b6230210cce 100644 |
--- a/tools/telemetry/telemetry/page/actions/action_runner.py |
+++ b/tools/telemetry/telemetry/page/actions/action_runner.py |
@@ -5,8 +5,15 @@ |
import time |
from telemetry.page.actions.javascript_click import ClickElementAction |
+from telemetry.page.actions.loop import LoopAction |
from telemetry.page.actions.navigate import NavigateAction |
+from telemetry.page.actions.pinch import PinchAction |
+from telemetry.page.actions.play import PlayAction |
+from telemetry.page.actions.repaint_continuously import ( |
+ RepaintContinuouslyAction) |
from telemetry.page.actions.scroll import ScrollAction |
+from telemetry.page.actions.scroll_bounce import ScrollBounceAction |
+from telemetry.page.actions.seek import SeekAction |
from telemetry.page.actions.swipe import SwipeAction |
from telemetry.page.actions.tap import TapAction |
from telemetry.page.actions.wait import WaitForElementAction |
@@ -72,7 +79,7 @@ class ActionRunner(object): |
return self.BeginInteraction('Gesture_' + label, is_smooth, is_responsive) |
def NavigateToPage(self, page, timeout_in_seconds=60): |
- """ Navigate to the given page. |
+ """Navigate to the given page. |
Args: |
page: page is an instance of page.Page |
@@ -91,6 +98,11 @@ class ActionRunner(object): |
self._tab.WaitForNavigate(timeout_in_seconds_seconds) |
self._tab.WaitForDocumentReadyStateToBeInteractiveOrBetter() |
+ 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. |
@@ -191,6 +203,63 @@ class ActionRunner(object): |
self.RunAction(ClickElementAction( |
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): |
@@ -263,6 +332,77 @@ class ActionRunner(object): |
speed_in_pixels_per_second=speed_in_pixels_per_second, |
use_touch=use_touch)) |
+ 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', or 'down' |
+ 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', or 'down' |
+ 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( |
+ 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 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. |
@@ -316,6 +456,76 @@ class ActionRunner(object): |
direction=direction, distance=distance, |
speed_in_pixels_per_second=speed_in_pixels_per_second)) |
+ 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() |
@@ -329,6 +539,14 @@ class ActionRunner(object): |
""" |
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=seconds)) |
class Interaction(object): |