Upstream version 5.34.92.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / core / backends / webdriver / webdriver_desktop_browser_finder.py
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
6 import logging
7 import os
8 import sys
9
10 from telemetry.core import browser
11 from telemetry.core import possible_browser
12 from telemetry.core import platform
13 from telemetry.core import util
14 from telemetry.core.backends.webdriver import webdriver_ie_backend
15 from telemetry.page import cloud_storage
16
17 # Try to import the selenium python lib which may be not available.
18 util.AddDirToPythonPath(
19     util.GetChromiumSrcDir(), 'third_party', 'webdriver', 'pylib')
20 try:
21   from selenium import webdriver  # pylint: disable=F0401
22 except ImportError:
23   webdriver = None
24
25 ALL_BROWSER_TYPES = []
26 if webdriver:
27   ALL_BROWSER_TYPES = [
28       'internet-explorer',
29       'internet-explorer-x64']
30 else:
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
36 class PossibleWebDriverBrowser(possible_browser.PossibleBrowser):
37   """A browser that can be controlled through webdriver API."""
38
39   def __init__(self, browser_type, finder_options):
40     target_os = sys.platform.lower()
41     super(PossibleWebDriverBrowser, self).__init__(browser_type, target_os,
42         finder_options)
43     assert browser_type in ALL_BROWSER_TYPES, \
44         'Please add %s to ALL_BROWSER_TYPES' % browser_type
45
46   def CreateWebDriverBackend(self, platform_backend):
47     raise NotImplementedError()
48
49   def Create(self):
50     platform_backend = platform.CreatePlatformBackendForCurrentOS()
51     backend = self.CreateWebDriverBackend(platform_backend)
52     b = browser.Browser(backend, platform_backend)
53     return b
54
55   def SupportsOptions(self, finder_options):
56     if len(finder_options.extensions_to_load) != 0:
57       return False
58     return True
59
60   def UpdateExecutableIfNeeded(self):
61     pass
62
63   @property
64   def last_modification_time(self):
65     return -1
66
67
68 class PossibleDesktopIE(PossibleWebDriverBrowser):
69   def __init__(self, browser_type, finder_options, architecture):
70     super(PossibleDesktopIE, self).__init__(browser_type, finder_options)
71     self._architecture = architecture
72
73   def CreateWebDriverBackend(self, platform_backend):
74     assert webdriver
75     def DriverCreator():
76       ie_driver_exe = os.path.join(util.GetTelemetryDir(), 'bin',
77                                    'IEDriverServer_%s.exe' % self._architecture)
78       cloud_storage.GetIfChanged(ie_driver_exe, cloud_storage.PUBLIC_BUCKET)
79       return webdriver.Ie(executable_path=ie_driver_exe)
80     return webdriver_ie_backend.WebDriverIEBackend(
81         platform_backend, DriverCreator, self.finder_options.browser_options)
82
83 def SelectDefaultBrowser(_):
84   return None
85
86 def FindAllAvailableBrowsers(finder_options):
87   """Finds all the desktop browsers available on this machine."""
88   browsers = []
89   if not webdriver:
90     return browsers
91
92   # Look for the IE browser in the standard location.
93   if sys.platform.startswith('win'):
94     ie_path = os.path.join('Internet Explorer', 'iexplore.exe')
95     win_search_paths = {
96         '32' : { 'path' : os.getenv('PROGRAMFILES(X86)'),
97                  'type' : 'internet-explorer'},
98         '64' : { 'path' : os.getenv('PROGRAMFILES'),
99                  'type' : 'internet-explorer-x64'}}
100     for architecture, ie_info in win_search_paths.iteritems():
101       if not ie_info['path']:
102         continue
103       if os.path.exists(os.path.join(ie_info['path'], ie_path)):
104         browsers.append(
105             PossibleDesktopIE(ie_info['type'], finder_options, architecture))
106
107   return browsers