| Index: functional/youtube.py
|
| ===================================================================
|
| --- functional/youtube.py (revision 109125)
|
| +++ functional/youtube.py (working copy)
|
| @@ -3,6 +3,7 @@
|
| # Use of this source code is governed by a BSD-style license that can be
|
| # found in the LICENSE file.
|
|
|
| +import re
|
| import time
|
|
|
| import pyauto_functional
|
| @@ -26,27 +27,60 @@
|
| self._pyauto = pyauto
|
|
|
| def IsFlashPluginEnabled(self):
|
| - """Verify flash plugin availability and its state"""
|
| + """Verify flash plugin availability and its state."""
|
| return [x for x in self._pyauto.GetPluginsInfo().Plugins() \
|
| if x['name'] == 'Shockwave Flash' and x['enabled']]
|
|
|
| def WaitUntilPlayerReady(self):
|
| - """Verify that player is ready"""
|
| + """Verify that player is ready."""
|
| return self._pyauto.WaitUntil(lambda: self._pyauto.ExecuteJavascript("""
|
| player_status = document.getElementById("player_status");
|
| window.domAutomationController.send(player_status.innerHTML);
|
| """), expect_retval='player ready')
|
|
|
| def GetPlayerState(self):
|
| - """Returns a player state"""
|
| + """Returns a player state."""
|
| js = """
|
| var val = ytplayer.getPlayerState();
|
| window.domAutomationController.send(val + '');
|
| """
|
| return self._pyauto.ExecuteJavascript(js)
|
|
|
| + def GetVideoInfo(self):
|
| + """Returns Youtube video info."""
|
| + youtube_apis = self._pyauto.GetPrivateInfo()['youtube_api']
|
| + youtube_debug_text = youtube_apis['GetDebugText']
|
| + return self._pyauto.ExecuteJavascript(
|
| + 'window.domAutomationController.send(%s);' % youtube_debug_text)
|
| +
|
| + def GetVideoDroppedFrames(self):
|
| + """Returns total Youtube video dropped frames.
|
| +
|
| + Returns:
|
| + -1 if failed to get video frames from the video data
|
| + """
|
| + video_data = self._pyauto.GetVideoInfo()
|
| + matched = re.search('droppedFrames=([\d\.]+)', video_data)
|
| + if matched:
|
| + return int(matched.group(1))
|
| + else:
|
| + return -1
|
| +
|
| + def GetVideoFrames(self):
|
| + """Returns Youtube video frames/second.
|
| +
|
| + Returns:
|
| + -1 if failed to get droppd frames from the video data.
|
| + """
|
| + video_data = self._pyauto.GetVideoInfo()
|
| + matched = re.search('videoFps=([\d\.]+)', video_data)
|
| + if matched:
|
| + return int(matched.group(1))
|
| + else:
|
| + return -1
|
| +
|
| def GetVideoTotalBytes(self):
|
| - """Returns video size in bytes
|
| + """Returns video total size in bytes.
|
|
|
| To call this function, video must be in the paying state,
|
| or this returns 0.
|
| @@ -58,23 +92,39 @@
|
| """)
|
| return int(total_bytes)
|
|
|
| + def GetVideoLoadedBytes(self):
|
| + """Returns video size in bytes."""
|
| + loaded_bytes = 0
|
| + loaded_bytes = self.ExecuteJavascript("""
|
| + bytes = ytplayer.getVideoBytesLoaded();
|
| + window.domAutomationController.send(bytes + '');
|
| + """)
|
| + return int(loaded_bytes)
|
| +
|
| def PlayVideo(self):
|
| - """Plays the loaded video"""
|
| + """Plays the loaded video."""
|
| self._pyauto.ExecuteJavascript("""
|
| ytplayer.playVideo();
|
| window.domAutomationController.send('');
|
| """)
|
|
|
| + def PauseVideo(self):
|
| + """Pause the video."""
|
| + self.ExecuteJavascript("""
|
| + ytplayer.pauseVideo();
|
| + window.domAutomationController.send('');
|
| + """)
|
| +
|
| def AssertPlayingState(self):
|
| - """Assert player's playing state"""
|
| + """Assert player's playing state."""
|
| self._pyauto.assertTrue(self._pyauto.WaitUntil(self._pyauto.GetPlayerState,
|
| expect_retval=self._pyauto.is_playing),
|
| msg='Player did not enter the playing state')
|
|
|
| def PlayVideoAndAssert(self):
|
| - """Start video and assert the playing state"""
|
| + """Start video and assert the playing state."""
|
| self._pyauto.assertTrue(self._pyauto.IsFlashPluginEnabled(),
|
| - msg='From here Flash plugin is disabled or not available')
|
| + msg='From here Flash plugin is disabled or not available')
|
| url = self._pyauto.GetHttpURLForDataPath('media', 'youtube.html')
|
| self._pyauto.NavigateToURL(url)
|
| self._pyauto.assertTrue(self._pyauto.WaitUntilPlayerReady(),
|
| @@ -99,11 +149,7 @@
|
| # Navigating to Youtube video. This video is 122 seconds long.
|
| # During tests, we are not goinig to play this video full.
|
| self.PlayVideoAndAssert()
|
| - # Pause the playing video
|
| - self.ExecuteJavascript("""
|
| - ytplayer.pauseVideo();
|
| - window.domAutomationController.send('');
|
| - """)
|
| + self.PauseVideo()
|
| self.assertEqual(self.GetPlayerState(), self.is_paused,
|
| msg='Player did not enter the paused state')
|
| # Seek to the end of video
|
| @@ -120,7 +166,7 @@
|
| msg='Player did not reach the stopped state')
|
|
|
| def testPlayerResolution(self):
|
| - """Test various video resolutions"""
|
| + """Test various video resolutions."""
|
| self.PlayVideoAndAssert()
|
| resolutions = self.ExecuteJavascript("""
|
| res = ytplayer.getAvailableQualityLevels();
|
| @@ -139,7 +185,7 @@
|
| self.assertEqual(res, curr_res, msg='Resolution is not set to %s.' % res)
|
|
|
| def testPlayerBytes(self):
|
| - """Test that player downloads video bytes"""
|
| + """Test that player downloads video bytes."""
|
| self.PlayVideoAndAssert()
|
| total_bytes = self.GetVideoTotalBytes()
|
| prev_loaded_bytes = 0
|
| @@ -150,11 +196,7 @@
|
| count = count + 1
|
| if count == 2:
|
| break
|
| - loaded_bytes = self.ExecuteJavascript("""
|
| - bytes = ytplayer.getVideoBytesLoaded();
|
| - window.domAutomationController.send(bytes + '');
|
| - """)
|
| - loaded_bytes = int(loaded_bytes)
|
| + loaded_bytes = self.GetVideoLoadedBytes()
|
| self.assertTrue(prev_loaded_bytes <= loaded_bytes)
|
| prev_loaded_bytes = loaded_bytes
|
| # Give some time to load a video
|
|
|