webdriver_desktop_browser_finder.py revision 58537e28ecd584eab876aee8be7156509866d23a
1# Copyright 2013 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4"""Finds desktop browsers that can be controlled by telemetry.""" 5 6import logging 7import os 8import sys 9 10from telemetry.core import browser 11from telemetry.core import possible_browser 12from telemetry.core import platform 13from telemetry.core import util 14from telemetry.core.backends.webdriver import webdriver_ie_backend 15from telemetry.page import cloud_storage 16 17# Try to import the selenium python lib which may be not available. 18util.AddDirToPythonPath( 19 util.GetChromiumSrcDir(), 'third_party', 'webdriver', 'pylib') 20try: 21 from selenium import webdriver # pylint: disable=F0401 22except ImportError: 23 webdriver = None 24 25ALL_BROWSER_TYPES = '' 26if webdriver: 27 ALL_BROWSER_TYPES = ','.join([ 28 'internet-explorer', 29 'internet-explorer-x64']) 30else: 31 logging.warning('Webdriver backend is unsupported without selenium pylib. ' 32 'For installation of selenium pylib, please refer to ' 33 'https://code.google.com/p/selenium/wiki/PythonBindings.') 34 35 36class PossibleWebDriverBrowser(possible_browser.PossibleBrowser): 37 """A browser that can be controlled through webdriver API.""" 38 39 def __init__(self, browser_type, finder_options): 40 super(PossibleWebDriverBrowser, self).__init__(browser_type, finder_options) 41 42 def CreateWebDriverBackend(self, platform_backend): 43 raise NotImplementedError() 44 45 def Create(self): 46 platform_backend = platform.CreatePlatformBackendForCurrentOS() 47 backend = self.CreateWebDriverBackend(platform_backend) 48 b = browser.Browser(backend, platform_backend) 49 return b 50 51 def SupportsOptions(self, finder_options): 52 if len(finder_options.extensions_to_load) != 0: 53 return False 54 return True 55 56 @property 57 def last_modification_time(self): 58 return -1 59 60 61class PossibleDesktopIE(PossibleWebDriverBrowser): 62 def __init__(self, browser_type, finder_options, architecture): 63 super(PossibleDesktopIE, self).__init__(browser_type, finder_options) 64 self._architecture = architecture 65 66 def CreateWebDriverBackend(self, platform_backend): 67 assert webdriver 68 def DriverCreator(): 69 ie_driver_exe = os.path.join(util.GetTelemetryDir(), 'bin', 70 'IEDriverServer_%s.exe' % self._architecture) 71 cloud_storage.GetIfChanged(cloud_storage.CHROMIUM_TELEMETRY_BUCKET, 72 ie_driver_exe) 73 return webdriver.Ie(executable_path=ie_driver_exe) 74 return webdriver_ie_backend.WebDriverIEBackend( 75 platform_backend, DriverCreator, self.finder_options.browser_options) 76 77def SelectDefaultBrowser(_): 78 return None 79 80def FindAllAvailableBrowsers(finder_options): 81 """Finds all the desktop browsers available on this machine.""" 82 browsers = [] 83 if not webdriver: 84 return browsers 85 86 # Look for the IE browser in the standard location. 87 if sys.platform.startswith('win'): 88 ie_path = os.path.join('Internet Explorer', 'iexplore.exe') 89 win_search_paths = { 90 '32' : { 'path' : os.getenv('PROGRAMFILES(X86)'), 91 'type' : 'internet-explorer'}, 92 '64' : { 'path' : os.getenv('PROGRAMFILES'), 93 'type' : 'internet-explorer-x64'}} 94 for architecture, ie_info in win_search_paths.iteritems(): 95 if not ie_info['path']: 96 continue 97 if os.path.exists(os.path.join(ie_info['path'], ie_path)): 98 browsers.append( 99 PossibleDesktopIE(ie_info['type'], finder_options, architecture)) 100 101 return browsers 102