diff --git a/product/ERP5Type/tests/ERP5TypeFunctionalTestCase.py b/product/ERP5Type/tests/ERP5TypeFunctionalTestCase.py index dac8273b35d598d1fe0ac5710b19aabc1ed0926d..bfe437002c951e6330c8ea3f47802e2e16c92237 100644 --- a/product/ERP5Type/tests/ERP5TypeFunctionalTestCase.py +++ b/product/ERP5Type/tests/ERP5TypeFunctionalTestCase.py @@ -40,6 +40,10 @@ from zExceptions.ExceptionFormatter import format_exception from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase, \ _getConversionServerDict from Products.ERP5Type.Utils import stopProcess, PR_SET_PDEATHSIG +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 # REGEX FOR ZELENIUM TESTS TEST_PASS_RE = re.compile('<th[^>]*>Tests passed</th>\n\s*<td[^>]*>([^<]*)') @@ -117,6 +121,7 @@ class Xvfb(Process): if not os.path.exists(lock_filepath): self._runCommand(display_try) self.display = display_try + os.environ['DISPLAY'] = self.display break else: raise EnvironmentError("All displays locked : %r" % (self.display_list,)) @@ -124,131 +129,6 @@ class Xvfb(Process): print 'Xvfb : %d' % self.process.pid print 'Take screenshots using xwud -in %s/Xvfb_screen0' % self.fbdir -class Browser(Process): - - def __init__(self, profile_dir, host, port): - self.profile_dir = profile_dir - self.host = host - self.port = port - - def _run(self, url, display): - """ This method should be implemented on a subclass """ - raise NotImplementedError - - def _setEnviron(self): - pass - - def run(self, url, display): - self.clean() - self.environ = os.environ.copy() - self._setEnviron() - self._setDisplay(display) - self._run(url) - print "Browser %s running on pid: %s" % (self.__class__.__name__, - self.process.pid) - - def clean(self): - """ Clean up removing profile dir and recreating it""" - shutil.rmtree(self.profile_dir, ignore_errors=True) - os.mkdir(self.profile_dir) - - def _createFile(self, filename, content): - file_path = os.path.join(self.profile_dir, filename) - with open(file_path, 'w') as f: - f.write(content) - return file_path - - def _setDisplay(self, display): - if display: - self.environ["DISPLAY"] = display - else: - xauth = os.path.expanduser('~/.Xauthority') - if os.path.exists(xauth): - self.environ["XAUTHORITY"] = xauth - - def _runCommand(self, *args): - self._exec(args, close_fds=True, env=self.environ) - -class Firefox(Browser): - """ Use firefox to open run all the tests""" - - def _setEnviron(self): - self.environ['MOZ_NO_REMOTE'] = '1' - self.environ['HOME'] = self.profile_dir - self.environ['LC_ALL'] = 'C' - self.environ["MOZ_CRASHREPORTER_DISABLE"] = "1" - self.environ["NO_EM_RESTART"] = "1" - - # This disables unwanted SCIM as it fails with Xvfb, at least on Mandriva - # 2010.0, because Firefox tries to start scim-bridge which SIGSEGV and - # thus Firefox is stucked on register_imcontext() - for remove_environment_variable in ('GTK_IM_MODULE', - 'XIM_PROGRAM', - 'XMODIFIERS', - 'QT_IM_MODULE'): - self.environ.pop(remove_environment_variable, None) - - def _run(self, url): - # Prepare to run - self._createFile('prefs.js', self.getPrefJs()) - firefox_bin = os.environ.get("firefox_bin", "firefox") - self._runCommand(firefox_bin, "-no-remote", - "-profile", self.profile_dir, url) - - def getPrefJs(self): - from App.config import getConfiguration - return """ -// Don't ask if we want to switch default browsers -user_pref("browser.shell.checkDefaultBrowser", false); - -// Disable pop-up blocking -user_pref("browser.allowpopups", true); -user_pref("dom.disable_open_during_load", false); - -// Configure us as the local proxy -//user_pref("network.proxy.type", 2); - -// Disable security warnings -user_pref("security.warn_submit_insecure", false); -user_pref("security.warn_submit_insecure.show_once", false); -user_pref("security.warn_entering_secure", false); -user_pref("security.warn_entering_secure.show_once", false); -user_pref("security.warn_entering_weak", false); -user_pref("security.warn_entering_weak.show_once", false); -user_pref("security.warn_leaving_secure", false); -user_pref("security.warn_leaving_secure.show_once", false); -user_pref("security.warn_viewing_mixed", false); -user_pref("security.warn_viewing_mixed.show_once", false); - -// Disable "do you want to remember this password?" -user_pref("signon.rememberSignons", false); - -// increase the timeout before warning of unresponsive script -user_pref("dom.max_script_run_time", 120); - -// this is required to upload files -user_pref("capability.principal.codebase.p1.granted", "UniversalFileRead"); -user_pref("signed.applets.codebase_principal_support", true); -user_pref("capability.principal.codebase.p1.id", "http://%s:%s"); -user_pref("capability.principal.codebase.p1.subjectName", ""); - -// For debugging, do not waste space on screen -user_pref("browser.tabs.autoHide", true); - -// This is required to download reports without requiring user interaction -// (See ERP5UpgradeUtils for corresponding Extensions) -user_pref("browser.download.folderList", 2); -user_pref("browser.download.manager.showWhenStarting", false); -user_pref("browser.download.dir", "%s"); -user_pref("browser.helperApps.neverAsk.saveToDisk", "application/pdf"); -// Otherwise clear previously defined PDF-related extensions -// => browser/extensions/pdfjs/content/PdfJs.jsm:_migrate() -user_pref("pdfjs.disabled", true); -// Not really necessary (just FTR) -user_pref("pdfjs.migrationVersion", 42); -""" % (self.host, self.port, - os.path.join(getConfiguration().instancehome, 'var')) - class FunctionalTestRunner: # There is no test that can take more than 6 hours @@ -263,7 +143,6 @@ class FunctionalTestRunner: self.run_only = run_only profile_dir = os.path.join(self.instance_home, 'profile') self.portal = portal - self.browser = Firefox(profile_dir, host, int(port)) def getStatus(self): transaction.begin() @@ -276,26 +155,31 @@ class FunctionalTestRunner: def test(self, debug=0): xvfb = Xvfb(self.instance_home) try: - end = time.time() + self.timeout if not debug: print("\nSet 'erp5_debug_mode' environment variable to 1" " to use your existing display instead of Xvfb.") xvfb.run() - try: - self.browser.run(self._getTestURL() , xvfb.display) - while time.time() < end: - status = self.getStatus() - if status and '>ONGOING<' not in status: - break - time.sleep(10) - if self.browser.process.poll() is not None: - raise RuntimeError('Test browser is no longer running.') - else: - # TODO: here we could take a screenshot and display it in the report - # (maybe using data: scheme inside a <img>) - raise TimeoutError("Test took more than %s seconds" % self.timeout) - finally: - self.browser.quit() + firefox_bin = os.environ.get("firefox_bin") + firefox_driver = firefox_bin.replace("firefox-slapos", "geckodriver") + firefox_capabilities = webdriver.common.desired_capabilities.DesiredCapabilities.FIREFOX + firefox_capabilities['marionette'] = True + firefox_capabilities['binary'] = firefox_bin + browser = webdriver.Firefox(capabilities=firefox_capabilities, executable_path=firefox_driver) + start_time = time.time() + browser.get(self._getTestURL()) + + WebDriverWait(browser, 10).until(EC.presence_of_element_located(( + By.XPATH, '//iframe[@id="testSuiteFrame"]' + ))) + # XXX No idea how to wait for the iframe content to be loaded + time.sleep(5) + # Count number of test to be executed + test_count = browser.execute_script( + "return document.getElementById('testSuiteFrame').contentDocument.querySelector('tbody').children.length" + ) - 1 + WebDriverWait(browser, self.timeout).until(EC.presence_of_element_located(( + By.XPATH, '//td[@id="testRuns" and contains(text(), "%i")]' % test_count + ))) finally: xvfb.quit()