Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(794)

Unified Diff: tools/perf/page_sets/system_health/media_stories.py

Issue 2787103003: Add System health stories for Emerging market (Closed)
Patch Set: nits. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/perf/page_sets/system_health/media_stories.py
diff --git a/tools/perf/page_sets/system_health/media_stories.py b/tools/perf/page_sets/system_health/media_stories.py
index ad079e8d4b515282fcec217d1b9a326dc0bcc3a8..5e59710432052ebed84811f13d7f8f966493b572 100644
--- a/tools/perf/page_sets/system_health/media_stories.py
+++ b/tools/perf/page_sets/system_health/media_stories.py
@@ -3,16 +3,24 @@
# found in the LICENSE file.
from page_sets.system_health import platforms
+from page_sets.system_health import story_tags
from page_sets.system_health import system_health_story
+from page_sets.system_health import browsing_stories
from page_sets.login_helpers import google_login
from page_sets.login_helpers import pandora_login
+from page_sets.login_helpers import pinterest_login
from telemetry import benchmark
from telemetry import decorators
-class _MediaStory(system_health_story.SystemHealthStory):
+################################################################################
+# Audio and Video stories.
+################################################################################
+
+
+class _PlayMediaStory(system_health_story.SystemHealthStory):
"""Abstract base class for media System Health user stories."""
ABSTRACT_STORY = True
@@ -51,13 +59,9 @@ class _MediaStory(system_health_story.SystemHealthStory):
return int(minutes * 60 + seconds)
-################################################################################
-# Audio stories.
-################################################################################
-
-
+# TODO(ssid): Rename the play stories to browse stories crbug.com/708300.
@benchmark.Disabled('all') # crbug.com/649392
-class GooglePlayMusicDesktopStory(_MediaStory):
+class GooglePlayMusicDesktopStory(_PlayMediaStory):
NAME = 'play:media:google_play_music'
URL = 'https://music.google.com'
@@ -82,7 +86,7 @@ class GooglePlayMusicDesktopStory(_MediaStory):
@benchmark.Disabled('win') # crbug.com/649392
-class SoundCloudDesktopStory(_MediaStory):
+class SoundCloudDesktopStory(_PlayMediaStory):
NAME = 'play:media:soundcloud'
URL = 'https://soundcloud.com'
@@ -100,7 +104,7 @@ class SoundCloudDesktopStory(_MediaStory):
@decorators.Disabled('all') # crbug.com/649392
-class PandoraDesktopStory(_MediaStory):
+class PandoraDesktopStory(_PlayMediaStory):
NAME = 'play:media:pandora'
URL = 'https://pandora.com'
@@ -114,3 +118,207 @@ class PandoraDesktopStory(_MediaStory):
def _NavigateToMedia(self, action_runner):
pass # Audio autoplays on Pandora, no need to search.
+
+
+class YoutubeMobileStory(_PlayMediaStory):
+ NAME = 'play:media:youtube'
+ URL = 'https://m.youtube.in/watch?v=OnhXkCPMeMc'
+ SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
+ TAGS = [story_tags.EMERGING_MARKET]
+
+ PLAYER_FUNCTION = 'document.getElementById("player")'
+ STOP_FUNCTION = 'document.getElementsByTagName("video")[0].pause()'
+ TIME_FUNCTION = 'document.getElementsByTagName("video")[0].currentTime'
+
+ def RunPageInteractions(self, action_runner):
+ app_ui = action_runner.tab.browser.app_ui
+ action_runner.WaitForElement(element_function=self.PLAYER_FUNCTION)
+
+ # Simulate user click in system ui since youtube play can be initialied only
+ # by user gesture.
+ renderer_view_id = 'compositor_view_holder'
+ app_ui.WaitForUiNode(resource_id=renderer_view_id)
+ renderer_view = app_ui.GetUiNode(resource_id=renderer_view_id)
+ # Click on the top half of the renderer view to start video.
+ shifted_center = 0.5 * (
+ renderer_view.bounds.center + renderer_view.bounds.top_left)
+ renderer_view.Tap(point=shifted_center)
+
+ self._WaitForPlayTime(action_runner)
+ action_runner.EvaluateJavaScript(self.STOP_FUNCTION)
+ self._Measure(action_runner)
+
+
+ def _GetTimeInSeconds(self, action_runner):
+ return int(action_runner.EvaluateJavaScript(self.TIME_FUNCTION))
+
+ def _NavigateToMedia(self, action_runner):
+ pass # Users usually open youtube links directly, skip searching.
+
+
+################################################################################
+# Photos browsing stories.
+################################################################################
+
+
+class _PhotoBrowsingStory(browsing_stories.BrowsingStory):
+ """Abstract base class for media user stories
+
+ A media story imitates browsing a website with photo or video content:
+ 1. Load a page showing a media item
+ 2. Click on the next link to go to the next media item
+ 3. etc.
+ """
+
+ ABSTRACT_STORY = True
+ ITEM_VIEW_TIME_IN_SECONDS = 3
+ ITEMS_TO_VISIT = 15
+ ITEM_SELECTOR_INDEX = 0
+ INCREMENT_INDEX_AFTER_EACH_ITEM = False
+
+ def _DidLoadDocument(self, action_runner):
+ index = self.ITEM_SELECTOR_INDEX
+ for _ in xrange(self.ITEMS_TO_VISIT):
+ self._NavigateToItem(action_runner, index)
+ self._ViewMediaItem(action_runner, index)
+ if self.INCREMENT_INDEX_AFTER_EACH_ITEM:
+ index += 1
+
+
+ def _ViewMediaItem(self, action_runner, index):
+ del index # Unused.
+ action_runner.tab.WaitForDocumentReadyStateToBeComplete()
+ action_runner.Wait(self.ITEM_VIEW_TIME_IN_SECONDS)
+
+
+class ImgurMobileStory(_PhotoBrowsingStory):
+ NAME = 'browse:media:imgur'
+ URL = 'http://imgur.com/gallery/5UlBN'
+ ITEM_SELECTOR = '.Navbar-customAction'
+ SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
+ IS_SINGLE_PAGE_APP = True
+ TAGS = [story_tags.EMERGING_MARKET]
+
+
+# crbug.com/704197 for win and mac
+@decorators.Disabled('win', 'mac')
+class ImgurDesktopStory(_PhotoBrowsingStory):
+ NAME = 'browse:media:imgur'
+ URL = 'http://imgur.com/gallery/5UlBN'
+ ITEM_SELECTOR = '.navNext'
+ SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
+ IS_SINGLE_PAGE_APP = True
+
+
+# TODO(ssid): Remove this story since we have play youtube story
+# crbug.com/708300.
+class YouTubeMobileStory(_PhotoBrowsingStory):
+ NAME = 'browse:media:youtube'
+ URL = 'https://m.youtube.com/watch?v=QGfhS1hfTWw&autoplay=false'
+ ITEM_SELECTOR = '._mhgb > a'
+ SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
+ IS_SINGLE_PAGE_APP = True
+ ITEM_SELECTOR_INDEX = 3
+ TAGS = [story_tags.JAVASCRIPT_HEAVY]
+
+
+class YouTubeDesktopStory(_PhotoBrowsingStory):
+ NAME = 'browse:media:youtube'
+ URL = 'https://www.youtube.com/watch?v=QGfhS1hfTWw&autoplay=false'
+ ITEM_SELECTOR = '.yt-uix-simple-thumb-related'
+ SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
+ IS_SINGLE_PAGE_APP = True
+ # A longer view time allows videos to load and play.
+ ITEM_VIEW_TIME_IN_SECONDS = 5
+ ITEMS_TO_VISIT = 8
+ ITEM_SELECTOR_INDEX = 3
+ PLATFORM_SPECIFIC = True
+ TAGS = [story_tags.JAVASCRIPT_HEAVY]
+
+
+class FacebookPhotosMobileStory(_PhotoBrowsingStory):
+ NAME = 'browse:media:facebook_photos'
+ URL = (
+ 'https://m.facebook.com/rihanna/photos/a.207477806675.138795.10092511675/10153911739606676/?type=3&source=54&ref=page_internal')
+ ITEM_SELECTOR = '._57-r.touchable'
+ SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
+ IS_SINGLE_PAGE_APP = True
+ ITEM_SELECTOR_INDEX = 0
+ TAGS = [story_tags.EMERGING_MARKET]
+
+
+class FacebookPhotosDesktopStory(_PhotoBrowsingStory):
+ NAME = 'browse:media:facebook_photos'
+ URL = (
+ 'https://www.facebook.com/rihanna/photos/a.207477806675.138795.10092511675/10153911739606676/?type=3&theater')
+ ITEM_SELECTOR = '.snowliftPager.next'
+ # Recording currently does not work. The page gets stuck in the
+ # theater viewer.
+ SUPPORTED_PLATFORMS = platforms.NO_PLATFORMS
+ IS_SINGLE_PAGE_APP = True
+
+
+class TumblrDesktopStory(_PhotoBrowsingStory):
+ NAME = 'browse:media:tumblr'
+ URL = 'https://tumblr.com/search/gifs'
+ ITEM_SELECTOR = '.photo'
+ IS_SINGLE_PAGE_APP = True
+ ITEMS_TO_VISIT = 8
+ INCREMENT_INDEX_AFTER_EACH_ITEM = True
+ SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
+
+ def _ViewMediaItem(self, action_runner, index):
+ super(TumblrDesktopStory, self)._ViewMediaItem(action_runner, index)
+ action_runner.MouseClick(selector='#tumblr_lightbox_center_image')
+ action_runner.Wait(1) # To make browsing more realistic.
+
+
+class PinterestDesktopStory(_PhotoBrowsingStory):
+ NAME = 'browse:media:pinterest'
+ URL = 'https://pinterest.com'
+ ITEM_SELECTOR = '.pinImageDim'
+ IS_SINGLE_PAGE_APP = True
+ ITEMS_TO_VISIT = 8
+ INCREMENT_INDEX_AFTER_EACH_ITEM = True
+ SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
+
+ def _Login(self, action_runner):
+ pinterest_login.LoginDesktopAccount(action_runner, 'googletest',
+ self.credentials_path)
+
+ def _ViewMediaItem(self, action_runner, index):
+ super(PinterestDesktopStory, self)._ViewMediaItem(action_runner, index)
+ # To imitate real user interaction, we do not want to pin every post.
+ # We will only pin every other post.
+ if index % 2 == 0:
+ # Pin the selection.
+ save_function = ('document.querySelector('
+ '".Button.Module.ShowModalButton.btn.hasIcon.hasText.'
+ 'isBrioFlat.medium.primary.primaryOnHover.repin.'
+ 'pinActionBarButton.isBrioFlat.rounded")')
+ action_runner.ClickElement(element_function=save_function)
+ action_runner.Wait(1) # Wait to make navigation realistic.
+ # Select which board to pin to.
+ inner_save_function = 'document.querySelector(".nameAndIcons")'
+ action_runner.WaitForElement(element_function=inner_save_function)
+ action_runner.ClickElement(element_function=inner_save_function)
+ action_runner.Wait(1) # Wait to make navigation realistic.
+
+ # Close selection.
+ x_element_function = ('document.querySelector('
+ '".Button.borderless.close.visible")')
+ action_runner.ClickElement(element_function=x_element_function)
+ action_runner.Wait(1) # Wait to make navigation realistic.
+
+
+# Instagram requires navigate back to view next photo So, use
+# ArticleBrowsingStory.
+class InstagramMobileStory(browsing_stories.ArticleBrowsingStory):
+ NAME = 'browse:media:instagram'
+ URL = 'https://www.instagram.com/badgalriri/'
+ ITEM_SELECTOR = '[class=\\"_8mlbc _vbtk2 _t5r8b\\"]'
+ ITEMS_TO_VISIT = 8
+ IS_SINGLE_PAGE_APP = True
+
+ SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
+ TAGS = [story_tags.EMERGING_MARKET]

Powered by Google App Engine
This is Rietveld 408576698