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._browser.SetHTTPServerDirectories(util.GetUnittestDataDir())
19 self._tab.Navigate(self._browser.http_server.UrlOf('video_test.html'))
20 self._tab.WaitForDocumentReadyStateToBeComplete()
22 def testPlayWithNoSelector(self):
23 """Tests that with no selector Play action plays first video element."""
24 data = {'wait_for_playing': True}
25 action = play.PlayAction(data)
26 action.WillRunAction(None, self._tab)
27 # Both videos not playing before running action.
28 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
29 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
30 action.RunAction(None, self._tab, None)
31 # Assert only first video has played.
32 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
33 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
35 def testPlayWithVideoSelector(self):
36 """Tests that Play action plays video element matching selector."""
37 data = {'selector': '#video_1', 'wait_for_playing': True}
38 action = play.PlayAction(data)
39 action.WillRunAction(None, self._tab)
40 # Both videos not playing before running action.
41 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
42 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
43 action.RunAction(None, self._tab, None)
44 # Assert only video matching selector has played.
45 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
46 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
48 def testPlayWithAllSelector(self):
49 """Tests that Play action plays all video elements with selector='all'."""
50 data = {'selector': 'all', 'wait_for_playing': True}
51 action = play.PlayAction(data)
52 action.WillRunAction(None, self._tab)
53 # Both videos not playing before running action.
54 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
55 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
56 action.RunAction(None, self._tab, None)
57 # Assert all media elements played.
58 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
59 self.assertTrue(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
61 # http://crbug.com/273887
62 def testPlayWaitForPlayTimeout(self):
63 """Tests that wait_for_playing timeouts if video does not play."""
64 data = {'selector': '#video_1',
65 'wait_for_playing': True,
67 action = play.PlayAction(data)
68 action.WillRunAction(None, self._tab)
69 self._tab.EvaluateJavaScript('document.getElementById("video_1").src = ""')
70 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
71 self.assertRaises(util.TimeoutException, action.RunAction, None, self._tab,
74 def testPlayWaitForEnded(self):
75 """Tests that wait_for_ended waits for video to end."""
76 data = {'selector': '#video_1', 'wait_for_ended': True}
77 action = play.PlayAction(data)
78 action.WillRunAction(None, self._tab)
79 # Assert video not playing before running action.
80 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
81 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
82 action.RunAction(None, self._tab, None)
84 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
86 def testPlayWithoutWaitForEnded(self):
87 """Tests that wait_for_ended waits for video to end."""
88 data = {'selector': '#video_1', 'wait_for_ended': False}
89 action = play.PlayAction(data)
90 action.WillRunAction(None, self._tab)
91 # Assert video not playing before running action.
92 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
93 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
94 action.RunAction(None, self._tab, None)
95 # Assert video did not end.
96 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
98 def testPlayWaitForEndedTimeout(self):
99 """Tests that action raises exception if timeout is reached."""
100 data = {'selector': '#video_1', 'wait_for_ended': True, 'wait_timeout': 1}
101 action = play.PlayAction(data)
102 action.WillRunAction(None, self._tab)
103 # Assert video not playing before running action.
104 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
105 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
106 self.assertRaises(util.TimeoutException, action.RunAction, None, self._tab,
108 # Assert video did not end.
109 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))