run_py_tests.py revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""End to end tests for ChromeDriver."""
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import base64
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import json
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import math
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)import optparse
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport os
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import socket
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import subprocess
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import tempfile
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import threading
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import time
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)import urllib2
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_THIS_DIR = os.path.abspath(os.path.dirname(__file__))
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)sys.path.insert(1, os.path.join(_THIS_DIR, os.pardir))
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)sys.path.insert(1, os.path.join(_THIS_DIR, os.pardir, 'client'))
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sys.path.insert(1, os.path.join(_THIS_DIR, os.pardir, 'server'))
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import chrome_paths
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import chromedriver
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest_util
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import util
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import server
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from webelement import WebElement
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import webserver
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_TEST_DATA_DIR = os.path.join(chrome_paths.GetTestData(), 'chromedriver')
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if util.IsLinux():
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.path.insert(0, os.path.join(chrome_paths.GetSrc(), 'build', 'android'))
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from pylib import android_commands
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from pylib import constants
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from pylib import forwarder
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from pylib import valgrind_tools
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  from pylib.device import device_utils
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_NEGATIVE_FILTER = [
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # https://code.google.com/p/chromedriver/issues/detail?id=213
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ChromeDriverTest.testClickElementInSubFrame',
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This test is flaky since it uses setTimeout.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Re-enable once crbug.com/177511 is fixed and we can remove setTimeout.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ChromeDriverTest.testAlert',
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)]
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_VERSION_SPECIFIC_FILTER = {}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_VERSION_SPECIFIC_FILTER['HEAD'] = [
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # https://code.google.com/p/chromedriver/issues/detail?id=815
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'ChromeDriverTest.testShouldHandleNewWindowLoadingProperly',
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)]
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)_OS_SPECIFIC_FILTER = {}
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)_OS_SPECIFIC_FILTER['win'] = [
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # https://code.google.com/p/chromedriver/issues/detail?id=214
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'ChromeDriverTest.testCloseWindow',
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # https://code.google.com/p/chromedriver/issues/detail?id=299
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ChromeLogPathCapabilityTest.testChromeLogPath',
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)]
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_OS_SPECIFIC_FILTER['linux'] = [
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Xvfb doesn't support maximization.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ChromeDriverTest.testWindowMaximize',
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # https://code.google.com/p/chromedriver/issues/detail?id=302
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    'ChromeDriverTest.testWindowPosition',
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    'ChromeDriverTest.testWindowSize',
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch]
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch_OS_SPECIFIC_FILTER['mac'] = [
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    # https://code.google.com/p/chromedriver/issues/detail?id=304
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    'ChromeDriverTest.testGoBackAndGoForward',
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch]
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_DESKTOP_NEGATIVE_FILTER = [
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Desktop doesn't support touch (without --touch-events).
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ChromeDriverTest.testSingleTapElement',
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ChromeDriverTest.testTouchDownUpElement',
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ChromeDriverTest.testTouchFlickElement',
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ChromeDriverTest.testTouchMovedElement',
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'ChromeDriverAndroidTest.*',
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)]
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochdef _GetDesktopNegativeFilter(version_name):
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  filter = _NEGATIVE_FILTER + _DESKTOP_NEGATIVE_FILTER
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  os = util.GetPlatformName()
92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if os in _OS_SPECIFIC_FILTER:
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    filter += _OS_SPECIFIC_FILTER[os]
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if version_name in _VERSION_SPECIFIC_FILTER:
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    filter += _VERSION_SPECIFIC_FILTER[version_name]
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return filter
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)_ANDROID_NEGATIVE_FILTER = {}
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch_ANDROID_NEGATIVE_FILTER['chrome'] = (
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    _NEGATIVE_FILTER + [
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        # TODO(chrisgao): fix hang of tab crash test on android.
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'ChromeDriverTest.testTabCrash',
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        # Android doesn't support switches and extensions.
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'ChromeSwitchesCapabilityTest.*',
105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        'ChromeExtensionsCapabilityTest.*',
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        'MobileEmulationCapabilityTest.*',
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # https://crbug.com/274650
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'ChromeDriverTest.testCloseWindow',
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        # https://code.google.com/p/chromedriver/issues/detail?id=270
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'ChromeDriverTest.testPopups',
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        # https://code.google.com/p/chromedriver/issues/detail?id=298
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'ChromeDriverTest.testWindowPosition',
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'ChromeDriverTest.testWindowSize',
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        'ChromeDriverTest.testWindowMaximize',
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        'ChromeLogPathCapabilityTest.testChromeLogPath',
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        'RemoteBrowserTest.*',
117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        # Don't enable perf testing on Android yet.
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'PerfTest.testSessionStartTime',
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'PerfTest.testSessionStopTime',
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        'PerfTest.testColdExecuteScript',
121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        # https://code.google.com/p/chromedriver/issues/detail?id=459
122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        'ChromeDriverTest.testShouldHandleNewWindowLoadingProperly',
123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ]
124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch)
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch_ANDROID_NEGATIVE_FILTER['chrome_stable'] = (
126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    _ANDROID_NEGATIVE_FILTER['chrome'])
127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch_ANDROID_NEGATIVE_FILTER['chrome_beta'] = (
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    _ANDROID_NEGATIVE_FILTER['chrome'])
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_ANDROID_NEGATIVE_FILTER['chrome_shell'] = (
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _ANDROID_NEGATIVE_FILTER['chrome'] + [
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # ChromeShell doesn't support multiple tabs.
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'ChromeDriverTest.testGetWindowHandles',
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'ChromeDriverTest.testSwitchToWindow',
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'ChromeDriverTest.testShouldHandleNewWindowLoadingProperly',
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ]
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles))
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)_ANDROID_NEGATIVE_FILTER['chromedriver_webview_shell'] = (
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    _ANDROID_NEGATIVE_FILTER['chrome_shell'])
139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ChromeDriverBaseTest(unittest.TestCase):
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  """Base class for testing chromedriver functionalities."""
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def __init__(self, *args, **kwargs):
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(ChromeDriverBaseTest, self).__init__(*args, **kwargs)
146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    self._drivers = []
147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  def tearDown(self):
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    for driver in self._drivers:
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      try:
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        driver.Quit()
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      except:
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        pass
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def CreateDriver(self, server_url=None, **kwargs):
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if server_url is None:
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      server_url = _CHROMEDRIVER_SERVER_URL
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    android_package = None
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    android_activity = None
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    android_process = None
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if _ANDROID_PACKAGE_KEY:
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      android_package = constants.PACKAGE_INFO[_ANDROID_PACKAGE_KEY].package
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if _ANDROID_PACKAGE_KEY == 'chromedriver_webview_shell':
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        android_activity = constants.PACKAGE_INFO[_ANDROID_PACKAGE_KEY].activity
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        android_process = '%s:main' % android_package
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver = chromedriver.ChromeDriver(server_url,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       chrome_binary=_CHROME_BINARY,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       android_package=android_package,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       android_activity=android_activity,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       android_process=android_process,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       **kwargs)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._drivers += [driver]
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return driver
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeDriverTest(ChromeDriverBaseTest):
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """End to end tests for ChromeDriver."""
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @staticmethod
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GlobalSetUp():
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeDriverTest._http_server = webserver.WebServer(
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome_paths.GetTestData())
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeDriverTest._sync_server = webserver.SyncWebServer()
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if _ANDROID_PACKAGE_KEY:
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChromeDriverTest._device = device_utils.DeviceUtils(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          android_commands.GetAttachedDevices()[0])
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      http_host_port = ChromeDriverTest._http_server._server.server_port
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sync_host_port = ChromeDriverTest._sync_server._server.server_port
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      forwarder.Forwarder.Map(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          [(http_host_port, http_host_port), (sync_host_port, sync_host_port)],
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ChromeDriverTest._device)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @staticmethod
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  def GlobalTearDown():
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if _ANDROID_PACKAGE_KEY:
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      forwarder.Forwarder.UnmapAllDevicePorts(ChromeDriverTest._device)
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ChromeDriverTest._http_server.Shutdown()
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @staticmethod
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetHttpUrlForFile(file_path):
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ChromeDriverTest._http_server.GetUrl() + file_path
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  def setUp(self):
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    self._driver = self.CreateDriver()
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  def testStartStop(self):
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    pass
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testLoadUrl(self):
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/empty.html'))
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  def testGetCurrentWindowHandle(self):
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    self._driver.GetCurrentWindowHandle()
216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  def _WaitForNewWindow(self, old_handles):
218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    """Wait for at least one new window to show up in 20 seconds.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      old_handles: Handles to all old windows before the new window is added.
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Returns:
224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      Handle to a new window. None if timeout.
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    """
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    timeout = time.time() + 20
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while time.time() < timeout:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_handles = self._driver.GetWindowHandles()
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if len(new_handles) > len(old_handles):
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for index, old_handle in enumerate(old_handles):
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.assertEquals(old_handle, new_handles[index])
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return new_handles[len(old_handles)]
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      time.sleep(0.01)
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return None
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testCloseWindow(self):
237e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/page_test.html'))
238e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    old_handles = self._driver.GetWindowHandles()
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.FindElement('id', 'link').Click()
240e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    new_window_handle = self._WaitForNewWindow(old_handles)
241e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    self.assertNotEqual(None, new_window_handle)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToWindow(new_window_handle)
243e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    self.assertEquals(new_window_handle, self._driver.GetCurrentWindowHandle())
244e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    self.assertRaises(chromedriver.NoSuchElement,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      self._driver.FindElement, 'id', 'link')
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.CloseWindow()
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(chromedriver.NoSuchWindow,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      self._driver.GetCurrentWindowHandle)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_handles = self._driver.GetWindowHandles()
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for old_handle in old_handles:
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(old_handle in new_handles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for handle in new_handles:
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self._driver.SwitchToWindow(handle)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertEquals(handle, self._driver.GetCurrentWindowHandle())
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self._driver.CloseWindow()
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetWindowHandles(self):
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/page_test.html'))
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_handles = self._driver.GetWindowHandles()
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.FindElement('id', 'link').Click()
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(None, self._WaitForNewWindow(old_handles))
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSwitchToWindow(self):
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/page_test.html'))
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        1, self._driver.ExecuteScript('window.name = "oldWindow"; return 1;'))
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window1_handle = self._driver.GetCurrentWindowHandle()
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_handles = self._driver.GetWindowHandles()
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.FindElement('id', 'link').Click()
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_window_handle = self._WaitForNewWindow(old_handles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(None, new_window_handle)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToWindow(new_window_handle)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(new_window_handle, self._driver.GetCurrentWindowHandle())
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(chromedriver.NoSuchElement,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      self._driver.FindElement, 'id', 'link')
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToWindow('oldWindow')
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(window1_handle, self._driver.GetCurrentWindowHandle())
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testEvaluateScript(self):
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, self._driver.ExecuteScript('return 1'))
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(None, self._driver.ExecuteScript(''))
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  def testEvaluateScriptWithArgs(self):
2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    script = ('document.body.innerHTML = "<div>b</div><div>c</div>";'
2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              'return {stuff: document.querySelectorAll("div")};')
286b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    stuff = self._driver.ExecuteScript(script)['stuff']
287b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    script = 'return arguments[0].innerHTML + arguments[1].innerHTML'
288b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    self.assertEquals(
289b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        'bc', self._driver.ExecuteScript(script, stuff[0], stuff[1]))
2907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
291b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  def testEvaluateInvalidScript(self):
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(chromedriver.ChromeDriverException,
293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                      self._driver.ExecuteScript, '{{{')
294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExecuteAsyncScript(self):
296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._driver.SetTimeout('script', 3000)
297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self.assertRaises(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chromedriver.ScriptTimeout,
299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        self._driver.ExecuteAsyncScript,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var callback = arguments[0];'
301e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        'setTimeout(function(){callback(1);}, 10000);')
302e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    self.assertEquals(
303e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        2,
304e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        self._driver.ExecuteAsyncScript(
305e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            'var callback = arguments[0];'
306e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            'setTimeout(function(){callback(2);}, 300);'))
307e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
308e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  def testSwitchToFrame(self):
309e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    self._driver.ExecuteScript(
310e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        'var frame = document.createElement("iframe");'
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'frame.id="id";'
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'frame.name="name";'
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.appendChild(frame);')
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top == window'))
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self._driver.SwitchToFrame('id')
31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top != window'))
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self._driver.SwitchToMainFrame()
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top == window'))
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self._driver.SwitchToFrame('name')
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top != window'))
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self._driver.SwitchToMainFrame()
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top == window'))
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToFrameByIndex(0)
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top != window'))
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToMainFrame()
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top == window'))
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToFrame(self._driver.FindElement('tag name', 'iframe'))
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top != window'))
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSwitchToParentFrame(self):
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/nested.html'))
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('One' in self._driver.GetPageSource())
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._driver.SwitchToFrameByIndex(0)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('Two' in self._driver.GetPageSource())
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToFrameByIndex(0)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('Three' in self._driver.GetPageSource())
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._driver.SwitchToParentFrame()
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('Two' in self._driver.GetPageSource())
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToParentFrame()
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue('One' in self._driver.GetPageSource())
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testExecuteInRemovedFrame(self):
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.ExecuteScript(
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var frame = document.createElement("iframe");'
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'frame.id="id";'
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'frame.name="name";'
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.appendChild(frame);'
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'window.addEventListener("message",'
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '    function(event) { document.body.removeChild(frame); });')
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top == window'))
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToFrame('id')
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top != window'))
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self._driver.ExecuteScript('parent.postMessage("remove", "*");')
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return window.top == window'))
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetTitle(self):
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script = 'document.title = "title"; return 1;'
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, self._driver.ExecuteScript(script))
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('title', self._driver.GetTitle())
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetPageSource(self):
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/page_test.html'))
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertTrue('Link to empty.html' in self._driver.GetPageSource())
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFindElement(self):
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._driver.ExecuteScript(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>a</div><div>b</div>";')
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertTrue(
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        isinstance(self._driver.FindElement('tag name', 'div'), WebElement))
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFindElements(self):
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self._driver.ExecuteScript(
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        'document.body.innerHTML = "<div>a</div><div>b</div>";')
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    divs = self._driver.FindElements('tag name', 'div')
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertTrue(isinstance(divs, list))
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(2, len(divs))
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for div in divs:
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(isinstance(div, WebElement))
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFindChildElement(self):
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.ExecuteScript(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div><br><br></div><div><a></a></div>";')
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    element = self._driver.FindElement('tag name', 'div')
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        isinstance(element.FindElement('tag name', 'br'), WebElement))
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testFindChildElements(self):
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.ExecuteScript(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div><br><br></div><div><br></div>";')
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    element = self._driver.FindElement('tag name', 'div')
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    brs = element.FindElements('tag name', 'br')
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(isinstance(brs, list))
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEquals(2, len(brs))
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for br in brs:
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(isinstance(br, WebElement))
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testHoverOverElement(self):
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div = self._driver.ExecuteScript(
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("mouseover", function() {'
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  document.body.appendChild(document.createElement("br"));'
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return div;')
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    div.HoverOver()
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testClickElement(self):
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div = self._driver.ExecuteScript(
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("click", function() {'
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  div.innerHTML="new<br>";'
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return div;')
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div.Click()
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSingleTapElement(self):
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div = self._driver.ExecuteScript(
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("touchend", function() {'
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  div.innerHTML="new<br>";'
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return div;')
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div.SingleTap()
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testTouchDownUpElement(self):
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div = self._driver.ExecuteScript(
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("touchend", function() {'
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  div.innerHTML="new<br>";'
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        '});'
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return div;')
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loc = div.GetLocation()
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.TouchDown(loc['x'], loc['y'])
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.TouchUp(loc['x'], loc['y'])
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTouchFlickElement(self):
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dx = 3
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dy = 4
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    speed = 5
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flickTouchEventsPerSecond = 30
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    moveEvents = int(
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        math.sqrt(dx * dx + dy * dy) * flickTouchEventsPerSecond / speed)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div = self._driver.ExecuteScript(
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("touchstart", function() {'
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  div.innerHTML = "preMove0";'
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("touchmove", function() {'
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  res = div.innerHTML.match(/preMove(\d+)/);'
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  if (res != null) {'
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '    div.innerHTML = "preMove" + (parseInt(res[1], 10) + 1);'
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  }'
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        '});'
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("touchend", function() {'
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  if (div.innerHTML == "preMove' + str(moveEvents) + '") {'
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '    div.innerHTML = "new<br>";'
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  }'
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        'return div;')
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.TouchFlick(div, dx, dy, speed)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTouchMovedElement(self):
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div = self._driver.ExecuteScript(
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("touchmove", function() {'
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        '  div.innerHTML="new<br>";'
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return div;')
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loc = div.GetLocation()
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.TouchDown(loc['x'], loc['y'])
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.TouchMove(loc['x'] + 1, loc['y'] + 1)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.TouchUp(loc['x'] + 1, loc['y'] + 1)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testClickElementInSubFrame(self):
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/frame_test.html'))
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    frame = self._driver.FindElement('tag name', 'iframe')
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToFrame(frame)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Test clicking element in the sub frame.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.testClickElement()
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testClearElement(self):
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = self._driver.ExecuteScript(
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = \'<input type="text" value="abc">\';'
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var input = document.getElementsByTagName("input")[0];'
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'input.addEventListener("change", function() {'
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  document.body.appendChild(document.createElement("br"));'
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return input;')
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text.Clear()
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSendKeysToElement(self):
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text = self._driver.ExecuteScript(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = \'<input type="text">\';'
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var input = document.getElementsByTagName("input")[0];'
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'input.addEventListener("change", function() {'
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  document.body.appendChild(document.createElement("br"));'
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return input;')
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text.SendKeys('0123456789+-*/ Hi')
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    text.SendKeys(', there!')
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value = self._driver.ExecuteScript('return arguments[0].value;', text)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('0123456789+-*/ Hi, there!', value)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGetCurrentUrl(self):
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('data:,', self._driver.GetCurrentUrl())
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testGoBackAndGoForward(self):
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/empty.html'))
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.GoBack()
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.GoForward()
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testRefresh(self):
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/empty.html'))
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Refresh()
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMouseMoveTo(self):
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div = self._driver.ExecuteScript(
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.style["width"] = "100px";'
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.style["height"] = "100px";'
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("mouseover", function() {'
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  var div = document.getElementsByTagName("div")[0];'
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  div.innerHTML="new<br>";'
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return div;')
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.MouseMoveTo(div, 10, 10)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMouseClick(self):
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div = self._driver.ExecuteScript(
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.style["width"] = "100px";'
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.style["height"] = "100px";'
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("click", function() {'
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  var div = document.getElementsByTagName("div")[0];'
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  div.innerHTML="new<br>";'
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return div;')
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.MouseMoveTo(div)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.MouseClick()
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testMouseButtonDownAndUp(self):
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.ExecuteScript(
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.style["width"] = "100px";'
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.style["height"] = "100px";'
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'div.addEventListener("mousedown", function() {'
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  var div = document.getElementsByTagName("div")[0];'
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  div.innerHTML="new1<br>";'
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("mouseup", function() {'
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  var div = document.getElementsByTagName("div")[0];'
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  div.innerHTML="new2<a></a>";'
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});')
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.MouseMoveTo(None, 50, 50)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.MouseButtonDown()
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.MouseButtonUp()
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'a')))
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testMouseDoubleClick(self):
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    div = self._driver.ExecuteScript(
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'document.body.innerHTML = "<div>old</div>";'
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'var div = document.getElementsByTagName("div")[0];'
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.style["width"] = "100px";'
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.style["height"] = "100px";'
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'div.addEventListener("dblclick", function() {'
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  var div = document.getElementsByTagName("div")[0];'
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  div.innerHTML="new<br>";'
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '});'
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return div;')
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.MouseMoveTo(div, 1, 1)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.MouseDoubleClick()
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(1, len(self._driver.FindElements('tag name', 'br')))
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testAlert(self):
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(self._driver.IsAlertOpen())
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.ExecuteScript(
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'window.setTimeout('
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '    function() { window.confirmed = confirm(\'HI\'); },'
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '    0);')
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue(self._driver.IsAlertOpen())
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals('HI', self._driver.GetAlertMessage())
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.HandleAlert(False)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(self._driver.IsAlertOpen())
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(False,
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      self._driver.ExecuteScript('return window.confirmed'))
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testShouldHandleNewWindowLoadingProperly(self):
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Tests that ChromeDriver determines loading correctly for new windows."""
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._http_server.SetDataForPath(
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '/newwindow',
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        """
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        <html>
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        <body>
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        <a href='%s' target='_blank'>new window/tab</a>
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        </body>
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        </html>""" % self._sync_server.GetUrl())
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self._http_server.GetUrl() + '/newwindow')
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_windows = self._driver.GetWindowHandles()
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.FindElement('tagName', 'a').Click()
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_window = self._WaitForNewWindow(old_windows)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertNotEqual(None, new_window)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(self._driver.IsLoading())
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SwitchToWindow(new_window)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self._driver.IsLoading())
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._sync_server.RespondWithContent('<html>new window</html>')
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.ExecuteScript('return 1')  # Shouldn't hang.
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPopups(self):
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/empty.html'))
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    old_handles = self._driver.GetWindowHandles()
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.ExecuteScript('window.open("about:blank")')
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_window_handle = self._WaitForNewWindow(old_handles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(None, new_window_handle)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testNoSuchFrame(self):
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertRaises(chromedriver.NoSuchFrame,
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      self._driver.SwitchToFrame, 'nosuchframe')
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(chromedriver.NoSuchFrame,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      self._driver.SwitchToFrame,
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      self._driver.FindElement('tagName', 'body'))
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testWindowPosition(self):
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    position = self._driver.GetWindowPosition()
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._driver.SetWindowPosition(position[0], position[1])
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEquals(position, self._driver.GetWindowPosition())
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Resize so the window isn't moved offscreen.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # See https://code.google.com/p/chromedriver/issues/detail?id=297.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._driver.SetWindowSize(300, 300)
649010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
650010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.SetWindowPosition(100, 200)
651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertEquals([100, 200], self._driver.GetWindowPosition())
652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testWindowSize(self):
654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    size = self._driver.GetWindowSize()
655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.SetWindowSize(size[0], size[1])
656010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertEquals(size, self._driver.GetWindowSize())
657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.SetWindowSize(600, 400)
659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertEquals([600, 400], self._driver.GetWindowSize())
660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testWindowMaximize(self):
662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.SetWindowPosition(100, 200)
663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.SetWindowSize(600, 400)
664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.MaximizeWindow()
665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertNotEqual([100, 200], self._driver.GetWindowPosition())
667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertNotEqual([600, 400], self._driver.GetWindowSize())
668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # Set size first so that the window isn't moved offscreen.
669010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # See https://code.google.com/p/chromedriver/issues/detail?id=297.
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.SetWindowSize(600, 400)
671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.SetWindowPosition(100, 200)
672010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertEquals([100, 200], self._driver.GetWindowPosition())
673010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertEquals([600, 400], self._driver.GetWindowSize())
674010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
675010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testConsoleLogSources(self):
676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/console_log.html'))
677010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    logs = self._driver.GetLog('browser')
678010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertEquals(len(logs), 2)
679010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertEquals(logs[0]['source'], 'network')
680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertEquals(logs[1]['source'], 'javascript')
681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
682010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testAutoReporting(self):
683010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertFalse(self._driver.IsAutoReporting())
684010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.SetAutoReporting(True)
685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertTrue(self._driver.IsAutoReporting())
686010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    url = self.GetHttpUrlForFile('/chromedriver/console_log.html')
687010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertRaisesRegexp(chromedriver.UnknownError,
688010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            '.*(404|Failed to load resource).*',
689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            self._driver.Load,
690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            url)
691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testContextMenuEventFired(self):
693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.Load(self.GetHttpUrlForFile('/chromedriver/context_menu.html'))
694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.MouseMoveTo(self._driver.FindElement('tagName', 'div'))
695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.MouseClick(2)
696010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return success'))
697010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
698010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testHasFocusOnStartup(self):
699010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # Some pages (about:blank) cause Chrome to put the focus in URL bar.
700010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # This breaks tests depending on focus.
701010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertTrue(self._driver.ExecuteScript('return document.hasFocus()'))
702010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
703010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testTabCrash(self):
704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # If a tab is crashed, the session will be deleted.
705010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # When 31 is released, will reload the tab instead.
706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # https://code.google.com/p/chromedriver/issues/detail?id=547
707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertRaises(chromedriver.UnknownError,
708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      self._driver.Load, 'chrome://crash')
709010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertRaises(chromedriver.NoSuchSession,
710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                      self._driver.GetCurrentUrl)
711010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
712010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testDoesntHangOnDebugger(self):
713010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver.ExecuteScript('debugger;')
714010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
715010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testMobileEmulationDisabledByDefault(self):
716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertFalse(self._driver.capabilities['mobileEmulationEnabled'])
717010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
718010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
719010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ChromeDriverAndroidTest(ChromeDriverBaseTest):
720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  """End to end tests for Android-specific tests."""
721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testLatestAndroidAppInstalled(self):
723010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if ('stable' not in _ANDROID_PACKAGE_KEY and
724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'beta' not in _ANDROID_PACKAGE_KEY):
725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return
726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._driver = self.CreateDriver()
728010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
729010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    try:
730010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      omaha_list = json.loads(
731010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          urllib2.urlopen('http://omahaproxy.appspot.com/all.json').read())
732010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      for l in omaha_list:
733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        if l['os'] != 'android':
734010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          continue
735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        for v in l['versions']:
736010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if (('stable' in v['channel'] and 'stable' in _ANDROID_PACKAGE_KEY) or
737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              ('beta' in v['channel'] and 'beta' in _ANDROID_PACKAGE_KEY)):
738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            omaha = map(int, v['version'].split('.'))
739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            device = map(int, self._driver.capabilities['version'].split('.'))
740010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            self.assertTrue(omaha <= device)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise RuntimeError('Malformed omaha JSON')
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except urllib2.URLError as e:
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print 'Unable to fetch current version info from omahaproxy (%s)' % e
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDeviceManagement(self):
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._drivers = [self.CreateDriver() for x in
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     android_commands.GetAttachedDevices()]
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertRaises(chromedriver.UnknownError, self.CreateDriver)
750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._drivers[0].Quit()
751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._drivers[0] = self.CreateDriver()
752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ChromeSwitchesCapabilityTest(ChromeDriverBaseTest):
755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  """Tests that chromedriver properly processes chromeOptions.args capabilities.
756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Makes sure the switches are passed to Chrome.
758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  """
759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testSwitchWithoutArgument(self):
761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    """Tests that switch --dom-automation can be passed to Chrome.
762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Unless --dom-automation is specified, window.domAutomationController
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is undefined.
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver = self.CreateDriver(chrome_switches=['dom-automation'])
767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.assertNotEqual(
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        None,
769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        driver.ExecuteScript('return window.domAutomationController'))
770010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeExtensionsCapabilityTest(ChromeDriverBaseTest):
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests that chromedriver properly processes chromeOptions.extensions."""
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def _PackExtension(self, ext_path):
776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return base64.b64encode(open(ext_path, 'rb').read())
777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testExtensionsInstall(self):
779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    """Checks that chromedriver can take the extensions in crx format."""
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crx_1 = os.path.join(_TEST_DATA_DIR, 'ext_test_1.crx')
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crx_2 = os.path.join(_TEST_DATA_DIR, 'ext_test_2.crx')
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.CreateDriver(chrome_extensions=[self._PackExtension(crx_1),
783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         self._PackExtension(crx_2)])
784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testExtensionsInstallZip(self):
786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    """Checks that chromedriver can take the extensions in zip format."""
787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    zip_1 = os.path.join(_TEST_DATA_DIR, 'ext_test_1.zip')
788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self.CreateDriver(chrome_extensions=[self._PackExtension(zip_1)])
789010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def testWaitsForExtensionToLoad(self):
791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    did_load_event = threading.Event()
792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    server = webserver.SyncWebServer()
793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    def RunServer():
794010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      time.sleep(5)
795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      server.RespondWithContent('<html>iframe</html>')
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      did_load_event.set()
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    thread = threading.Thread(target=RunServer)
799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    thread.daemon = True
800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    thread.start()
801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    crx = os.path.join(_TEST_DATA_DIR, 'ext_slow_loader.crx')
802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    driver = self.CreateDriver(
803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        chrome_switches=['user-agent=' + server.GetUrl()],
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome_extensions=[self._PackExtension(crx)])
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(did_load_event.is_set())
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeLogPathCapabilityTest(ChromeDriverBaseTest):
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests that chromedriver properly processes chromeOptions.logPath."""
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOG_MESSAGE = 'Welcome to ChromeLogPathCapabilityTest!'
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testChromeLogPath(self):
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Checks that user can specify the path of the chrome log.
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Verifies that a log message is written into the specified log file.
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tmp_log_path = tempfile.NamedTemporaryFile()
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver = self.CreateDriver(chrome_log_path=tmp_log_path.name)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver.ExecuteScript('console.info("%s")' % self.LOG_MESSAGE)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver.Quit()
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(self.LOG_MESSAGE in open(tmp_log_path.name).read())
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MobileEmulationCapabilityTest(ChromeDriverBaseTest):
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests that ChromeDriver processes chromeOptions.mobileEmulation.
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Makes sure the device metrics are overridden in DevTools and user agent is
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  overridden in Chrome.
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @staticmethod
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GlobalSetUp():
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def respondWithUserAgentString(request):
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return request.GetHeader('User-Agent')
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MobileEmulationCapabilityTest._http_server = webserver.WebServer(
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        chrome_paths.GetTestData())
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MobileEmulationCapabilityTest._http_server.SetCallbackForPath(
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '/userAgent', respondWithUserAgentString)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @staticmethod
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GlobalTearDown():
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MobileEmulationCapabilityTest._http_server.Shutdown()
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDeviceMetrics(self):
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver = self.CreateDriver(
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mobile_emulation = {
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            'deviceMetrics': {'width': 360, 'height': 640, 'pixelRatio': 3}})
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(driver.capabilities['mobileEmulationEnabled'])
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(360, driver.ExecuteScript('return window.innerWidth'))
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(640, driver.ExecuteScript('return window.innerHeight'))
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testUserAgent(self):
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    driver = self.CreateDriver(
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mobile_emulation = {'userAgent': 'Agent Smith'})
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver.Load(self._http_server.GetUrl() + '/userAgent')
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    body_tag = driver.FindElement('tag name', 'body')
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual("Agent Smith", body_tag.GetText())
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testDeviceName(self):
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver = self.CreateDriver(
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mobile_emulation = {'deviceName': 'Google Nexus 5'})
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    driver.Load(self._http_server.GetUrl() + '/userAgent')
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(360, driver.ExecuteScript('return window.innerWidth'))
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(640, driver.ExecuteScript('return window.innerHeight'))
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    body_tag = driver.FindElement('tag name', 'body')
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertEqual(
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleW'
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'ebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/53'
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '5.19',
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        body_tag.GetText())
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ChromeDriverLogTest(unittest.TestCase):
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests that chromedriver produces the expected log file."""
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UNEXPECTED_CHROMEOPTION_CAP = 'unexpected_chromeoption_capability'
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG_MESSAGE = 'unrecognized chrome option: %s' % UNEXPECTED_CHROMEOPTION_CAP
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testChromeDriverLog(self):
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _, tmp_log_path = tempfile.mkstemp(prefix='chromedriver_log_')
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromedriver_server = server.Server(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        _CHROMEDRIVER_BINARY, log_path=tmp_log_path)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver = chromedriver.ChromeDriver(
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chromedriver_server.GetUrl(), chrome_binary=_CHROME_BINARY,
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          experimental_options={ self.UNEXPECTED_CHROMEOPTION_CAP : 1 })
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      driver.Quit()
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except chromedriver.ChromeDriverException, e:
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(self.LOG_MESSAGE in e.message)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    finally:
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromedriver_server.Kill()
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    with open(tmp_log_path, 'r') as f:
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(self.LOG_MESSAGE in f.read())
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PerformanceLoggerTest(ChromeDriverBaseTest):
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests chromedriver tracing support and Inspector event collection."""
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testPerformanceLogger(self):
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver = self.CreateDriver(
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        experimental_options={'perfLoggingPrefs': {
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'enableTimeline': True,
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'traceCategories': 'webkit.console,blink.console'
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }}, performance_log_level='ALL')
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver.Load(
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ChromeDriverTest._http_server.GetUrl() + '/chromedriver/empty.html')
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Mark the timeline; later we will verify the marks appear in the trace.
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    driver.ExecuteScript('console.time("foobar")')
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver.ExecuteScript('console.timeEnd("foobar")')
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    logs = driver.GetLog('performance')
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver.Quit()
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    marked_timeline_events = []
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    seen_log_domains = {}
9175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for entry in logs:
9185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      devtools_message = json.loads(entry['message'])['message']
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      method = devtools_message['method']
9205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      domain = method[:method.find('.')]
9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      seen_log_domains[domain] = True
9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if method != 'Tracing.dataCollected':
9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        continue
9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertTrue('params' in devtools_message)
9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      self.assertTrue(isinstance(devtools_message['params'], dict))
9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cat = devtools_message['params'].get('cat', '')
9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      # Depending on Chrome version, the events may occur for the webkit.console
9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      # or blink.console category. They will only occur for one of them.
9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (cat == 'blink.console' or cat == 'webkit.console'):
9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        self.assertTrue(devtools_message['params']['name'] == 'foobar')
9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        marked_timeline_events.append(devtools_message)
9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEquals(2, len(marked_timeline_events))
9335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEquals({'Network', 'Page', 'Timeline', 'Tracing'},
9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      set(seen_log_domains.keys()))
9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SessionHandlingTest(ChromeDriverBaseTest):
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests for session operations."""
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testQuitASessionMoreThanOnce(self):
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver = self.CreateDriver()
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver.Quit()
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    driver.Quit()
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RemoteBrowserTest(ChromeDriverBaseTest):
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests for ChromeDriver remote browser capability."""
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(_CHROME_BINARY is not None,
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'must supply a chrome binary arg')
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testConnectToRemoteBrowser(self):
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    port = self.FindFreePort()
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    temp_dir = util.MakeTempDir()
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    process = subprocess.Popen([_CHROME_BINARY,
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                '--remote-debugging-port=%d' % port,
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                '--user-data-dir=%s' % temp_dir])
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if process is None:
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise RuntimeError('Chrome could not be started with debugging port')
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver = self.CreateDriver(debugger_address='127.0.0.1:%d' % port)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver.ExecuteScript('console.info("%s")' % 'connecting at %d!' % port)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver.Quit()
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    finally:
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      process.terminate()
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def FindFreePort(self):
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for port in range(10000, 10100):
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      try:
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        socket.create_connection(('127.0.0.1', port), 0.2).close()
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      except socket.error:
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return port
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raise RuntimeError('Cannot find open port')
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PerfTest(ChromeDriverBaseTest):
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests for ChromeDriver perf."""
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(_REFERENCE_CHROMEDRIVER is not None,
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    'must supply a reference-chromedriver arg')
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _RunDriverPerfTest(self, name, test_func):
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Runs a perf test comparing a reference and new ChromeDriver server.
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name: The name of the perf test.
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_func: Called with the server url to perform the test action. Must
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 return the time elapsed.
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class Results(object):
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ref = []
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new = []
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ref_server = server.Server(_REFERENCE_CHROMEDRIVER)
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    results = Results()
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result_url_pairs = zip([results.new, results.ref],
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           [_CHROMEDRIVER_SERVER_URL, ref_server.GetUrl()])
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for iteration in range(30):
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for result, url in result_url_pairs:
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result += [test_func(url)]
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Reverse the order for the next run.
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_url_pairs = result_url_pairs[::-1]
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def PrintResult(build, result):
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mean = sum(result) / len(result)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      avg_dev = sum([abs(sample - mean) for sample in result]) / len(result)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print 'perf result', build, name, mean, avg_dev, result
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      util.AddBuildStepText('%s %s: %.3f+-%.3f' % (
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          build, name, mean, avg_dev))
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Discard first result, which may be off due to cold start.
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintResult('new', results.new[1:])
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintResult('ref', results.ref[1:])
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSessionStartTime(self):
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def Run(url):
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start = time.time()
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver = self.CreateDriver(url)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end = time.time()
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver.Quit()
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return end - start
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._RunDriverPerfTest('session start', Run)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSessionStopTime(self):
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def Run(url):
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver = self.CreateDriver(url)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      start = time.time()
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver.Quit()
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      end = time.time()
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return end - start
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._RunDriverPerfTest('session stop', Run)
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testColdExecuteScript(self):
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    def Run(url):
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver = self.CreateDriver(url)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      start = time.time()
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver.ExecuteScript('return 1')
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end = time.time()
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      driver.Quit()
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return end - start
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._RunDriverPerfTest('cold exe js', Run)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser = optparse.OptionParser()
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option(
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '', '--chromedriver',
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      help='Path to chromedriver server (REQUIRED!)')
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option(
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '', '--log-path',
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      help='Output verbose server logs to this file')
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option(
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '', '--reference-chromedriver',
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      help='Path to the reference chromedriver server')
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option(
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '', '--chrome', help='Path to a build of the chrome binary')
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option(
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '', '--chrome-version', default='HEAD',
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      help='Version of chrome. Default is \'HEAD\'.')
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option(
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '', '--filter', type='string', default='*',
10590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      help=('Filter for specifying what tests to run, "*" will run all. E.g., '
10600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            '*testStartStop'))
10610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  parser.add_option(
10620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      '', '--android-package',
10630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      help=('Android package key. Possible values: ' +
10640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            str(_ANDROID_NEGATIVE_FILTER.keys())))
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options, args = parser.parse_args()
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.chromedriver = util.GetAbsolutePathOfUserPath(options.chromedriver)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not options.chromedriver or not os.path.exists(options.chromedriver):
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parser.error('chromedriver is required or the given path is invalid.' +
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 'Please run "%s --help" for help' % __file__)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global _CHROMEDRIVER_BINARY
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _CHROMEDRIVER_BINARY = options.chromedriver
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (options.android_package and
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options.android_package not in _ANDROID_NEGATIVE_FILTER):
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parser.error('Invalid --android-package')
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromedriver_server = server.Server(_CHROMEDRIVER_BINARY, options.log_path)
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global _CHROMEDRIVER_SERVER_URL
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _CHROMEDRIVER_SERVER_URL = chromedriver_server.GetUrl()
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global _REFERENCE_CHROMEDRIVER
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _REFERENCE_CHROMEDRIVER = util.GetAbsolutePathOfUserPath(
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options.reference_chromedriver)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global _CHROME_BINARY
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if options.chrome:
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _CHROME_BINARY = util.GetAbsolutePathOfUserPath(options.chrome)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _CHROME_BINARY = None
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  global _ANDROID_PACKAGE_KEY
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _ANDROID_PACKAGE_KEY = options.android_package
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if options.filter == '*':
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if _ANDROID_PACKAGE_KEY:
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      negative_filter = _ANDROID_NEGATIVE_FILTER[_ANDROID_PACKAGE_KEY]
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      negative_filter = _GetDesktopNegativeFilter(options.chrome_version)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options.filter = '*-' + ':__main__.'.join([''] + negative_filter)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  all_tests_suite = unittest.defaultTestLoader.loadTestsFromModule(
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sys.modules[__name__])
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tests = unittest_util.FilterTestSuite(all_tests_suite, options.filter)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeDriverTest.GlobalSetUp()
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MobileEmulationCapabilityTest.GlobalSetUp()
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run(tests)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromeDriverTest.GlobalTearDown()
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MobileEmulationCapabilityTest.GlobalTearDown()
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.exit(len(result.failures) + len(result.errors))
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)