Acceptance tests using different clients concurrently. Environment deployed from packages.
Build: #3211 was successful
Job: Spaces basic was successful
user of client2 fails to modify privileges of space after joining to it from invitation generated by user of client1[1oz 1op 1oc-RESt-web GUi]: Test case result
The below summarizes the result of the test " user of client2 fails to modify privileges of space after joining to it from invitation generated by user of client1[1oz 1op 1oc-RESt-web GUi]" in build 3,211 of Onedata Products - mixed acceptance pkg - Spaces basic.
- Description
- user of client2 fails to modify privileges of space after joining to it from invitation generated by user of client1[1oz 1op 1oc-RESt-web GUi]
- Test class
- mixed.scenarios.test_spaces_basic
- Method
- test_user_of_client2_fails_to_modify_privileges_of_space_after_joining_to_it_from_invitation_generated_by_user_of_client1[1oz_1op_1oc-REST-web GUI]
- Jira Issue
-
- Duration
- 1 min
- Status
- Failed (Existing Failure)
Error Log
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".list-header-row .save-btn"} (Session info: chrome=104.0.5112.79) selenium = {'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <selenium.webdriver.chrome.webdriver.WebDriver (session="b92bd789e69b15850b8f910fa40e0f99")>} browser_id = 'user1', member_name = 'user1', member_type = 'users' where = 'space' config = 'User management:\n granted: True\nHarvester management:\n granted: True\nDataset & archive management:\n granted: Partially\n privilege subtypes:\n Manage datasets: True\n View archives: False' onepanel = <class 'tests.gui.utils.onepanel.Onepanel'> oz_page = <class 'tests.gui.utils.onezone.OZLoggedIn'>, option = True @wt(parsers.re('user of (?P<browser_id>.*) sees following ' '(?P<option>effective |)privileges of ' '"(?P<member_name>.*)" (?P<member_type>user|group) ' 'in (?P<where>space|group|harvester|automation|cluster) ' 'members subpage:\n(?P<config>(.|\s)*)')) def assert_privileges_in_members_subpage(selenium, browser_id, member_name, member_type, where, config, onepanel, oz_page, option): member_type = member_type + 's' privileges = yaml.load(config) tree = get_privilege_tree(selenium, browser_id, onepanel, oz_page, where, member_type, member_name) is_direct_privileges = False if option == 'effective ' else True # wait for set privileges to be visible in gui try: > tree.assert_privileges(selenium, browser_id, privileges, is_direct_privileges) tests/gui/steps/onezone/members.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <tests.gui.utils.common.privilege_tree.PrivilegeTree object at 0x7f413cd8f7c0> selenium = {'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <selenium.webdriver.chrome.webdriver.WebDriver (session="b92bd789e69b15850b8f910fa40e0f99")>} browser_id = 'user1' privileges = {'Dataset & archive management': {'granted': 'Partially', 'privilege subtypes': {'Manage datasets': True, 'View archives': False}}, 'Harvester management': {'granted': True}, 'User management': {'granted': True}} is_direct_privileges = True def assert_privileges(self, selenium, browser_id, privileges, is_direct_privileges=True): """Assert privileges according to given config. For this method only dict should be passed! Config format given in earlier in yaml is as follow: privilege_type: granted: True/False/Partially privilege subtypes: ---> always and only when granted is Partially privilege_subtype: True/False ... Space management: granted: Partially privilege subtypes: Modify space: True Remove space: False User management: granted: False """ > self._assert_privileges(selenium, browser_id, privileges, is_direct_privileges) tests/gui/utils/common/privilege_tree.py:194: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <tests.gui.utils.common.privilege_tree.PrivilegeTree object at 0x7f413cd8f7c0> selenium = {'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <selenium.webdriver.chrome.webdriver.WebDriver (session="b92bd789e69b15850b8f910fa40e0f99")>} browser_id = 'user1' privileges = {'Dataset & archive management': {'granted': 'Partially', 'privilege subtypes': {'Manage datasets': True, 'View archives': False}}, 'Harvester management': {'granted': True}, 'User management': {'granted': True}} is_direct_privileges = True def _assert_privileges(self, selenium, browser_id, privileges, is_direct_privileges): for privilege_name, privilege_group in privileges.items(): > self._assert_privilege_group(selenium, browser_id, privilege_group, privilege_name, is_direct_privileges) tests/gui/utils/common/privilege_tree.py:200: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <tests.gui.utils.common.privilege_tree.PrivilegeTree object at 0x7f413cd8f7c0> selenium = {'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <selenium.webdriver.chrome.webdriver.WebDriver (session="b92bd789e69b15850b8f910fa40e0f99")>} browser_id = 'user1', group = {'granted': True}, name = 'User management' is_direct_privileges = True def _assert_privilege_group(self, selenium, browser_id, group, name, is_direct_privileges): driver = selenium[browser_id] privilege_row = self.privilege_groups[name] granted = group['granted'] if granted == 'Partially': sub_privileges = group['privilege subtypes'] privilege_row.expand(driver) for sub_name, sub_granted in sub_privileges.items(): if is_direct_privileges: self.privileges[sub_name].assert_privilege_granted(sub_granted) else: self.privileges[sub_name].assert_effective_privilege_granted(sub_granted) privilege_row.collapse(driver) if is_direct_privileges: > privilege_row.assert_privilege_granted(granted) tests/gui/utils/common/privilege_tree.py:218: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <tests.gui.utils.common.privilege_tree.PrivilegeGroup object at 0x7f413cda4190> granted = True def assert_privilege_granted(self, granted): if granted == 'Partially': msg = f'{self.name} should be partially granted but is not' assert self.toggle.is_partial_checked(), msg elif granted: msg = f'{self.name} should be granted but is not' > assert self.toggle.is_checked(), msg E AssertionError: User management should be granted but is not tests/gui/utils/common/privilege_tree.py:123: AssertionError During handling of the above exception, another exception occurred: selenium = {'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <selenium.webdriver.chrome.webdriver.WebDriver (session="b92bd789e69b15850b8f910fa40e0f99")>} browser_id = 'user1', member_name = 'user1', member_type = 'user' where = 'space' config = 'User management:\n granted: True\nHarvester management:\n granted: True\nDataset & archive management:\n granted: Partially\n privilege subtypes:\n Manage datasets: True\n View archives: False' onepanel = <class 'tests.gui.utils.onepanel.Onepanel'> oz_page = <class 'tests.gui.utils.onezone.OZLoggedIn'>, option = 'sets' @wt(parsers.re('user of (?P<browser_id>.*) (?P<option>sets|tries to set) ' 'following privileges for "(?P<member_name>.*)" ' '(?P<member_type>user|group) ' 'in (?P<where>space|group|harvester|cluster|automation) members ' r'subpage:\n(?P<config>(.|\s)*)')) def set_privileges_in_members_subpage(selenium, browser_id, member_name, member_type, where, config, onepanel, oz_page, option): try: > assert_privileges_in_members_subpage(selenium, browser_id, member_name, member_type, where, config, onepanel, oz_page, True) tests/gui/steps/onezone/members.py:515: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = ({'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <sel...ve management:\n granted: Partially\n privilege subtypes:\n Manage datasets: True\n View archives: False', ...) kwargs = {} ba = <BoundArguments (selenium={'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5...epanel=<class 'tests.gui.utils.onepanel.Onepanel'>, oz_page=<class 'tests.gui.utils.onezone.OZLoggedIn'>, option=True)> param = <Parameter "option">, ann = <class 'inspect._empty'> @wraps(fun) def wrapper(*args, **kwargs): ba = sig.bind(*args, **kwargs) ba.apply_defaults() for param in parameters.values(): ann = param.annotation if ann is not inspect.Parameter.empty: value = ba.arguments[param.name] try: if not isinstance(value, ann): ba.arguments[param.name] = ann(value) except Exception as ex: msg = f"Cannot cast '{param.name}' <{value}> to {ann}" raise ValueError(msg) from ex > return fun(*ba.args, **ba.kwargs) tests/utils/bdd_utils.py:78: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ selenium = {'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <selenium.webdriver.chrome.webdriver.WebDriver (session="b92bd789e69b15850b8f910fa40e0f99")>} browser_id = 'user1', member_name = 'user1', member_type = 'users' where = 'space' config = 'User management:\n granted: True\nHarvester management:\n granted: True\nDataset & archive management:\n granted: Partially\n privilege subtypes:\n Manage datasets: True\n View archives: False' onepanel = <class 'tests.gui.utils.onepanel.Onepanel'> oz_page = <class 'tests.gui.utils.onezone.OZLoggedIn'>, option = True @wt(parsers.re('user of (?P<browser_id>.*) sees following ' '(?P<option>effective |)privileges of ' '"(?P<member_name>.*)" (?P<member_type>user|group) ' 'in (?P<where>space|group|harvester|automation|cluster) ' 'members subpage:\n(?P<config>(.|\s)*)')) def assert_privileges_in_members_subpage(selenium, browser_id, member_name, member_type, where, config, onepanel, oz_page, option): member_type = member_type + 's' privileges = yaml.load(config) tree = get_privilege_tree(selenium, browser_id, onepanel, oz_page, where, member_type, member_name) is_direct_privileges = False if option == 'effective ' else True # wait for set privileges to be visible in gui try: tree.assert_privileges(selenium, browser_id, privileges, is_direct_privileges) except AssertionError: time.sleep(2) > tree.assert_privileges(selenium, browser_id, privileges, is_direct_privileges) tests/gui/steps/onezone/members.py:599: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <tests.gui.utils.common.privilege_tree.PrivilegeTree object at 0x7f413cd8f7c0> selenium = {'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <selenium.webdriver.chrome.webdriver.WebDriver (session="b92bd789e69b15850b8f910fa40e0f99")>} browser_id = 'user1' privileges = {'Dataset & archive management': {'granted': 'Partially', 'privilege subtypes': {'Manage datasets': True, 'View archives': False}}, 'Harvester management': {'granted': True}, 'User management': {'granted': True}} is_direct_privileges = True def assert_privileges(self, selenium, browser_id, privileges, is_direct_privileges=True): """Assert privileges according to given config. For this method only dict should be passed! Config format given in earlier in yaml is as follow: privilege_type: granted: True/False/Partially privilege subtypes: ---> always and only when granted is Partially privilege_subtype: True/False ... Space management: granted: Partially privilege subtypes: Modify space: True Remove space: False User management: granted: False """ > self._assert_privileges(selenium, browser_id, privileges, is_direct_privileges) tests/gui/utils/common/privilege_tree.py:194: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <tests.gui.utils.common.privilege_tree.PrivilegeTree object at 0x7f413cd8f7c0> selenium = {'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <selenium.webdriver.chrome.webdriver.WebDriver (session="b92bd789e69b15850b8f910fa40e0f99")>} browser_id = 'user1' privileges = {'Dataset & archive management': {'granted': 'Partially', 'privilege subtypes': {'Manage datasets': True, 'View archives': False}}, 'Harvester management': {'granted': True}, 'User management': {'granted': True}} is_direct_privileges = True def _assert_privileges(self, selenium, browser_id, privileges, is_direct_privileges): for privilege_name, privilege_group in privileges.items(): > self._assert_privilege_group(selenium, browser_id, privilege_group, privilege_name, is_direct_privileges) tests/gui/utils/common/privilege_tree.py:200: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <tests.gui.utils.common.privilege_tree.PrivilegeTree object at 0x7f413cd8f7c0> selenium = {'user1': <selenium.webdriver.chrome.webdriver.WebDriver (session="dbf47b2aca3cbf5ea2900d1c5ffcaddb")>, 'user2': <selenium.webdriver.chrome.webdriver.WebDriver (session="b92bd789e69b15850b8f910fa40e0f99")>} browser_id = 'user1', group = {'granted': True}, name = 'User management' is_direct_privileges = True def _assert_privilege_group(self, selenium, browser_id, group, name, is_direct_privileges): driver = selenium[browser_id] privilege_row = self.privilege_groups[name] granted = group['granted'] if granted == 'Partially': sub_privileges = group['privilege subtypes'] privilege_row.expand(driver) for sub_name, sub_granted in sub_privileges.items(): if is_direct_privileges: self.privileges[sub_name].assert_privilege_granted(sub_granted) else: self.privileges[sub_name].assert_effective_privilege_granted(sub_granted) privilege_row.collapse(driver) if is_direct_privileges: > privilege_row.assert_privilege_granted(granted) tests/gui/utils/common/privilege_tree.py:218: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <tests.gui.utils.common.privilege_tree.PrivilegeGroup object at 0x7f413cda4250> granted = True def assert_privilege_granted(self, granted): if granted == 'Partially': msg = f'{self.name} should be partially granted but is not' assert self.toggle.is_partial_checked(), msg elif granted: msg = f'{self.name} should be granted but is not' > assert self.toggle.is_checked(), msg E AssertionError: User management should be granted but is not tests/gui/utils/common/privilege_tree.py:123: AssertionError During handling of the above exception, another exception occurred: request = <FixtureRequest for <Function 'test_user_of_client2_fails_to_modify_privileges_of_space_after_joining_to_it_from_invitation_generated_by_user_of_client1[1oz_1op_1oc-REST-web GUI]'>> @pytest.mark.usefixtures(*function_args) def scenario_wrapper(request): > _execute_scenario(feature, scenario, request, encoding) /usr/local/lib/python3.8/dist-packages/pytest_bdd/scenario.py:227: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/local/lib/python3.8/dist-packages/pytest_bdd/scenario.py:189: in _execute_scenario _execute_step_function(request, scenario, step, step_func) /usr/local/lib/python3.8/dist-packages/pytest_bdd/scenario.py:130: in _execute_step_function step_func(**kwargs) tests/utils/bdd_utils.py:78: in wrapper return fun(*ba.args, **ba.kwargs) <decorator-gen-1111>:2: in fail_to_set_privileges_in_space_in_oz ??? tests/utils/utils.py:95: in wrapper return fun(*args, **kwargs) tests/mixed/steps/members.py:30: in fail_to_set_privileges_in_space_in_oz fail_to_set_privileges_using_op_gui(user, space_name, member_name, tests/gui/meta_steps/onezone/members.py:32: in fail_to_set_privileges_using_op_gui set_privileges_in_members_subpage(selenium, user, member_name, tests/utils/bdd_utils.py:78: in wrapper return fun(*ba.args, **ba.kwargs) tests/gui/steps/onezone/members.py:526: in set_privileges_in_members_subpage click_button_on_element_header_in_members_and_wait( <decorator-gen-821>:2: in click_button_on_element_header_in_members_and_wait ??? tests/utils/utils.py:95: in wrapper return fun(*args, **kwargs) tests/gui/steps/onezone/members.py:640: in click_button_on_element_header_in_members_and_wait driver.find_element_by_css_selector( /usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py:597: in find_element_by_css_selector return self.find_element(by=By.CSS_SELECTOR, value=css_selector) /usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py:964: in find_element return self.execute(Command.FIND_ELEMENT, { /usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py:320: in execute self.error_handler.check_response(response) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7f413c9544c0> response = {'status': 404, 'value': '{"value":{"error":"no such element","message":"no such element: Unable to locate element: {\...\\n#16 0x55d0f27543bf \\u003Cunknown>\\n#17 0x55d0f276eabe \\u003Cunknown>\\n#18 0x7f1d8ca05609 \\u003Cunknown>\\n"}}'} 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.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".list-header-row .save-btn"} E (Session info: chrome=104.0.5112.79) /usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py:242: NoSuchElementException