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 import decorators
6 from telemetry.core import util
7 from telemetry.page.actions import play
8 from telemetry.unittest import tab_test_case
11 AUDIO_1_PLAYING_CHECK = 'window.__hasEventCompleted("#audio_1", "playing");'
12 VIDEO_1_PLAYING_CHECK = 'window.__hasEventCompleted("#video_1", "playing");'
13 VIDEO_1_ENDED_CHECK = 'window.__hasEventCompleted("#video_1", "ended");'
16 class PlayActionTest(tab_test_case.TabTestCase):
19 tab_test_case.TabTestCase.setUp(self)
20 self.Navigate('video_test.html')
22 @decorators.Disabled('android')
23 def testPlayWithNoSelector(self):
24 """Tests that with no selector Play action plays first video element."""
25 data = {'wait_for_playing': True}
26 action = play.PlayAction(data)
27 action.WillRunAction(None, self._tab)
28 # Both videos not playing before running action.
29 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
30 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
31 action.RunAction(None, self._tab)
32 # Assert only first video has played.
33 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
34 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
36 @decorators.Disabled('android')
37 def testPlayWithVideoSelector(self):
38 """Tests that Play action plays video element matching selector."""
39 data = {'selector': '#video_1', 'wait_for_playing': True}
40 action = play.PlayAction(data)
41 action.WillRunAction(None, self._tab)
42 # Both videos not playing before running action.
43 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
44 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
45 action.RunAction(None, self._tab)
46 # Assert only video matching selector has played.
47 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
48 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
50 @decorators.Disabled('android')
51 def testPlayWithAllSelector(self):
52 """Tests that Play action plays all video elements with selector='all'."""
53 data = {'selector': 'all', 'wait_for_playing': True}
54 action = play.PlayAction(data)
55 action.WillRunAction(None, self._tab)
56 # Both videos not playing before running action.
57 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
58 self.assertFalse(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
59 action.RunAction(None, self._tab)
60 # Assert all media elements played.
61 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
62 self.assertTrue(self._tab.EvaluateJavaScript(AUDIO_1_PLAYING_CHECK))
64 # http://crbug.com/273887
65 def testPlayWaitForPlayTimeout(self):
66 """Tests that wait_for_playing timeouts if video does not play."""
67 data = {'selector': '#video_1',
68 'wait_for_playing': True,
70 action = play.PlayAction(data)
71 action.WillRunAction(None, self._tab)
72 self._tab.EvaluateJavaScript('document.getElementById("video_1").src = ""')
73 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
74 self.assertRaises(util.TimeoutException, action.RunAction, None, self._tab)
76 @decorators.Disabled('android')
77 def testPlayWaitForEnded(self):
78 """Tests that wait_for_ended waits for video to end."""
79 data = {'selector': '#video_1', 'wait_for_ended': True}
80 action = play.PlayAction(data)
81 action.WillRunAction(None, self._tab)
82 # Assert video not playing before running action.
83 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
84 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
85 action.RunAction(None, self._tab)
87 self.assertTrue(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
89 def testPlayWithoutWaitForEnded(self):
90 """Tests that wait_for_ended waits for video to end."""
91 data = {'selector': '#video_1', 'wait_for_ended': False}
92 action = play.PlayAction(data)
93 action.WillRunAction(None, self._tab)
94 # Assert video not playing before running action.
95 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
96 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
97 action.RunAction(None, self._tab)
98 # Assert video did not end.
99 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
101 def testPlayWaitForEndedTimeout(self):
102 """Tests that action raises exception if timeout is reached."""
103 data = {'selector': '#video_1', 'wait_for_ended': True, 'wait_timeout': 1}
104 action = play.PlayAction(data)
105 action.WillRunAction(None, self._tab)
106 # Assert video not playing before running action.
107 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_PLAYING_CHECK))
108 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))
109 self.assertRaises(util.TimeoutException, action.RunAction, None, self._tab)
110 # Assert video did not end.
111 self.assertFalse(self._tab.EvaluateJavaScript(VIDEO_1_ENDED_CHECK))