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