Remove selenium dependency when not using selenium tests
Closes-Bug: 1377372 Change-Id: I6a493989d7280eaa2a1c999a9d1be4365aa77d52
This commit is contained in:
parent
1df385009a
commit
aad4565d9f
|
@ -17,62 +17,79 @@
|
|||
# limitations under the License.
|
||||
#
|
||||
|
||||
import logging
|
||||
import os
|
||||
import platform
|
||||
import shutil
|
||||
import subprocess
|
||||
|
||||
from selenium.common import exceptions as selenium_exceptions
|
||||
from selenium.webdriver import firefox
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
# NOTE: Several distribution can't ship selenium due to its
|
||||
# non-free license. So they have to patch it out of test-requirements.txt
|
||||
# Avoid import failure and force not running selenium tests.
|
||||
# The entire file is encapsulated in the try block because the classes
|
||||
# inherit from the firefox class contained in selenium.webdriver, and
|
||||
# python will throw a NameError if the import is skipped.
|
||||
from selenium.common import exceptions as selenium_exceptions
|
||||
from selenium.webdriver import firefox
|
||||
|
||||
class FirefoxBinary(firefox.firefox_binary.FirefoxBinary):
|
||||
"""Workarounds selenium firefox issues.
|
||||
class FirefoxBinary(firefox.firefox_binary.FirefoxBinary):
|
||||
"""Workarounds selenium firefox issues.
|
||||
|
||||
There is race condition in the way firefox is spawned. The exact cause
|
||||
hasn't been properly diagnosed yet but it's around:
|
||||
There is race condition in the way firefox is spawned. The exact cause
|
||||
hasn't been properly diagnosed yet but it's around:
|
||||
|
||||
- getting a free port from the OS with selenium.webdriver.common.utils
|
||||
free_port(),
|
||||
- getting a free port from the OS with selenium.webdriver.common.utils
|
||||
free_port(),
|
||||
|
||||
- release the port immediately but record it in ff prefs so that ff can
|
||||
listen on that port for the internal http server.
|
||||
- release the port immediately but record it in ff prefs so that ff can
|
||||
listen on that port for the internal http server.
|
||||
|
||||
It has been observed that this leads to hanging processes for 'firefox
|
||||
-silent'.
|
||||
"""
|
||||
It has been observed that this leads to hanging processes for 'firefox
|
||||
-silent'.
|
||||
"""
|
||||
|
||||
def _start_from_profile_path(self, path):
|
||||
self._firefox_env["XRE_PROFILE_PATH"] = path
|
||||
def _start_from_profile_path(self, path):
|
||||
self._firefox_env["XRE_PROFILE_PATH"] = path
|
||||
|
||||
if platform.system().lower() == 'linux':
|
||||
self._modify_link_library_path()
|
||||
command = [self._start_cmd, "-silent"]
|
||||
if self.command_line is not None:
|
||||
for cli in self.command_line:
|
||||
command.append(cli)
|
||||
if platform.system().lower() == 'linux':
|
||||
self._modify_link_library_path()
|
||||
command = [self._start_cmd, "-silent"]
|
||||
if self.command_line is not None:
|
||||
for cli in self.command_line:
|
||||
command.append(cli)
|
||||
|
||||
# The following exists upstream and is known to create hanging firefoxes,
|
||||
# leading to zombies.
|
||||
# subprocess.Popen(command, stdout=self._log_file,
|
||||
# stderr=subprocess.STDOUT,
|
||||
# env=self._firefox_env).communicate()
|
||||
command[1] = '-foreground'
|
||||
self.process = subprocess.Popen(
|
||||
command, stdout=self._log_file, stderr=subprocess.STDOUT,
|
||||
env=self._firefox_env)
|
||||
# The following exists upstream and is known to create hanging firefoxes,
|
||||
# leading to zombies.
|
||||
# subprocess.Popen(command, stdout=self._log_file,
|
||||
# stderr=subprocess.STDOUT,
|
||||
# env=self._firefox_env).communicate()
|
||||
command[1] = '-foreground'
|
||||
self.process = subprocess.Popen(
|
||||
command, stdout=self._log_file, stderr=subprocess.STDOUT,
|
||||
env=self._firefox_env)
|
||||
|
||||
class WebDriver(firefox.webdriver.WebDriver):
|
||||
"""Workarounds selenium firefox issues."""
|
||||
|
||||
class WebDriver(firefox.webdriver.WebDriver):
|
||||
"""Workarounds selenium firefox issues."""
|
||||
def __init__(self, firefox_profile=None, firefox_binary=None,
|
||||
timeout=30, capabilities=None, proxy=None):
|
||||
try:
|
||||
super(WebDriver, self).__init__(
|
||||
firefox_profile, FirefoxBinary(), timeout, capabilities,
|
||||
proxy)
|
||||
except selenium_exceptions.WebDriverException:
|
||||
# If we can't start, cleanup profile
|
||||
shutil.rmtree(self.profile.path)
|
||||
if self.profile.tempfolder is not None:
|
||||
shutil.rmtree(self.profile.tempfolder)
|
||||
raise
|
||||
|
||||
def __init__(self, firefox_profile=None, firefox_binary=None, timeout=30,
|
||||
capabilities=None, proxy=None):
|
||||
try:
|
||||
super(WebDriver, self).__init__(
|
||||
firefox_profile, FirefoxBinary(), timeout, capabilities, proxy)
|
||||
except selenium_exceptions.WebDriverException:
|
||||
# If we can't start, cleanup profile
|
||||
shutil.rmtree(self.profile.path)
|
||||
if self.profile.tempfolder is not None:
|
||||
shutil.rmtree(self.profile.tempfolder)
|
||||
raise
|
||||
except ImportError as e:
|
||||
# NOTE(saschpe): Several distribution can't ship selenium due to its
|
||||
# non-free license. So they have to patch it out of test-requirements.txt
|
||||
# Avoid import failure and force not running selenium tests.
|
||||
LOG.warning("{0}, force WITH_SELENIUM=False".format(str(e)))
|
||||
os.environ['WITH_SELENIUM'] = ''
|
||||
|
|
Loading…
Reference in New Issue