0

Selenium tests started to fail after test suite increased. Usually, tests are failing after reaching 10 passed tests, after that, all the rest tests are failed with no info that retry was triggered. All these tests are passing successfully locally, and I tried to mix them and create different order batches and still, 1st ten tests are passed in CI and the rest are failed. These failures are not happening every code push, it happens about once every 3 code pushes.

Tried to mix tests, run them locally many times to make sure there is no failures. I have changed the scope for webdriver instance due to memory issues in dockerized environment and now it runs each test in new environment with no data from previously run tests.

Also when these failures just started appearing I haven't seen it in logs, it was only 10 passed tests and message console log output exceeded timeout, so I added a parameter to circleci/config.yml no_output_timeout: 20m which started to show failures of the rest tests.

platform linux -- Python 3.6.4, pytest-4.3.1, py-1.8.0, pluggy-0.9.0 -- /usr/local/bin/python3
cachedir: .pytest_cache
metadata: {'Python': '3.6.4', 'Platform': 'Linux-4.4.0-96-generic-x86_64-with', 'Packages': {'pytest': '4.3.1', 'py': '1.8.0', 'pluggy': '0.9.0'}, 'Plugins': {'reportportal': '1.0.4', 'parallel': '0.0.9', 'metadata': '1.8.0', 'html': '1.20.0', 'flaky': '3.5.3'}}
rootdir: /home/robot/functional/retail, inifile:
plugins: reportportal-1.0.4, parallel-0.0.9, metadata-1.8.0, html-1.20.0, flaky-3.5.3
collecting ... 
collected 36 items                                                             

tests/ui_workflows/test_ecom_publish.py::TestEcomPublish::test_create_new_item_and_publish_on_ecom[firefox] SKIPPED
tests/ui_workflows/test_retail_create.py::TestRetailCreate::test_create_new_item[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_create.py::TestRetailCreate::test_create_new_customer_type[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_create.py::TestRetailCreate::test_create_new_sales_tax[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_import.py::TestRetailCreate::test_import_items_from_csv[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_import.py::TestRetailCreate::test_import_items_from_xlsx[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_import.py::TestRetailCreate::test_import_300_items_from_xlsx[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_item.py::TestRetailItem::test_create_item_with_all_attributes[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_item.py::TestRetailItem::test_create_non_taxable_item_and_make_sale[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_item.py::TestRetailItem::test_create_non_discountable_item_and_make_sale[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_item.py::TestRetailItem::test_create_non_discount_non_tax_item_and_make_sale[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
PASSED
tests/ui_workflows/test_retail_item.py::TestRetailItem::test_create_item_and_quick_edit_all_attr[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
ERROR
tests/ui_workflows/test_retail_item_matrix.py::TestRetailMatrix::test_create_color_size_attributes_matrix[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
ERROR
tests/ui_workflows/test_retail_item_matrix.py::TestRetailMatrix::test_add_4th_attr_color_size_attr_matrix[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
ERROR
tests/ui_workflows/test_retail_item_matrix.py::TestRetailMatrix::test_create_color_attributes_matrix[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
ERROR
tests/ui_workflows/test_retail_item_matrix.py::TestRetailMatrix::test_add_4th_color_attribute_matrix[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
ERROR
tests/ui_workflows/test_retail_item_matrix.py::TestRetailMatrix::test_create_size_attributes_matrix[firefox] Using Selenium grid at http://selenium-grid:4444/wd/hub
ERROR
==================================== ERRORS ====================================
_ ERROR at setup of TestRetailItem.test_create_item_and_quick_edit_all_attr[firefox] _

>       lambda: ihook(item=item, **kwds),
        when=when,
    )

/usr/local/lib/python3.6/site-packages/flaky/flaky_pytest_plugin.py:306: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/ui_workflows/conftest.py:89: in driver
    driver = webdriver.Remote(command_executor=selenium_grid_endpoint, desired_capabilities=capabilities)
/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:156: in __init__
    self.start_session(capabilities, browser_profile)
/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:251: in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py:320: in execute
    self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7f30b61d3d68>
response = {'status': 500, 'value': '{\n  "sessionId": null,\n  "status": 13,\n  "value": {\n    "class": "org.openqa.grid.common...\tat org.openqa.grid.web.servlet.handler.RequestHandler.process(RequestHandler.java:112)\\n\\t... 38 more\\n"\n  }\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.WebDriverException: Message: Error forwarding the new session Request timed out waiting for a node to become available.
E       Stacktrace:
E           at org.openqa.grid.web.servlet.handler.RequestHandler.process (RequestHandler.java:118)
E           at org.openqa.grid.web.servlet.DriverServlet.process (DriverServlet.java:85)
E           at org.openqa.grid.web.servlet.DriverServlet.doPost (DriverServlet.java:69)
E           at javax.servlet.http.HttpServlet.service (HttpServlet.java:707)
E           at javax.servlet.http.HttpServlet.service (HttpServlet.java:790)
E           at org.seleniumhq.jetty9.servlet.ServletHolder.handle (ServletHolder.java:865)
E           at org.seleniumhq.jetty9.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java:1655)
E           at io.prometheus.client.filter.MetricsFilter.doFilter (MetricsFilter.java:170)
E           at org.seleniumhq.jetty9.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java:1642)
E           at org.seleniumhq.jetty9.servlet.ServletHandler.doHandle (ServletHandler.java:533)
E           at org.seleniumhq.jetty9.server.handler.ScopedHandler.handle (ScopedHandler.java:146)
E           at org.seleniumhq.jetty9.security.SecurityHandler.handle (SecurityHandler.java:548)
E           at org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle (HandlerWrapper.java:132)
E           at org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:257)
E           at org.seleniumhq.jetty9.server.session.SessionHandler.doHandle (SessionHandler.java:1595)
E           at org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:255)
E           at org.seleniumhq.jetty9.server.handler.ContextHandler.doHandle (ContextHandler.java:1340)
E           at org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope (ScopedHandler.java:203)
E           at org.seleniumhq.jetty9.servlet.ServletHandler.doScope (ServletHandler.java:473)
E           at org.seleniumhq.jetty9.server.session.SessionHandler.doScope (SessionHandler.java:1564)
E           at org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope (ScopedHandler.java:201)
E           at org.seleniumhq.jetty9.server.handler.ContextHandler.doScope (ContextHandler.java:1242)
E           at org.seleniumhq.jetty9.server.handler.ScopedHandler.handle (ScopedHandler.java:144)
E           at org.seleniumhq.jetty9.server.handler.StatisticsHandler.handle (StatisticsHandler.java:174)
E           at org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle (HandlerWrapper.java:132)
E           at org.seleniumhq.jetty9.server.Server.handle (Server.java:503)
E           at org.seleniumhq.jetty9.server.HttpChannel.handle (HttpChannel.java:364)
E           at org.seleniumhq.jetty9.server.HttpConnection.onFillable (HttpConnection.java:260)
E           at org.seleniumhq.jetty9.io.AbstractConnection$ReadCallback.succeeded (AbstractConnection.java:305)
E           at org.seleniumhq.jetty9.io.FillInterest.fillable (FillInterest.java:103)
E           at org.seleniumhq.jetty9.io.ChannelEndPoint$2.run (ChannelEndPoint.java:118)
E           at org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.runTask (EatWhatYouKill.java:333)
E           at org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.doProduce (EatWhatYouKill.java:310)
E           at org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.tryProduce (EatWhatYouKill.java:168)
E           at org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.run (EatWhatYouKill.java:126)
E           at org.seleniumhq.jetty9.util.thread.ReservedThreadExecutor$ReservedThread.run (ReservedThreadExecutor.java:366)
E           at org.seleniumhq.jetty9.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:765)
E           at org.seleniumhq.jetty9.util.thread.QueuedThreadPool$2.run (QueuedThreadPool.java:683)
E           at java.lang.Thread.run (Thread.java:748)

/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py:242: WebDriverException
Serg Buch
  • 80
  • 1
  • 2
  • 12
  • You could try to restart the driver after each test. – AndiCover Aug 23 '19 at 17:24
  • Looks like its issue with Zalenium/grid . From the logs 'Error forwarding the new session Request timed out waiting for a node' It looks like you are hitting https://github.com/zalando/zalenium/issues/833 . Check your Zalenium setup . Use latest images. – Rahul L Aug 24 '19 at 07:56
  • Just to add more info https://github.com/SeleniumHQ/selenium/issues/6918 'Large grids (~30 nodes) can encounter lock-ups and NullPointerExceptions when registering nodes' .Its not fixed in Selenium Grid as they have stopped releases for Grid 3 version but Good guys at Zalenium merged the fix in Zalenium https://github.com/zalando/zalenium/pull/960. – Rahul L Aug 24 '19 at 08:17
  • @AndiCover, I am restarting driver each test. – Serg Buch Aug 26 '19 at 12:10
  • @RahulL, I am running one test at a time – Serg Buch Aug 26 '19 at 12:10
  • One test at a time may not matter to Zalenium as its not able to dispose off the nodes .Whats the image tag of zalenium that you are using. – Rahul L Aug 26 '19 at 12:16
  • @RahulL `dosel/zalenium:3.141.59n` and `elgalu/selenium:latest` – Serg Buch Aug 26 '19 at 13:11
  • Try with zalenium: 3.141.59t – Rahul L Aug 26 '19 at 13:36
  • Tried `3.141.59t` - same, and now trying `3.141.59s` – Serg Buch Aug 27 '19 at 13:57

0 Answers0