Flaky Frontend tests

Summary

The frontend e2e test are flaky and fail in irregular intervals. This is quite annoying since the whole pipeline has to be restarted.

Steps to reproduce

Run the pipeline a bunch of times. Some of them will fail...

Example Project


What is the current bug behavior?


What is the expected correct behavior?


Relevant logs and/or screenshots

Output of recent failed jobs:

[0KRunning with gitlab-runner 11.3.1 (0aa5179e)
[0;m[0K  on robins-grady-docker-runner 6ac1a4ac
[0;m[0KUsing Docker executor with image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KStarting service postgres:9.6 ...
[0;m[0KPulling docker image postgres:9.6 ...
[0;m[0KUsing docker image sha256:aee5bfb5ec09669f4c90d9cbab577884843a3194dfc1e87bd0531b82c3fc4b71 for postgres:9.6 ...
[0;m[0KWaiting for services to be up and running...
[0;m[0KPulling docker image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KUsing docker image sha256:5c6715f7a9e04885d10243f690c606c909a0f034084de3a96d1963cfc84ca4b3 for docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;msection_start:1550760732:prepare_script
[0KRunning on runner-6ac1a4ac-project-985-concurrent-2 via vmd30259.contaboserver.net...
section_end:1550760733:prepare_script
[0Ksection_start:1550760733:get_sources
[0K[32;1mFetching changes...[0;m
Removing .venv/
HEAD is now at aed5503 Changes in CI Pipeline and tagging of images
[32;1mChecking out aed55038 as only-tagged-master-branches-are-built...[0;m
[32;1mSkipping Git submodules setup[0;m
section_end:1550760737:get_sources
[0Ksection_start:1550760737:restore_cache
[0Ksection_end:1550760739:restore_cache
[0Ksection_start:1550760739:download_artifacts
[0K[32;1mDownloading artifacts for build_frontend (144082)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144082 responseStatus[0;m=200 OK token[0;m=oeD74zo5
[32;1mDownloading artifacts for build_test_env (144081)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144081 responseStatus[0;m=200 OK token[0;m=zf36gwz5
[0;33mWARNING: .venv/bin/python: chmod .venv/bin/python: no such file or directory (suppressing repeats)[0;m 
section_end:1550760757:download_artifacts
[0Ksection_start:1550760757:build_script
[0K[32;1m$ source .venv/bin/activate[0;m
[32;1m$ cp frontend/dist/index.html core/templates[0;m
[32;1m$ python util/format_index.py[0;m
[32;1m$ python manage.py collectstatic --no-input[0;m

185 static files copied to '/builds/j.michal/grady/static', 551 post-processed.
[32;1m$ HEADLESS_TESTS=True pytest --ds=grady.settings.test functional_tests[0;m
============================= test session starts ==============================
platform linux -- Python 3.6.8, pytest-3.8.2, py-1.6.0, pluggy-0.7.1
Django settings: grady.settings.test (from command line option)
rootdir: /builds/j.michal/grady, inifile:
plugins: django-3.4.7, cov-2.6.1
collected 27 items

functional_tests/test_auto_logout.py .                                   [  3%]
functional_tests/test_export_modal.py .......                            [ 29%]
functional_tests/test_feedback_creation.py .........                     [ 62%]
functional_tests/test_front_pages.py ...F..                              [ 85%]
functional_tests/test_login_page.py ....                                 [100%]

=================================== FAILURES ===================================
____________ FrontPageTestsReviewer.test_available_tasks_are_shown _____________

self = <functional_tests.test_front_pages.FrontPageTestsReviewer testMethod=test_available_tasks_are_shown>

    def test_available_tasks_are_shown(self):
        self._login()
        tasks = self.browser.find_element_by_name('subscription-list')
>       title = tasks.find_element_by_class_name('v-toolbar__title')

functional_tests/test_front_pages.py:51: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py:398: in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py:659: in find_element
    {"using": by, "value": value})['value']
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py:633: in _execute
    return self._parent.execute(command, params)
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:321: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7fd7606f9b70>
response = {'status': 404, 'value': '{"value":{"error":"stale element reference","message":"The element reference of <div class=\...req<@chrome://marionette/content/listener.js:485:20\\ndispatch/<@chrome://marionette/content/listener.js:484:15\\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.StaleElementReferenceException: Message: The element reference of <div class="v-card v-sheet theme--light elevation-2" name="subscription-list"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

.venv/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py:242: StaleElementReferenceException
----------------------------- Captured stderr call -----------------------------
[2019-02-21 14:56:07,613] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 14:56:07,853] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 14:56:08,063] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 14:56:08,323] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 14:56:09,758] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 14:56:09,758] [WARNING] django.request       Not Found: /favicon.ico
------------------------------ Captured log call -------------------------------
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
log.py                     228 WARNING  Not Found: /favicon.ico
=============================== warnings summary ===============================
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
source:175: DeprecationWarning: invalid escape sequence \_
source:191: DeprecationWarning: invalid escape sequence \_
source:359: DeprecationWarning: invalid escape sequence \_
source:375: DeprecationWarning: invalid escape sequence \_
source:626: DeprecationWarning: invalid escape sequence \*
source:650: DeprecationWarning: invalid escape sequence \*

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

-- Docs: https://docs.pytest.org/en/latest/warnings.html
============== 1 failed, 26 passed, 35 warnings in 247.10 seconds ==============
section_end:1550761013:build_script
[0Ksection_start:1550761013:after_script
[0Ksection_end:1550761015:after_script
[0Ksection_start:1550761015:upload_artifacts_on_failure
[0Ksection_end:1550761017:upload_artifacts_on_failure
[0K[31;1mERROR: Job failed: exit code 1
[0;m
[0KRunning with gitlab-runner 11.3.1 (0aa5179e)
[0;m[0K  on robins-grady-docker-runner 6ac1a4ac
[0;m[0KUsing Docker executor with image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KStarting service postgres:9.6 ...
[0;m[0KPulling docker image postgres:9.6 ...
[0;m[0KUsing docker image sha256:aee5bfb5ec09669f4c90d9cbab577884843a3194dfc1e87bd0531b82c3fc4b71 for postgres:9.6 ...
[0;m[0KWaiting for services to be up and running...
[0;m[0KPulling docker image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KUsing docker image sha256:5c6715f7a9e04885d10243f690c606c909a0f034084de3a96d1963cfc84ca4b3 for docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;msection_start:1550759713:prepare_script
[0KRunning on runner-6ac1a4ac-project-985-concurrent-3 via vmd30259.contaboserver.net...
section_end:1550759716:prepare_script
[0Ksection_start:1550759716:get_sources
[0K[32;1mFetching changes...[0;m
Removing frontend/dist/
Removing frontend/node_modules/
HEAD is now at 19d8ed4 fixed incorrect block comment highlighting
From https://gitlab.gwdg.de/j.michal/grady
 * [new branch]      only-tagged-master-branches-are-built -> origin/only-tagged-master-branches-are-built
[32;1mChecking out aed55038 as only-tagged-master-branches-are-built...[0;m
[32;1mSkipping Git submodules setup[0;m
section_end:1550759721:get_sources
[0Ksection_start:1550759721:restore_cache
[0Ksection_end:1550759722:restore_cache
[0Ksection_start:1550759722:download_artifacts
[0K[32;1mDownloading artifacts for build_frontend (144069)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144069 responseStatus[0;m=200 OK token[0;m=9oECbb7P
[32;1mDownloading artifacts for build_test_env (144068)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144068 responseStatus[0;m=200 OK token[0;m=tt5YuyPC
[0;33mWARNING: .venv/bin/python: chmod .venv/bin/python: no such file or directory (suppressing repeats)[0;m 
section_end:1550759747:download_artifacts
[0Ksection_start:1550759747:build_script
[0K[32;1m$ source .venv/bin/activate[0;m
[32;1m$ cp frontend/dist/index.html core/templates[0;m
[32;1m$ python util/format_index.py[0;m
[32;1m$ python manage.py collectstatic --no-input[0;m

185 static files copied to '/builds/j.michal/grady/static', 551 post-processed.
[32;1m$ HEADLESS_TESTS=True pytest --ds=grady.settings.test functional_tests[0;m
============================= test session starts ==============================
platform linux -- Python 3.6.8, pytest-4.0.2, py-1.7.0, pluggy-0.8.0
Django settings: grady.settings.test (from command line option)
rootdir: /builds/j.michal/grady, inifile:
plugins: django-3.4.7, cov-2.6.1
collected 27 items

functional_tests/test_auto_logout.py .                                   [  3%]
functional_tests/test_export_modal.py .....F.                            [ 29%]
functional_tests/test_feedback_creation.py ..F......                     [ 62%]
functional_tests/test_front_pages.py ......                              [ 85%]
functional_tests/test_login_page.py ....                                 [100%]

=================================== FAILURES ===================================
______________ ExportTestModal.test_export_student_scores_as_json ______________

self = <functional_tests.test_export_modal.ExportTestModal testMethod=test_export_student_scores_as_json>

    def test_export_student_scores_as_json(self):
        self._login()
        fact.StudentInfoFactory()
>       export_btn = self.browser.find_element_by_id('export-btn')

functional_tests/test_export_modal.py:86: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:360: in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:978: in find_element
    'value': value})['value']
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:321: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7fe0ccf9beb8>
response = {'status': 404, 'value': '{"value":{"error":"no such element","message":"Unable to locate element: [id=\\"export-btn\\...ror@chrome://marionette/content/error.js:434:5\\nelement.find/</<@chrome://marionette/content/element.js:341:16\\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: Unable to locate element: [id="export-btn"]

.venv/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py:242: NoSuchElementException
______________ TestFeedbackCreationTutor.test_can_give_zero_score ______________

self = <functional_tests.test_feedback_creation.TestFeedbackCreationTutor testMethod=test_can_give_zero_score>

    def test_can_give_zero_score(self):
        self._login()
        self._go_to_subscription()
        code = self._reconstruct_submission_code()
        self.browser.find_element_by_id('score-zero').click()
        self.write_comments_on_lines([(0, 'A comment')])
        self.browser.find_element_by_id('submit-feedback').click()
        WebDriverWait(self.browser, 3).until(self.wait_until_code_changes(code))
        submission_for_code = Submission.objects.get(text=code)
>       self.assertEqual(0, submission_for_code.feedback.score)

functional_tests/test_feedback_creation.py:167: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <django.db.models.fields.related_descriptors.ReverseOneToOneDescriptor object at 0x7fe0ce92c198>
instance = <Submission: Submission 2cc587cb-e369-4669-9b58-7a807bea7674>
cls = <class 'core.models.Submission'>

    def __get__(self, instance, cls=None):
        """
        Get the related instance through the reverse relation.
    
        With the example above, when getting ``place.restaurant``:
    
        - ``self`` is the descriptor managing the ``restaurant`` attribute
        - ``instance`` is the ``place`` instance
        - ``cls`` is the ``Place`` class (unused)
    
        Keep in mind that ``Restaurant`` holds the foreign key to ``Place``.
        """
        if instance is None:
            return self
    
        # The related instance is loaded from the database and then cached
        # by the field on the model instance state. It can also be pre-cached
        # by the forward accessor (ForwardManyToOneDescriptor).
        try:
            rel_obj = self.related.get_cached_value(instance)
        except KeyError:
            related_pk = instance.pk
            if related_pk is None:
                rel_obj = None
            else:
                filter_args = self.related.field.get_forward_related_filter(instance)
                try:
                    rel_obj = self.get_queryset(instance=instance).get(**filter_args)
                except self.related.related_model.DoesNotExist:
                    rel_obj = None
                else:
                    # Set the forward accessor cache on the related object to
                    # the current instance to avoid an extra SQL query if it's
                    # accessed later on.
                    self.related.field.set_cached_value(rel_obj, instance)
            self.related.set_cached_value(instance, rel_obj)
    
        if rel_obj is None:
            raise self.RelatedObjectDoesNotExist(
                "%s has no %s." % (
                    instance.__class__.__name__,
>                   self.related.get_accessor_name()
                )
            )
E           core.models.Submission.feedback.RelatedObjectDoesNotExist: Submission has no feedback.

.venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py:414: RelatedObjectDoesNotExist
----------------------------- Captured stderr call -----------------------------
[2019-02-21 14:38:00,106] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 14:38:00,424] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 14:38:07,356] [INFO] core.models          tutor is assigned to  Submission Meta of Submission 2cc587cb-e369-4669-9b58-7a807bea7674

        done_assignments      = 0
        has_active_assignment = False
        has_feedback          = False
        has_final_feedback    = False
        feedback_authors      = <QuerySet []>
         (feedback-creation)
[2019-02-21 14:38:07,363] [DEBUG] core.signals         SIGNAL -- update_active_after_assignment_save
[2019-02-21 14:38:07,479] [INFO] core.models          tutor is assigned to  Submission Meta of Submission 5aa963c1-9ab3-47b5-bda0-bdb64161f7f2

        done_assignments      = 0
        has_active_assignment = False
        has_feedback          = False
        has_final_feedback    = False
        feedback_authors      = <QuerySet []>
         (feedback-creation)
[2019-02-21 14:38:07,494] [DEBUG] core.signals         SIGNAL -- update_active_after_assignment_save
[2019-02-21 14:38:10,583] [WARNING] django.request       Unauthorized: /api/feedback/
[2019-02-21 14:38:10,583] [WARNING] django.request       Unauthorized: /api/feedback/
------------------------------ Captured log call -------------------------------
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
models.py                  681 INFO     tutor is assigned to  Submission Meta of Submission 2cc587cb-e369-4669-9b58-7a807bea7674

        done_assignments      = 0
        has_active_assignment = False
        has_feedback          = False
        has_final_feedback    = False
        feedback_authors      = <QuerySet []>
         (feedback-creation)
signals.py                  25 DEBUG    SIGNAL -- update_active_after_assignment_save
models.py                  681 INFO     tutor is assigned to  Submission Meta of Submission 5aa963c1-9ab3-47b5-bda0-bdb64161f7f2

        done_assignments      = 0
        has_active_assignment = False
        has_feedback          = False
        has_final_feedback    = False
        feedback_authors      = <QuerySet []>
         (feedback-creation)
signals.py                  25 DEBUG    SIGNAL -- update_active_after_assignment_save
log.py                     228 WARNING  Unauthorized: /api/feedback/
=============================== warnings summary ===============================
functional_tests/test_auto_logout.py::TestAutoLogout::test_auto_logout_can_continue
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_export_modal.py::ExportTestModal::test_export_allgood_tooltip_all_corrected
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_export_modal.py::ExportTestModal::test_export_green_all_corrected
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_export_modal.py::ExportTestModal::test_export_instance
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_export_modal.py::ExportTestModal::test_export_list_popup_contains_correct_items
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_export_modal.py::ExportTestModal::test_export_red_uncorrected_submissions
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_export_modal.py::ExportTestModal::test_export_student_scores_as_json
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_export_modal.py::ExportTestModal::test_export_warning_tooltip_uncorrected_submissions
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_feedback_creation.py::TestFeedbackCreationTutor::test_can_give_comments_and_decreased_score
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_feedback_creation.py::TestFeedbackCreationTutor::test_can_give_max_score
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_feedback_creation.py::TestFeedbackCreationTutor::test_can_give_zero_score
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_feedback_creation.py::TestFeedbackCreationTutor::test_can_skip_submission
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_feedback_creation.py::TestFeedbackCreationTutor::test_can_validate_submission
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_feedback_creation.py::TestFeedbackCreationTutor::test_student_text_is_correctly_displayed
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_feedback_creation.py::TestFeedbackCreationTutor::test_submission_type_is_correctly_displayed
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_feedback_creation.py::TestFeedbackCreationTutor::test_test_output_is_displayed
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_feedback_creation.py::TestFeedbackCreationTutor::test_zero_score_without_warning_gives_error
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_front_pages.py::FrontPageTestsTutor::test_available_tasks_are_shown
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_front_pages.py::FrontPageTestsTutor::test_side_bar_contains_correct_items
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_front_pages.py::FrontPageTestsTutor::test_statistics_are_shown
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_front_pages.py::FrontPageTestsReviewer::test_available_tasks_are_shown
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_front_pages.py::FrontPageTestsReviewer::test_side_bar_contains_correct_items
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_front_pages.py::FrontPageTestsReviewer::test_statistics_are_shown
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_login_page.py::LoginPageTest::test_reviewer_can_login
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_login_page.py::LoginPageTest::test_student_can_login
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

functional_tests/test_login_page.py::LoginPageTest::test_tutor_can_login
  /builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
    DeprecationWarning

-- Docs: https://docs.pytest.org/en/latest/warnings.html
============== 2 failed, 25 passed, 29 warnings in 255.99 seconds ==============
section_end:1550760015:build_script
[0Ksection_start:1550760015:after_script
[0Ksection_end:1550760016:after_script
[0Ksection_start:1550760016:upload_artifacts_on_failure
[0Ksection_end:1550760018:upload_artifacts_on_failure
[0K[31;1mERROR: Job failed: exit code 1
[0;m
[0KRunning with gitlab-runner 11.3.1 (0aa5179e)
[0;m[0K  on robins-grady-docker-runner 6ac1a4ac
[0;m[0KUsing Docker executor with image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KStarting service postgres:9.6 ...
[0;m[0KPulling docker image postgres:9.6 ...
[0;m[0KUsing docker image sha256:aee5bfb5ec09669f4c90d9cbab577884843a3194dfc1e87bd0531b82c3fc4b71 for postgres:9.6 ...
[0;m[0KWaiting for services to be up and running...
[0;m[0KPulling docker image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KUsing docker image sha256:5c6715f7a9e04885d10243f690c606c909a0f034084de3a96d1963cfc84ca4b3 for docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;msection_start:1550756700:prepare_script
[0KRunning on runner-6ac1a4ac-project-985-concurrent-2 via vmd30259.contaboserver.net...
section_end:1550756703:prepare_script
[0Ksection_start:1550756703:get_sources
[0K[32;1mFetching changes...[0;m
Removing .pytest_cache/
Removing .venv/
Removing core/__pycache__/
Removing core/migrations/__pycache__/
Removing core/serializers/__pycache__/
Removing core/views/__pycache__/
Removing frontend/dist/
Removing frontend/node_modules/
Removing functional_tests/__pycache__/
Removing geckodriver.log
Removing grady/__pycache__/
Removing grady/settings/__pycache__/
Removing secret
Removing static/
Removing util/__pycache__/
HEAD is now at 19d8ed4 fixed incorrect block comment highlighting
From https://gitlab.gwdg.de/j.michal/grady
 - [deleted]         (none)     -> origin/141-incorrect-syntax-highlighting-for-block-comments
   b08b741..19d8ed4  master     -> origin/master
[32;1mChecking out 19d8ed4d as master...[0;m
[32;1mSkipping Git submodules setup[0;m
section_end:1550756707:get_sources
[0Ksection_start:1550756707:restore_cache
[0Ksection_end:1550756709:restore_cache
[0Ksection_start:1550756709:download_artifacts
[0K[32;1mDownloading artifacts for build_frontend (144036)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144036 responseStatus[0;m=200 OK token[0;m=eWNFh_JV
[32;1mDownloading artifacts for build_test_env (144035)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144035 responseStatus[0;m=200 OK token[0;m=VCrFR_pT
[0;33mWARNING: .venv/bin/python: chmod .venv/bin/python: no such file or directory (suppressing repeats)[0;m 
section_end:1550756727:download_artifacts
[0Ksection_start:1550756727:build_script
[0K[32;1m$ source .venv/bin/activate[0;m
[32;1m$ cp frontend/dist/index.html core/templates[0;m
[32;1m$ python util/format_index.py[0;m
[32;1m$ python manage.py collectstatic --no-input[0;m

185 static files copied to '/builds/j.michal/grady/static', 551 post-processed.
[32;1m$ HEADLESS_TESTS=True pytest --ds=grady.settings.test functional_tests[0;m
============================= test session starts ==============================
platform linux -- Python 3.6.8, pytest-3.8.2, py-1.6.0, pluggy-0.7.1
Django settings: grady.settings.test (from command line option)
rootdir: /builds/j.michal/grady, inifile:
plugins: django-3.4.7, cov-2.6.1
collected 27 items

functional_tests/test_auto_logout.py .                                   [  3%]
functional_tests/test_export_modal.py .......                            [ 29%]
functional_tests/test_feedback_creation.py F........                     [ 62%]
functional_tests/test_front_pages.py ......                              [ 85%]
functional_tests/test_login_page.py ....                                 [100%]

=================================== FAILURES ===================================
_____ TestFeedbackCreationTutor.test_can_give_comments_and_decreased_score _____

self = <functional_tests.test_feedback_creation.TestFeedbackCreationTutor testMethod=test_can_give_comments_and_decreased_score>

    def test_can_give_comments_and_decreased_score(self):
        self._login()
>       self._go_to_subscription()

functional_tests/test_feedback_creation.py:171: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
functional_tests/test_feedback_creation.py:57: in _go_to_subscription
    tasks = self.browser.find_element_by_name('subscription-list')
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:496: in find_element_by_name
    return self.find_element(by=By.NAME, value=name)
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:978: in find_element
    'value': value})['value']
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:321: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7f80341ea710>
response = {'status': 404, 'value': '{"value":{"error":"no such element","message":"Unable to locate element: [name=\\"subscripti...ror@chrome://marionette/content/error.js:434:5\\nelement.find/</<@chrome://marionette/content/element.js:341:16\\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: Unable to locate element: [name="subscription-list"]

.venv/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py:242: NoSuchElementException
----------------------------- Captured stderr call -----------------------------
[2019-02-21 13:47:04,119] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 13:47:04,380] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 13:47:07,340] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:47:07,340] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:47:07,344] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:47:07,344] [WARNING] django.request       Not Found: /favicon.ico
------------------------------ Captured log call -------------------------------
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
log.py                     228 WARNING  Not Found: /favicon.ico
log.py                     228 WARNING  Not Found: /favicon.ico
=============================== warnings summary ===============================
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
source:359: DeprecationWarning: invalid escape sequence \_
source:375: DeprecationWarning: invalid escape sequence \_
source:626: DeprecationWarning: invalid escape sequence \*
source:650: DeprecationWarning: invalid escape sequence \*

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

-- Docs: https://docs.pytest.org/en/latest/warnings.html
============== 1 failed, 26 passed, 32 warnings in 241.44 seconds ==============
section_end:1550756977:build_script
[0Ksection_start:1550756977:after_script
[0Ksection_end:1550756979:after_script
[0Ksection_start:1550756979:upload_artifacts_on_failure
[0Ksection_end:1550756980:upload_artifacts_on_failure
[0K[31;1mERROR: Job failed: exit code 1
[0;m
[0KRunning with gitlab-runner 11.3.1 (0aa5179e)
[0;m[0K  on robins-grady-docker-runner 6ac1a4ac
[0;m[0KUsing Docker executor with image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KStarting service postgres:9.6 ...
[0;m[0KPulling docker image postgres:9.6 ...
[0;m[0KUsing docker image sha256:aee5bfb5ec09669f4c90d9cbab577884843a3194dfc1e87bd0531b82c3fc4b71 for postgres:9.6 ...
[0;m[0KWaiting for services to be up and running...
[0;m[0KPulling docker image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KUsing docker image sha256:5c6715f7a9e04885d10243f690c606c909a0f034084de3a96d1963cfc84ca4b3 for docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;msection_start:1550754880:prepare_script
[0KRunning on runner-6ac1a4ac-project-985-concurrent-3 via vmd30259.contaboserver.net...
section_end:1550754881:prepare_script
[0Ksection_start:1550754881:get_sources
[0K[32;1mFetching changes...[0;m
Removing frontend/dist/
Removing frontend/node_modules/
HEAD is now at b08b741 Fixed copy to clipboard
From https://gitlab.gwdg.de/j.michal/grady
   b08b741..19d8ed4  141-incorrect-syntax-highlighting-for-block-comments -> origin/141-incorrect-syntax-highlighting-for-block-comments
[32;1mChecking out 19d8ed4d as 141-incorrect-syntax-highlighting-for-block-comments...[0;m
[32;1mSkipping Git submodules setup[0;m
section_end:1550754886:get_sources
[0Ksection_start:1550754886:restore_cache
[0Ksection_end:1550754888:restore_cache
[0Ksection_start:1550754888:download_artifacts
[0K[32;1mDownloading artifacts for build_frontend (144008)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144008 responseStatus[0;m=200 OK token[0;m=bM7sFemU
[32;1mDownloading artifacts for build_test_env (144007)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144007 responseStatus[0;m=200 OK token[0;m=QMFpyaf5
[0;33mWARNING: .venv/bin/python: chmod .venv/bin/python: no such file or directory (suppressing repeats)[0;m 
section_end:1550754910:download_artifacts
[0Ksection_start:1550754910:build_script
[0K[32;1m$ source .venv/bin/activate[0;m
[32;1m$ cp frontend/dist/index.html core/templates[0;m
[32;1m$ python util/format_index.py[0;m
[32;1m$ python manage.py collectstatic --no-input[0;m

185 static files copied to '/builds/j.michal/grady/static', 551 post-processed.
[32;1m$ HEADLESS_TESTS=True pytest --ds=grady.settings.test functional_tests[0;m
============================= test session starts ==============================
platform linux -- Python 3.6.8, pytest-3.8.2, py-1.6.0, pluggy-0.7.1
Django settings: grady.settings.test (from command line option)
rootdir: /builds/j.michal/grady, inifile:
plugins: django-3.4.7, cov-2.6.1
collected 27 items

functional_tests/test_auto_logout.py F                                   [  3%]
functional_tests/test_export_modal.py .......                            [ 29%]
functional_tests/test_feedback_creation.py F........                     [ 62%]
functional_tests/test_front_pages.py ......                              [ 85%]
functional_tests/test_login_page.py ....                                 [100%]

=================================== FAILURES ===================================
_________________ TestAutoLogout.test_auto_logout_can_continue _________________

self = <functional_tests.test_auto_logout.TestAutoLogout testMethod=test_auto_logout_can_continue>

    def test_auto_logout_can_continue(self):
        with self.settings(JWT_AUTH={
            'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=5),
            'JWT_ALLOW_REFRESH': True,
        }
        ):
            self._login()
            initial_token = self.browser.execute_script(
                'return sessionStorage["token"]'
            )
            logout_dialog = self.browser.find_element_by_id('logout-dialog')
            WebDriverWait(self.browser, 5).until(
                ec.visibility_of_element_located((By.ID, 'logout-dialog')))
            logout_dialog.find_element_by_id('continue-btn').click()
            # explicit sleep is unfortunately necessary here, since we need to wait
            # for the initial token to expire and the site to be the same
            time.sleep(2)
            self.assertNotIn('login', self.browser.current_url)
            new_token = self.browser.execute_script(
                'return sessionStorage["token"]'
            )
>           self.assertNotEqual(initial_token, new_token)
E           AssertionError: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZjkwY2YwYzEtMjc3Yi00N2M4LWExMWYtNTMyMDZmODAxYzE1IiwidXNlcm5hbWUiOiJyZXZpZXdlciIsImV4cCI6MTU1MDc1NDkzOSwiZW1haWwiOiIiLCJvcmlnX2lhdCI6MTU1MDc1NDkzNH0.hkB-nMIGU_AL-Ps0QF-xqyZnXNY_NF2p70mGozbdCyY' == 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZjkwY2YwYzEtMjc3Yi00N2M4LWExMWYtNTMyMDZmODAxYzE1IiwidXNlcm5hbWUiOiJyZXZpZXdlciIsImV4cCI6MTU1MDc1NDkzOSwiZW1haWwiOiIiLCJvcmlnX2lhdCI6MTU1MDc1NDkzNH0.hkB-nMIGU_AL-Ps0QF-xqyZnXNY_NF2p70mGozbdCyY'

functional_tests/test_auto_logout.py:67: AssertionError
----------------------------- Captured stderr call -----------------------------
[2019-02-21 13:15:34,360] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:15:34,360] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:15:34,385] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:15:34,385] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:15:40,132] [WARNING] django.request       Bad Request: /api/refresh-token/
[2019-02-21 13:15:40,132] [WARNING] django.request       Bad Request: /api/refresh-token/
------------------------------ Captured log call -------------------------------
log.py                     228 WARNING  Not Found: /favicon.ico
log.py                     228 WARNING  Not Found: /favicon.ico
log.py                     228 WARNING  Bad Request: /api/refresh-token/
_____ TestFeedbackCreationTutor.test_can_give_comments_and_decreased_score _____

self = <functional_tests.test_feedback_creation.TestFeedbackCreationTutor testMethod=test_can_give_comments_and_decreased_score>

    def test_can_give_comments_and_decreased_score(self):
        self._login()
        self._go_to_subscription()
        code = self._reconstruct_submission_code()
    
        # give half full score
        score_input = self.browser.find_element_by_id('score-input')
        score_input.send_keys(self.sub_type.full_score // 2)
    
        # give feedback on first and last line of submission
        comment_text = 'This is feedback'
        self.write_comments_on_lines([
            (1, comment_text), (0, comment_text)  # 0 corresponds to the last line
        ])
    
        submit_btn = self.browser.find_element_by_id('submit-feedback')
        submit_btn.click()
        WebDriverWait(self.browser, 3).until(
            self.wait_until_code_changes(code)
        )
        submission_for_code = Submission.objects.get(text=code)
>       self.assertEqual(self.sub_type.full_score // 2, submission_for_code.feedback.score)

functional_tests/test_feedback_creation.py:190: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <django.db.models.fields.related_descriptors.ReverseOneToOneDescriptor object at 0x7fd15258e898>
instance = <Submission: Submission afaa5560-d1cd-4d1c-a045-07bb1997ecf1>
cls = <class 'core.models.Submission'>

    def __get__(self, instance, cls=None):
        """
            Get the related instance through the reverse relation.
    
            With the example above, when getting ``place.restaurant``:
    
            - ``self`` is the descriptor managing the ``restaurant`` attribute
            - ``instance`` is the ``place`` instance
            - ``cls`` is the ``Place`` class (unused)
    
            Keep in mind that ``Restaurant`` holds the foreign key to ``Place``.
            """
        if instance is None:
            return self
    
        # The related instance is loaded from the database and then cached
        # by the field on the model instance state. It can also be pre-cached
        # by the forward accessor (ForwardManyToOneDescriptor).
        try:
            rel_obj = self.related.get_cached_value(instance)
        except KeyError:
            related_pk = instance.pk
            if related_pk is None:
                rel_obj = None
            else:
                filter_args = self.related.field.get_forward_related_filter(instance)
                try:
                    rel_obj = self.get_queryset(instance=instance).get(**filter_args)
                except self.related.related_model.DoesNotExist:
                    rel_obj = None
                else:
                    # Set the forward accessor cache on the related object to
                    # the current instance to avoid an extra SQL query if it's
                    # accessed later on.
                    self.related.field.set_cached_value(rel_obj, instance)
            self.related.set_cached_value(instance, rel_obj)
    
        if rel_obj is None:
            raise self.RelatedObjectDoesNotExist(
                "%s has no %s." % (
                    instance.__class__.__name__,
>                   self.related.get_accessor_name()
                )
            )
E           core.models.Submission.feedback.RelatedObjectDoesNotExist: Submission has no feedback.

.venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py:414: RelatedObjectDoesNotExist
----------------------------- Captured stderr call -----------------------------
[2019-02-21 13:16:56,987] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 13:16:57,227] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 13:16:58,571] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:16:58,571] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:16:58,578] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:16:58,578] [WARNING] django.request       Not Found: /favicon.ico
[2019-02-21 13:17:00,713] [INFO] core.models          tutor is assigned to  Submission Meta of Submission afaa5560-d1cd-4d1c-a045-07bb1997ecf1

        done_assignments      = 0
        has_active_assignment = False
        has_feedback          = False
        has_final_feedback    = False
        feedback_authors      = <QuerySet []>
         (feedback-creation)
[2019-02-21 13:17:00,715] [DEBUG] core.signals         SIGNAL -- update_active_after_assignment_save
[2019-02-21 13:17:00,738] [INFO] core.models          tutor is assigned to  Submission Meta of Submission 0e681eb6-c115-47a6-8459-fbc302de9e93

        done_assignments      = 0
        has_active_assignment = False
        has_feedback          = False
        has_final_feedback    = False
        feedback_authors      = <QuerySet []>
         (feedback-creation)
[2019-02-21 13:17:00,740] [DEBUG] core.signals         SIGNAL -- update_active_after_assignment_save
[2019-02-21 13:17:05,175] [WARNING] django.request       Unauthorized: /api/feedback/
[2019-02-21 13:17:05,175] [WARNING] django.request       Unauthorized: /api/feedback/
------------------------------ Captured log call -------------------------------
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
log.py                     228 WARNING  Not Found: /favicon.ico
log.py                     228 WARNING  Not Found: /favicon.ico
models.py                  681 INFO     tutor is assigned to  Submission Meta of Submission afaa5560-d1cd-4d1c-a045-07bb1997ecf1

        done_assignments      = 0
        has_active_assignment = False
        has_feedback          = False
        has_final_feedback    = False
        feedback_authors      = <QuerySet []>
         (feedback-creation)
signals.py                  25 DEBUG    SIGNAL -- update_active_after_assignment_save
models.py                  681 INFO     tutor is assigned to  Submission Meta of Submission 0e681eb6-c115-47a6-8459-fbc302de9e93

        done_assignments      = 0
        has_active_assignment = False
        has_feedback          = False
        has_final_feedback    = False
        feedback_authors      = <QuerySet []>
         (feedback-creation)
signals.py                  25 DEBUG    SIGNAL -- update_active_after_assignment_save
log.py                     228 WARNING  Unauthorized: /api/feedback/
=============================== warnings summary ===============================
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

-- Docs: https://docs.pytest.org/en/latest/warnings.html
============== 2 failed, 25 passed, 27 warnings in 253.84 seconds ==============
section_end:1550755177:build_script
[0Ksection_start:1550755177:after_script
[0Ksection_end:1550755179:after_script
[0Ksection_start:1550755179:upload_artifacts_on_failure
[0Ksection_end:1550755180:upload_artifacts_on_failure
[0K[31;1mERROR: Job failed: exit code 1
[0;m
[0KRunning with gitlab-runner 11.3.1 (0aa5179e)
[0;m[0K  on robins-grady-docker-runner 6ac1a4ac
[0;m[0KUsing Docker executor with image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KStarting service postgres:9.6 ...
[0;m[0KPulling docker image postgres:9.6 ...
[0;m[0KUsing docker image sha256:aee5bfb5ec09669f4c90d9cbab577884843a3194dfc1e87bd0531b82c3fc4b71 for postgres:9.6 ...
[0;m[0KWaiting for services to be up and running...
[0;m[0KPulling docker image docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;m[0KUsing docker image sha256:5c6715f7a9e04885d10243f690c606c909a0f034084de3a96d1963cfc84ca4b3 for docker.gitlab.gwdg.de/robinwilliam.hundt/python-geckodriver:master ...
[0;msection_start:1550754598:prepare_script
[0KRunning on runner-6ac1a4ac-project-985-concurrent-2 via vmd30259.contaboserver.net...
section_end:1550754600:prepare_script
[0Ksection_start:1550754600:get_sources
[0K[32;1mFetching changes...[0;m
Removing .pytest_cache/
Removing .venv/
Removing core/__pycache__/
Removing core/migrations/__pycache__/
Removing core/serializers/__pycache__/
Removing core/views/__pycache__/
Removing frontend/dist/
Removing frontend/node_modules/
Removing functional_tests/__pycache__/
Removing geckodriver.log
Removing grady/__pycache__/
Removing grady/settings/__pycache__/
Removing secret
Removing static/
Removing util/__pycache__/
HEAD is now at b08b741 Fixed copy to clipboard
From https://gitlab.gwdg.de/j.michal/grady
 * [new branch]      141-incorrect-syntax-highlighting-for-block-comments -> origin/141-incorrect-syntax-highlighting-for-block-comments
[32;1mChecking out b08b741c as 141-incorrect-syntax-highlighting-for-block-comments...[0;m
[32;1mSkipping Git submodules setup[0;m
section_end:1550754609:get_sources
[0Ksection_start:1550754609:restore_cache
[0Ksection_end:1550754611:restore_cache
[0Ksection_start:1550754611:download_artifacts
[0K[32;1mDownloading artifacts for build_frontend (144001)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144001 responseStatus[0;m=200 OK token[0;m=QLfeZ5mi
[32;1mDownloading artifacts for build_test_env (144000)...[0;m
Downloading artifacts from coordinator... ok      [0;m  id[0;m=144000 responseStatus[0;m=200 OK token[0;m=Jsbebys2
[0;33mWARNING: .venv/bin/python: chmod .venv/bin/python: no such file or directory (suppressing repeats)[0;m 
section_end:1550754631:download_artifacts
[0Ksection_start:1550754631:build_script
[0K[32;1m$ source .venv/bin/activate[0;m
[32;1m$ cp frontend/dist/index.html core/templates[0;m
[32;1m$ python util/format_index.py[0;m
[32;1m$ python manage.py collectstatic --no-input[0;m

185 static files copied to '/builds/j.michal/grady/static', 551 post-processed.
[32;1m$ HEADLESS_TESTS=True pytest --ds=grady.settings.test functional_tests[0;m
============================= test session starts ==============================
platform linux -- Python 3.6.8, pytest-3.8.2, py-1.6.0, pluggy-0.7.1
Django settings: grady.settings.test (from command line option)
rootdir: /builds/j.michal/grady, inifile:
plugins: django-3.4.7, cov-2.6.1
collected 27 items

functional_tests/test_auto_logout.py .                                   [  3%]
functional_tests/test_export_modal.py .......                            [ 29%]
functional_tests/test_feedback_creation.py .....F...                     [ 62%]
functional_tests/test_front_pages.py ......                              [ 85%]
functional_tests/test_login_page.py ....                                 [100%]

=================================== FAILURES ===================================
______ TestFeedbackCreationTutor.test_student_text_is_correctly_displayed ______

self = <functional_tests.test_feedback_creation.TestFeedbackCreationTutor testMethod=test_student_text_is_correctly_displayed>

    def test_student_text_is_correctly_displayed(self):
        self._login()
>       self._go_to_subscription()

functional_tests/test_feedback_creation.py:90: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
functional_tests/test_feedback_creation.py:58: in _go_to_subscription
    WebDriverWait(self.browser, 3).until(subscriptions_loaded_cond(tasks))
.venv/lib/python3.6/site-packages/selenium/webdriver/support/wait.py:71: in until
    value = method(self._driver)
functional_tests/util.py:55: in loaded
    sub_links = tasks_el.find_elements_by_tag_name('a')
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py:320: in find_elements_by_tag_name
    return self.find_elements(by=By.TAG_NAME, value=name)
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py:685: in find_elements
    {"using": by, "value": value})['value']
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py:633: in _execute
    return self._parent.execute(command, params)
.venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:321: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7fc1e8fe0860>
response = {'status': 404, 'value': '{"value":{"error":"stale element reference","message":"The element reference of <div class=\...req<@chrome://marionette/content/listener.js:485:20\\ndispatch/<@chrome://marionette/content/listener.js:484:15\\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.StaleElementReferenceException: Message: The element reference of <div class="v-card v-sheet theme--light elevation-2" name="subscription-list"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

.venv/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py:242: StaleElementReferenceException
----------------------------- Captured stderr call -----------------------------
[2019-02-21 13:13:02,681] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
[2019-02-21 13:13:03,028] [DEBUG] core.signals         SIGNAL -- create_meta_after_submission_create
------------------------------ Captured log call -------------------------------
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
signals.py                  15 DEBUG    SIGNAL -- create_meta_after_submission_create
=============================== warnings summary ===============================
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning
source:43: DeprecationWarning: invalid escape sequence \
source:175: DeprecationWarning: invalid escape sequence \_
source:191: DeprecationWarning: invalid escape sequence \_
source:359: DeprecationWarning: invalid escape sequence \_
source:375: DeprecationWarning: invalid escape sequence \_
source:626: DeprecationWarning: invalid escape sequence \*
source:650: DeprecationWarning: invalid escape sequence \*

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

/builds/j.michal/grady/.venv/lib/python3.6/site-packages/rest_framework_jwt/utils.py:39: DeprecationWarning: The following fields will be removed in the future: `email` and `user_id`. 
  DeprecationWarning

-- Docs: https://docs.pytest.org/en/latest/warnings.html
============== 1 failed, 26 passed, 36 warnings in 256.66 seconds ==============
section_end:1550754898:build_script
[0Ksection_start:1550754898:after_script
[0Ksection_end:1550754900:after_script
[0Ksection_start:1550754900:upload_artifacts_on_failure
[0Ksection_end:1550754901:upload_artifacts_on_failure
[0K[31;1mERROR: Job failed: exit code 1
[0;m

Possible fixes