1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry import benchmark
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)from telemetry.core import exceptions
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)from telemetry.core import util
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.core.platform import tracing_category_filter
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.core.platform import tracing_options
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)from telemetry.page.actions import action_runner as action_runner_module
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.page.actions import page_action
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.timeline import model
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)from telemetry.unittest import tab_test_case
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)from telemetry.web_perf import timeline_interaction_record as tir_module
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ActionRunnerInteractionTest(tab_test_case.TabTestCase):
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def GetInteractionRecords(self, trace_data):
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    timeline_model = model.TimelineModel(trace_data)
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    renderer_thread = timeline_model.GetRendererThreadFromTabId(self._tab.id)
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return [
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        tir_module.TimelineInteractionRecord.FromAsyncEvent(e)
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        for e in renderer_thread.async_slices
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        if tir_module.IsTimelineInteractionRecord(e.name)
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ]
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def VerifyIssuingInteractionRecords(self, **interaction_kwargs):
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.Navigate('interaction_enabled_page.html')
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.Wait(1)
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    options = tracing_options.TracingOptions()
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    options.enable_chrome_trace = True
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._browser.platform.tracing_controller.Start(
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        options, tracing_category_filter.CreateNoOverheadFilter())
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    interaction = action_runner.BeginInteraction('InteractionName',
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                 **interaction_kwargs)
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    interaction.End()
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    trace_data = self._browser.platform.tracing_controller.Stop()
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    records = self.GetInteractionRecords(trace_data)
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEqual(
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        1, len(records),
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'Failed to issue the interaction record on the tracing timeline.'
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ' Trace data:\n%s' % repr(trace_data.EventData()))
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEqual('InteractionName', records[0].label)
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for attribute_name in interaction_kwargs:
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      self.assertTrue(getattr(records[0], attribute_name))
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  @benchmark.Disabled('chromeos')
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def testIssuingMultipleMeasurementInteractionRecords(self):
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.VerifyIssuingInteractionRecords(is_fast=True)
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.VerifyIssuingInteractionRecords(is_responsive=True)
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.VerifyIssuingInteractionRecords(is_smooth=True)
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.VerifyIssuingInteractionRecords(is_fast=True, is_smooth=True)
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ActionRunnerTest(tab_test_case.TabTestCase):
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def testExecuteJavaScript(self):
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.Navigate('blank.html')
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    action_runner.ExecuteJavaScript('var testing = 42;')
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertEqual(42, self._tab.EvaluateJavaScript('testing'))
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def testWaitForNavigate(self):
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.Navigate('page_with_link.html')
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ClickElement('#clickme')
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    action_runner.WaitForNavigate()
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertTrue(self._tab.EvaluateJavaScript(
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'document.readyState == "interactive" || '
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'document.readyState == "complete"'))
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        self._tab.EvaluateJavaScript('document.location.pathname;'),
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '/blank.html')
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def testWait(self):
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab)
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.Navigate('blank.html')
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript(
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        'window.setTimeout(function() { window.testing = 101; }, 50);')
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    action_runner.Wait(0.1)
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(101, self._tab.EvaluateJavaScript('window.testing'))
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript(
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        'window.setTimeout(function() { window.testing = 102; }, 100);')
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    action_runner.Wait(0.2)
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(102, self._tab.EvaluateJavaScript('window.testing'))
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def testWaitForJavaScriptCondition(self):
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.Navigate('blank.html')
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript('window.testing = 219;')
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.WaitForJavaScriptCondition(
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        'window.testing == 219', timeout_in_seconds=0.1)
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript(
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        'window.setTimeout(function() { window.testing = 220; }, 50);')
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.WaitForJavaScriptCondition(
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        'window.testing == 220', timeout_in_seconds=0.1)
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(220, self._tab.EvaluateJavaScript('window.testing'))
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def testWaitForElement(self):
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.Navigate('blank.html')
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript(
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '(function() {'
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  var el = document.createElement("div");'
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  el.id = "test1";'
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  el.textContent = "foo";'
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  document.body.appendChild(el);'
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '})()')
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    action_runner.WaitForElement('#test1', timeout_in_seconds=0.1)
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    action_runner.WaitForElement(text='foo', timeout_in_seconds=0.1)
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.WaitForElement(
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        element_function='document.getElementById("test1")')
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript(
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        'window.setTimeout(function() {'
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  var el = document.createElement("div");'
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  el.id = "test2";'
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  document.body.appendChild(el);'
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        '}, 50)')
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    action_runner.WaitForElement('#test2', timeout_in_seconds=0.1)
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript(
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        'window.setTimeout(function() {'
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  document.getElementById("test2").textContent = "bar";'
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        '}, 50)')
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    action_runner.WaitForElement(text='bar', timeout_in_seconds=0.1)
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript(
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        'window.setTimeout(function() {'
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  var el = document.createElement("div");'
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  el.id = "test3";'
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  document.body.appendChild(el);'
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        '}, 50)')
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.WaitForElement(
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        element_function='document.getElementById("test3")')
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def testWaitForElementWithWrongText(self):
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.Navigate('blank.html')
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript(
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '(function() {'
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  var el = document.createElement("div");'
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  el.id = "test1";'
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  el.textContent = "foo";'
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '  document.body.appendChild(el);'
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        '})()')
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    action_runner.WaitForElement('#test1', timeout_in_seconds=0.2)
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    def WaitForElement():
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      action_runner.WaitForElement(text='oo', timeout_in_seconds=0.2)
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertRaises(util.TimeoutException, WaitForElement)
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def testClickElement(self):
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.Navigate('page_with_clickables.html')
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript('valueSettableByTest = 1;')
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ClickElement('#test')
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(1, action_runner.EvaluateJavaScript('valueToTest'))
171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript('valueSettableByTest = 2;')
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ClickElement(text='Click/tap me')
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(2, action_runner.EvaluateJavaScript('valueToTest'))
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript('valueSettableByTest = 3;')
177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ClickElement(
178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        element_function='document.body.firstElementChild;')
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(3, action_runner.EvaluateJavaScript('valueToTest'))
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    def WillFail():
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      action_runner.ClickElement('#notfound')
183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertRaises(exceptions.EvaluateException, WillFail)
184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @benchmark.Disabled('debug')
186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def testTapElement(self):
187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.Navigate('page_with_clickables.html')
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript('valueSettableByTest = 1;')
192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.TapElement('#test')
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(1, action_runner.EvaluateJavaScript('valueToTest'))
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript('valueSettableByTest = 2;')
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.TapElement(text='Click/tap me')
197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(2, action_runner.EvaluateJavaScript('valueToTest'))
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.ExecuteJavaScript('valueSettableByTest = 3;')
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.TapElement(
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        element_function='document.body.firstElementChild')
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertEqual(3, action_runner.EvaluateJavaScript('valueToTest'))
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    def WillFail():
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      action_runner.TapElement('#notfound')
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertRaises(exceptions.EvaluateException, WillFail)
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def testScroll(self):
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if not page_action.IsGestureSourceTypeSupported(
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self._tab, 'touch'):
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.Navigate('page_with_swipeables.html')
21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    action_runner.ScrollElement(
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        selector='#left-right', direction='right', left_start_ratio=0.9)
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertTrue(action_runner.EvaluateJavaScript(
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'document.querySelector("#left-right").scrollLeft') > 75)
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    action_runner.ScrollElement(
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        selector='#top-bottom', direction='down', top_start_ratio=0.9)
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertTrue(action_runner.EvaluateJavaScript(
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'document.querySelector("#top-bottom").scrollTop') > 75)
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    action_runner.ScrollPage(direction='right', left_start_ratio=0.9,
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             distance=100)
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertTrue(action_runner.EvaluateJavaScript(
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'document.body.scrollLeft') > 75)
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def testSwipe(self):
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if not page_action.IsGestureSourceTypeSupported(
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        self._tab, 'touch'):
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.Navigate('page_with_swipeables.html')
23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    action_runner = action_runner_module.ActionRunner(self._tab,
23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                      skip_waits=True)
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.SwipeElement(
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        selector='#left-right', direction='left', left_start_ratio=0.9)
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertTrue(action_runner.EvaluateJavaScript(
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        'document.querySelector("#left-right").scrollLeft') > 75)
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.SwipeElement(
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        selector='#top-bottom', direction='up', top_start_ratio=0.9)
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertTrue(action_runner.EvaluateJavaScript(
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        'document.querySelector("#top-bottom").scrollTop') > 75)
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    action_runner.SwipePage(direction='left', left_start_ratio=0.9)
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self.assertTrue(action_runner.EvaluateJavaScript(
251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        'document.body.scrollLeft') > 75)
252