1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 from telemetry.core import util
6 from telemetry.page.actions import play
7 from telemetry.unittest import tab_test_case
9 AUDIO_1_PLAYING_CHECK = 'window.__hasEventCompleted("#audio_1", "playing");'
10 VIDEO_1_PLAYING_CHECK = 'window.__hasEventCompleted("#video_1", "playing");'
11 VIDEO_1_ENDED_CHECK = 'window.__hasEventCompleted("#video_1", "ended");'
14 class PlayActionTest(tab_test_case.TabTestCase):
17 tab_test_case.TabTestCase.setUp(self)
18 self.Navigate('video_test.html')
20 def testPlayWithNoSelector(self):
21 """Tests that with no selector Play action plays first video element."""
22 data = {'wait_for_playing': True}
23 action = play.PlayAction(data)
24 action.WillRunAction(None, self._tab)
25 # Both videos not playing before running action.
26 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
27 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
28 action.RunAction(None, self._tab)
29 # Assert only first video has played.
30 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
31 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
33 def testPlayWithVideoSelector(self):
34 """Tests that Play action plays video element matching selector."""
35 data = {'selector': '#video_1', 'wait_for_playing': True}
36 action = play.PlayAction(data)
37 action.WillRunAction(None, self._tab)
38 # Both videos not playing before running action.
39 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
40 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
41 action.RunAction(None, self._tab)
42 # Assert only video matching selector has played.
43 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
44 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
46 def testPlayWithAllSelector(self):
47 """Tests that Play action plays all video elements with selector='all'."""
48 data = {'selector': 'all', 'wait_for_playing': True}
49 action = play.PlayAction(data)
50 action.WillRunAction(None, self._tab)
51 # Both videos not playing before running action.
52 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
53 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
54 action.RunAction(None, self._tab)
55 # Assert all media elements played.
56 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
57 self.assertTrue(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
59 # http://crbug.com/273887
60 def testPlayWaitForPlayTimeout(self):
61 """Tests that wait_for_playing timeouts if video does not play."""
62 data = {'selector': '#video_1',
63 'wait_for_playing': True,
65 action = play.PlayAction(data)
66 action.WillRunAction(None, self._tab)
67 self._tab.EvaluateJavaScript('document.getElementById("video_1").src = ""')
68 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
69 self.assertRaises(util.TimeoutException, action.RunAction, None, self._tab)
71 def testPlayWaitForEnded(self):
72 """Tests that wait_for_ended waits for video to end."""
73 data = {'selector': '#video_1', 'wait_for_ended': True}
74 action = play.PlayAction(data)
75 action.WillRunAction(None, self._tab)
76 # Assert video not playing before running action.
77 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
78 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
79 action.RunAction(None, self._tab)
81 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
83 def testPlayWithoutWaitForEnded(self):
84 """Tests that wait_for_ended waits for video to end."""
85 data = {'selector': '#video_1', 'wait_for_ended': False}
86 action = play.PlayAction(data)
87 action.WillRunAction(None, self._tab)
88 # Assert video not playing before running action.
89 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
90 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
91 action.RunAction(None, self._tab)
92 # Assert video did not end.
93 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
95 def testPlayWaitForEndedTimeout(self):
96 """Tests that action raises exception if timeout is reached."""
97 data = {'selector': '#video_1', 'wait_for_ended': True, 'wait_timeout': 1}
98 action = play.PlayAction(data)
99 action.WillRunAction(None, self._tab)
100 # Assert video not playing before running action.
101 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
102 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
103 self.assertRaises(util.TimeoutException, action.RunAction, None, self._tab)
104 # Assert video did not end.
105 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))