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)