def FindBrowser(options): """Finds the best PossibleBrowser object given a BrowserOptions object. Args: A BrowserFinderOptions object. Returns: A PossibleBrowser object. None if browser does not exist in DUT. Raises: BrowserFinderException: Options improperly set, or an error occurred. """ if options.__class__.__name__ == '_FakeBrowserFinderOptions': return options.fake_possible_browser if options.browser_type == 'exact' and options.browser_executable is None: raise browser_finder_exceptions.BrowserFinderException( '--browser=exact requires --browser-executable to be set.') if options.browser_type != 'exact' and options.browser_executable != None: raise browser_finder_exceptions.BrowserFinderException( '--browser-executable requires --browser=exact.') if options.browser_type == 'cros-chrome' and options.cros_remote is None: raise browser_finder_exceptions.BrowserFinderException( 'browser_type=cros-chrome requires cros_remote be set.') if (options.browser_type != 'cros-chrome' and options.browser_type != 'cros-chrome-guest' and options.cros_remote != None): raise browser_finder_exceptions.BrowserFinderException( '--remote requires --browser=cros-chrome or cros-chrome-guest.') devices = device_finder.GetDevicesMatchingOptions(options) browsers = [] default_browsers = [] browser_finders = _GetBrowserFinders(options.target_platforms) for device in devices: for finder in browser_finders: if(options.browser_type and options.browser_type != 'any' and options.browser_type not in finder.FindAllBrowserTypes()): continue curr_browsers = finder.FindAllAvailableBrowsers(options, device) new_default_browser = finder.SelectDefaultBrowser(curr_browsers) if new_default_browser: default_browsers.append(new_default_browser) browsers.extend(curr_browsers) if not browsers: return None if options.browser_type is None: if default_browsers: default_browser = max(default_browsers, key=lambda b: b.last_modification_time) logging.warning('--browser omitted. Using most recent local build: %s', default_browser.browser_type) default_browser.UpdateExecutableIfNeeded() return default_browser if len(browsers) == 1: logging.warning('--browser omitted. Using only available browser: %s', browsers[0].browser_type) browsers[0].UpdateExecutableIfNeeded() return browsers[0] raise browser_finder_exceptions.BrowserTypeRequiredException( '--browser must be specified. Available browsers:\n%s' % '\n'.join(sorted(set([b.browser_type for b in browsers])))) chosen_browser = None if options.browser_type == 'any': types = FindAllBrowserTypes(browser_finders) chosen_browser = min(browsers, key=lambda b: types.index(b.browser_type)) else: matching_browsers = [ b for b in browsers if b.browser_type == options.browser_type and b.SupportsOptions(options.browser_options)] if not matching_browsers: logging.warning('Cannot find any matched browser') return None if len(matching_browsers) > 1: logging.warning('Multiple browsers of the same type found: %r', matching_browsers) chosen_browser = max(matching_browsers, key=lambda b: b.last_modification_time) if chosen_browser: logging.info('Chose browser: %r', chosen_browser) chosen_browser.UpdateExecutableIfNeeded() return chosen_browser
def FindBrowser(options): """Finds the best PossibleBrowser object given a BrowserOptions object. Args: A BrowserOptions object. Returns: A PossibleBrowser object. Raises: BrowserFinderException: Options improperly set, or an error occurred. """ if options.__class__.__name__ == '_FakeBrowserFinderOptions': return options.fake_possible_browser if options.browser_type == 'exact' and options.browser_executable == None: raise browser_finder_exceptions.BrowserFinderException( '--browser=exact requires --browser-executable to be set.') if options.browser_type != 'exact' and options.browser_executable != None: raise browser_finder_exceptions.BrowserFinderException( '--browser-executable requires --browser=exact.') if options.browser_type == 'cros-chrome' and options.cros_remote == None: raise browser_finder_exceptions.BrowserFinderException( 'browser_type=cros-chrome requires cros_remote be set.') if (options.browser_type != 'cros-chrome' and options.browser_type != 'cros-chrome-guest' and options.cros_remote != None): raise browser_finder_exceptions.BrowserFinderException( '--remote requires --browser=cros-chrome or cros-chrome-guest.') devices = device_finder.GetDevicesMatchingOptions(options) browsers = [] default_browsers = [] for device in devices: for finder in BROWSER_FINDERS: if(options.browser_type and options.browser_type != 'any' and options.browser_type not in finder.FindAllBrowserTypes(options)): continue curr_browsers = finder.FindAllAvailableBrowsers(options, device) new_default_browser = finder.SelectDefaultBrowser(curr_browsers) if new_default_browser: default_browsers.append(new_default_browser) browsers.extend(curr_browsers) if options.browser_type == None: if default_browsers: default_browser = sorted(default_browsers, key=lambda b: b.last_modification_time())[-1] logging.warning('--browser omitted. Using most recent local build: %s', default_browser.browser_type) default_browser.UpdateExecutableIfNeeded() return default_browser if len(browsers) == 1: logging.warning('--browser omitted. Using only available browser: %s', browsers[0].browser_type) browsers[0].UpdateExecutableIfNeeded() return browsers[0] raise browser_finder_exceptions.BrowserTypeRequiredException( '--browser must be specified. Available browsers:\n%s' % '\n'.join(sorted(set([b.browser_type for b in browsers])))) if options.browser_type == 'any': types = FindAllBrowserTypes(options) def CompareBrowsersOnTypePriority(x, y): x_idx = types.index(x.browser_type) y_idx = types.index(y.browser_type) return x_idx - y_idx browsers.sort(CompareBrowsersOnTypePriority) if len(browsers) >= 1: browsers[0].UpdateExecutableIfNeeded() return browsers[0] else: return None matching_browsers = [ b for b in browsers if b.browser_type == options.browser_type and b.SupportsOptions(options.browser_options)] chosen_browser = None if len(matching_browsers) == 1: chosen_browser = matching_browsers[0] elif len(matching_browsers) > 1: logging.warning('Multiple browsers of the same type found: %s', repr(matching_browsers)) chosen_browser = sorted(matching_browsers, key=lambda b: b.last_modification_time)[-1] if chosen_browser: logging.info('Chose browser: %s', repr(chosen_browser)) chosen_browser.UpdateExecutableIfNeeded() return chosen_browser