The nightly webui tests are failing while trying to load the selenium driver, please see PR #370.
For instance the report for test_webui/test_group.py shows the following logs:
self = <ipatests.test_webui.test_group.test_group object at 0x7f4a4e301130> request = <SubRequest 'ui_driver_fsetup' for <Function test_crud>> @pytest.fixture(autouse=True) def ui_driver_fsetup(self, request): > self.driver = self.get_driver() test_webui/ui_driver.py:173: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test_webui/ui_driver.py:272: in get_driver driver = webdriver.Firefox(fp, log_path=ff_log_path) /usr/local/lib/python3.8/site-packages/selenium/webdriver/firefox/webdriver.py:170: in __init__ RemoteWebDriver.__init__( /usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py:157: in __init__ self.start_session(capabilities, browser_profile) /usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py:252: in start_session response = self.execute(Command.NEW_SESSION, parameters) /usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py:321: in execute self.error_handler.check_response(response) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7f4a4e3013d0> response = {'status': 500, 'value': '{"value":{"error":"session not created","message":"Unable to find a matching set of capabilities","stacktrace":""}}'} def check_response(self, response): """ Checks that a JSON response from the WebDriver does not have an error. :Args: - response - The JSON response from the WebDriver server as a dictionary object. :Raises: If the response contains an error message. """ status = response.get('status', None) if status is None or status == ErrorCode.SUCCESS: return value = None message = response.get("message", "") screen = response.get("screen", "") stacktrace = None if isinstance(status, int): value_json = response.get('value', None) if value_json and isinstance(value_json, basestring): import json try: value = json.loads(value_json) if len(value.keys()) == 1: value = value['value'] status = value.get('error', None) if status is None: status = value["status"] message = value["value"] if not isinstance(message, basestring): value = message message = message.get('message') else: message = value.get('message', None) except ValueError: pass exception_class = ErrorInResponseException if status in ErrorCode.NO_SUCH_ELEMENT: exception_class = NoSuchElementException elif status in ErrorCode.NO_SUCH_FRAME: exception_class = NoSuchFrameException elif status in ErrorCode.NO_SUCH_WINDOW: exception_class = NoSuchWindowException elif status in ErrorCode.STALE_ELEMENT_REFERENCE: exception_class = StaleElementReferenceException elif status in ErrorCode.ELEMENT_NOT_VISIBLE: exception_class = ElementNotVisibleException elif status in ErrorCode.INVALID_ELEMENT_STATE: exception_class = InvalidElementStateException elif status in ErrorCode.INVALID_SELECTOR \ or status in ErrorCode.INVALID_XPATH_SELECTOR \ or status in ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPER: exception_class = InvalidSelectorException elif status in ErrorCode.ELEMENT_IS_NOT_SELECTABLE: exception_class = ElementNotSelectableException elif status in ErrorCode.ELEMENT_NOT_INTERACTABLE: exception_class = ElementNotInteractableException elif status in ErrorCode.INVALID_COOKIE_DOMAIN: exception_class = InvalidCookieDomainException elif status in ErrorCode.UNABLE_TO_SET_COOKIE: exception_class = UnableToSetCookieException elif status in ErrorCode.TIMEOUT: exception_class = TimeoutException elif status in ErrorCode.SCRIPT_TIMEOUT: exception_class = TimeoutException elif status in ErrorCode.UNKNOWN_ERROR: exception_class = WebDriverException elif status in ErrorCode.UNEXPECTED_ALERT_OPEN: exception_class = UnexpectedAlertPresentException elif status in ErrorCode.NO_ALERT_OPEN: exception_class = NoAlertPresentException elif status in ErrorCode.IME_NOT_AVAILABLE: exception_class = ImeNotAvailableException elif status in ErrorCode.IME_ENGINE_ACTIVATION_FAILED: exception_class = ImeActivationFailedException elif status in ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS: exception_class = MoveTargetOutOfBoundsException elif status in ErrorCode.JAVASCRIPT_ERROR: exception_class = JavascriptException elif status in ErrorCode.SESSION_NOT_CREATED: exception_class = SessionNotCreatedException elif status in ErrorCode.INVALID_ARGUMENT: exception_class = InvalidArgumentException elif status in ErrorCode.NO_SUCH_COOKIE: exception_class = NoSuchCookieException elif status in ErrorCode.UNABLE_TO_CAPTURE_SCREEN: exception_class = ScreenshotException elif status in ErrorCode.ELEMENT_CLICK_INTERCEPTED: exception_class = ElementClickInterceptedException elif status in ErrorCode.INSECURE_CERTIFICATE: exception_class = InsecureCertificateException elif status in ErrorCode.INVALID_COORDINATES: exception_class = InvalidCoordinatesException elif status in ErrorCode.INVALID_SESSION_ID: exception_class = InvalidSessionIdException elif status in ErrorCode.UNKNOWN_METHOD: exception_class = UnknownMethodException else: exception_class = WebDriverException if value == '' or value is None: value = response['value'] if isinstance(value, basestring): if exception_class == ErrorInResponseException: raise exception_class(response, value) raise exception_class(value) if message == "" and 'message' in value: message = value['message'] screen = None if 'screen' in value: screen = value['screen'] stacktrace = None if 'stackTrace' in value and value['stackTrace']: stacktrace = [] try: for frame in value['stackTrace']: line = self._value_or_default(frame, 'lineNumber', '') file = self._value_or_default(frame, 'fileName', '<anonymous>') if line: file = "%s:%s" % (file, line) meth = self._value_or_default(frame, 'methodName', '<anonymous>') if 'className' in frame: meth = "%s.%s" % (frame['className'], meth) msg = " at %s (%s)" msg = msg % (meth, file) stacktrace.append(msg) except TypeError: pass if exception_class == ErrorInResponseException: raise exception_class(response, message) elif exception_class == UnexpectedAlertPresentException: alert_text = None if 'data' in value: alert_text = value['data'].get('text') elif 'alert' in value: alert_text = value['alert'].get('text') raise exception_class(message, screen, stacktrace, alert_text) > raise exception_class(message, screen, stacktrace) E selenium.common.exceptions.SessionNotCreatedException: Message: Unable to find a matching set of capabilities /usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py:242: SessionNotCreatedException
and in runner.log:
2020-08-25 00:42:43,079 INFO Executing: Process "vagrant ssh -c ipa-run-webui-tests test_webui/test_group.py test_webui/test_user.py --verbose --logging-level=debug --logfile-dir=/vagrant/ --html=/vagrant/report.html --junit-xml=/vagrant/junit.xml" 2020-08-25 00:42:44,942 DEBUG Error: Invalid or corrupt jarfile /opt/selenium.jar 2020-08-25 00:42:45,469 DEBUG The XKEYBOARD keymap compiler (xkbcomp) reports: 2020-08-25 00:42:45,469 DEBUG > Internal error: Could not resolve keysym XF86FullScreen 2020-08-25 00:42:45,473 DEBUG Errors from xkbcomp are not fatal to the X server
This happens since the vagrant image has been updated to freeipa/ci-master-f32 version 0.0.8
Error: Invalid or corrupt jarfile /opt/selenium.jar was already present in the previous template, as we can see in this runner.log SHA1 checksum is same for that in both template versions.
Error: Invalid or corrupt jarfile /opt/selenium.jar
The problem is happening due to an issue with geckodriver v0.27.0, it was reported at https://github.com/mozilla/geckodriver/issues/1756.
v0.27.0
Since the fix won't be available until the next release I'm building new PR-CI templates with the previous version installed (v0.26.0).
v0.26.0
I tested it already and everything worked as expected. As soon the new templates are uploaded I'll submit the changes for freeipa.
Metadata Update from @abiagion: - Issue assigned to abiagion
New PR-CI templates: - https://app.vagrantup.com/freeipa/boxes/ci-master-f32/versions/0.0.9 - https://app.vagrantup.com/freeipa/boxes/ci-ipa-4-8-f32/versions/0.0.8
Metadata Update from @abiagion: - Custom field on_review adjusted to https://github.com/freeipa/freeipa/pull/5072 https://github.com/freeipa/freeipa/pull/5073
PR-CI fix was merged: https://github.com/freeipa/freeipa-pr-ci/pull/389
I had to build new templates, as discussed and tested here: https://github.com/freeipa-pr-ci2/freeipa/pull/371
Bumping the versions used by freeipa: - master: https://github.com/freeipa/freeipa/pull/5072 - ipa-4-8: https://github.com/freeipa/freeipa/pull/5073
master
ipa-4-8
master:
ipa-4-8:
Metadata Update from @frenaud: - Issue close_status updated to: fixed - Issue status updated to: Closed (was: Open)