Commit cdaf852c authored by Jérome Perrin's avatar Jérome Perrin

wip ERP5 seleniumserver

parent 69589a28
......@@ -34,6 +34,8 @@ import time
import re
import subprocess
import shutil
import json
import tempfile
import transaction
import logging
from ZPublisher.HTTPResponse import HTTPResponse
......@@ -42,10 +44,14 @@ from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.Utils import stopProcess, PR_SET_PDEATHSIG
from lxml import etree
from lxml.html import builder as E
import certifi
import urllib3
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.remote.remote_connection import RemoteConnection
logger = logging.getLogger(__name__)
......@@ -162,54 +168,88 @@ class FunctionalTestRunner:
# There is no test that can take more than 6 hours
timeout = 6.0 * 3600
def __init__(self, host, port, portal, run_only=''):
def __init__(self, host, port, testcase):
self.instance_home = os.environ['INSTANCE_HOME']
# Such information should be automatically loaded
self.user = 'ERP5TypeTestCase'
self.password = ''
self.run_only = run_only
self.testcase = testcase
profile_dir = os.path.join(self.instance_home, 'profile')
self.portal = portal
def getStatus(self):
transaction.begin()
return self.portal.portal_tests.TestTool_getResults(self.run_only)
return self.testcase.portal.portal_tests.TestTool_getResults(self.testcase.run_only)
def _getTestBaseURL(self):
# Access the https proxy in front of runUnitTest's zserver
base_url = os.getenv('zserver_frontend_url')
if base_url:
return '%s%s' % (base_url, self.portal.getId())
return self.portal.portal_url()
return '%s%s' % (base_url, self.testcase.portal.getId())
return self.testcase.portal_url()
def _getTestURL(self):
return ZELENIUM_BASE_URL % (
self._getTestBaseURL(),
self.run_only,
self.testcase.run_only,
)
def test(self, debug=0):
xvfb = Xvfb(self.instance_home)
xvfb = None
use_local_firefox = True
selenium_test_runner_configuration = {}
test_runner_configuration_file = os.environ.get('ERP5_TESTRUNNER_CONFIGURATION')
if test_runner_configuration_file and os.path.exists(test_runner_configuration_file):
with open(test_runner_configuration_file) as f:
test_runner_configuration = json.load(f)
selenium_test_runner_configuration = test_runner_configuration.get('selenium', {})
use_local_firefox = selenium_test_runner_configuration.get('server-url') is None
try:
if not (debug and os.getenv('DISPLAY')):
logger.debug("You can set 'erp5_debug_mode' environment variable to 1 to use your existing display instead of Xvfb.")
xvfb.run()
capabilities = webdriver.common.desired_capabilities \
.DesiredCapabilities.FIREFOX.copy()
capabilities['marionette'] = True
# Zope is accessed through apache with a certificate not trusted by firefox
capabilities['acceptInsecureCerts'] = True
# Service workers are disabled on Firefox 52 ESR:
# https://bugzilla.mozilla.org/show_bug.cgi?id=1338144
options = webdriver.FirefoxOptions()
options.set_preference('dom.serviceWorkers.enabled', True)
kw = dict(capabilities=capabilities, options=options)
firefox_bin = os.environ.get('firefox_bin')
if firefox_bin:
geckodriver = os.path.join(os.path.dirname(firefox_bin), 'geckodriver')
kw.update(firefox_binary=firefox_bin, executable_path=geckodriver)
browser = webdriver.Firefox(**kw)
if use_local_firefox:
xvfb = Xvfb(self.instance_home)
if not (debug and os.getenv('DISPLAY')):
logger.debug("You can set 'erp5_debug_mode' environment variable to 1 to use your existing display instead of Xvfb.")
xvfb.run()
capabilities = webdriver.common.desired_capabilities \
.DesiredCapabilities.FIREFOX.copy()
capabilities['marionette'] = True
# Zope is accessed through apache with a certificate not trusted by firefox
capabilities['acceptInsecureCerts'] = True
# Service workers are disabled on Firefox 52 ESR:
# https://bugzilla.mozilla.org/show_bug.cgi?id=1338144
options = webdriver.FirefoxOptions()
options.set_preference('dom.serviceWorkers.enabled', True)
kw = dict(capabilities=capabilities, options=options)
firefox_bin = os.environ.get('firefox_bin')
if firefox_bin:
geckodriver = os.path.join(os.path.dirname(firefox_bin), 'geckodriver')
kw.update(firefox_binary=firefox_bin, executable_path=geckodriver)
browser = webdriver.Firefox(**kw)
else:
executor = RemoteConnection(
selenium_test_runner_configuration['server-url'],
keep_alive=True)
cert_reqs = 'CERT_REQUIRED'
ca_certs = certifi.where()
if not selenium_test_runner_configuration.get('verify-server-certificate', True):
cert_reqs = 'CERT_NONE'
ca_certs = None
# TODO caucase
if selenium_test_runner_configuration.get('server-ca-certificate'):
ca_certs_tempfile = tempfile.NamedTemporaryFile(suffix="-cacerts.pem", mode="w", delete=False)
ca_certs = ca_certs_tempfile.name
self.testcase.addCleanup(os.unlink, ca_certs_tempfile)
with open(ca_certs, 'w') as f:
f.write(selenium_test_runner_configuration['server-ca-certificate'])
executor._conn = urllib3.PoolManager(cert_reqs=cert_reqs, ca_certs=ca_certs)
browser = webdriver.Remote(
command_executor=executor,
desired_capabilities=selenium_test_runner_configuration['desired-capabilities'],
)
start_time = time.time()
logger.info("Running with browser: %s", browser)
logger.info("Reported user agent: %s", browser.execute_script("return navigator.userAgent"))
......@@ -262,7 +302,8 @@ class FunctionalTestRunner:
)
browser.quit()
finally:
xvfb.quit()
if xvfb is not None:
xvfb.quit()
return iframe
def processResult(self, iframe):
......@@ -305,6 +346,7 @@ class FunctionalTestRunner:
return detail, sucess_amount, failure_amount, expected_failure_amount, \
error_title_list
class ERP5TypeFunctionalTestCase(ERP5TypeTestCase):
run_only = ""
foreground = 0
......@@ -325,8 +367,7 @@ class ERP5TypeFunctionalTestCase(ERP5TypeTestCase):
self.portal.portal_tests.TestTool_cleanUpTestResults(self.run_only or None)
self.tic()
host, port = self.startZServer()
self.runner = FunctionalTestRunner(host, port,
self.portal, self.run_only)
self.runner = FunctionalTestRunner(host, port, self)
def setSystemPreference(self):
self.portal.Zuite_setPreference(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment