From 42cfc72d5e205ed0e2697dfa68f52c4caa5cec18 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 23 Aug 2018 15:20:38 +0200 Subject: [PATCH] [FIX] core: use actual chrome/chromium executable on macOs. --- odoo/tests/common.py | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/odoo/tests/common.py b/odoo/tests/common.py index 2050f25fc55..2ad90065916 100644 --- a/odoo/tests/common.py +++ b/odoo/tests/common.py @@ -12,6 +12,7 @@ import json import logging import operator import os +import platform import re import requests import shutil @@ -30,6 +31,7 @@ from lxml import etree, html from odoo.models import BaseModel from odoo.osv.expression import normalize_domain from odoo.tools import pycompat +from odoo.tools.misc import find_in_path from odoo.tools.safe_eval import safe_eval try: @@ -344,10 +346,10 @@ class ChromeBrowser(): self.ws_url = '' # WebSocketUrl self.ws = None # websocket self.request_id = 0 - self.user_data_dir = '' + self.user_data_dir = tempfile.mkdtemp(suffix='_chrome_odoo') self.chrome_process = None self.screencast_frames = [] - self._chrome_start(['google-chrome'], self.user_data_dir) + self._chrome_start() _logger.info('Websocket url found: %s' % self.ws_url) self._open_websocket() _logger.info('Enable chrome headless console log notification') @@ -367,7 +369,32 @@ class ChromeBrowser(): _logger.info('Removing chrome user profile "%s"' % self.user_data_dir) shutil.rmtree(self.user_data_dir) - def _chrome_start(self, cmd, user_data_dir): + @property + def executable(self): + system = platform.system() + if system == 'Linux': + for bin_ in ['google-chrome', 'chromium']: + try: + return find_in_path(bin_) + except IOError: + continue + + elif system == 'Darwin': + bins = [ + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', + '/Applications/Chromium.app/Contents/MacOS/Chromium', + ] + for bin_ in bins: + if os.path.exists(bin_): + return bin_ + + elif system == 'Windows': + # TODO: handle windows platform: https://stackoverflow.com/a/40674915 + pass + + raise unittest.SkipTest("Chrome executable not found") + + def _chrome_start(self): if self.chrome_process is not None: return switches = { @@ -376,11 +403,12 @@ class ChromeBrowser(): '--no-default-browser-check': '', '--no-first-run': '', '--disable-extensions': '', - '--user-data-dir': user_data_dir, + '--user-data-dir': self.user_data_dir, '--disable-translate': '', '--window-size': '1366x768', '--remote-debugging-port': str(self.devtools_port) } + cmd = [self.executable] cmd += ['%s=%s' % (k, v) if v else k for k, v in switches.items()] url = 'about:blank' cmd.append(url) @@ -394,7 +422,6 @@ class ChromeBrowser(): _logger.info('Browser version: %s' % version['Browser']) infos = self._json_command('')[0] # Infos about the first tab self.ws_url = infos['webSocketDebuggerUrl'] - self.user_data_dir = tempfile.mkdtemp(suffix='_chrome_odoo') _logger.info('Chrome headless temporary user profile dir: %s' % self.user_data_dir) def _json_command(self, command, timeout=3):