pytest-dev/pytest-splinter

prepare_browser() infinite loop with Chrome

miohtama opened this issue · 5 comments

On OSX + Python 3.5 I managed to get infinite loop with prepare_browser. For some reason this function calls itself. It is not clear from comments or code why it does this.

  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/vendored_packages/pluggy.py", line 253, in _wrapped_call
    return call_outcome.get_result()
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/vendored_packages/pluggy.py", line 278, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/vendored_packages/pluggy.py", line 264, in __init__
    self.result = func()
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/vendored_packages/pluggy.py", line 596, in execute
    res = hook_impl.function(*args)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/runner.py", line 87, in pytest_runtest_setup
    item.session._setupstate.prepare(item)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/runner.py", line 408, in prepare
    col.setup()
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/python.py", line 1419, in setup
    fillfixtures(self)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/python.py", line 819, in fillfixtures
    request._fillfixtures()
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/python.py", line 1567, in _fillfixtures
    item.funcargs[argname] = self.getfuncargvalue(argname)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/python.py", line 1610, in getfuncargvalue
    return self._get_active_fixturedef(argname).cached_result[0]
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/python.py", line 1627, in _get_active_fixturedef
    result = self._getfuncargvalue(fixturedef)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/python.py", line 1673, in _getfuncargvalue
    val = fixturedef.execute(request=subrequest)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/python.py", line 2135, in execute
    self.yieldctx)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/_pytest/python.py", line 2056, in call_fixture_func
    res = fixturefunc(**kwargs)
  File "/Users/mikko/code/xxx/websauna/websauna/tests/conftest.py", line 193, in browser
    return browser_instance_getter(request, browser)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 426, in prepare_browser
    prepare_browser(request, parent)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 425, in prepare_browser
    browser = browser_pool[browser_key] = get_browser(splinter_webdriver)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 381, in get_browser
    wait_time=splinter_wait_time, **kwargs
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/pytest_splinter/plugin.py", line 68, in Browser
    browser = splinter.Browser(*args, **kwargs)
  File "/Users/mikko/code/xxx/websauna/venv/lib/python3.5/site-packages/splinter/browser.py", line 63, in Browser
    return driver(*args, **kwargs)

After commenting out the loop, underlying error is

   response = {'sessionId': 'e249273f1e890b681e055d655e2e9ea5', 'status': 13, 'value': {'message': 'unknown error: No current window... (Driver info: chromedriver=2.20.353124 (035346203162d32c80f1dce587c8154a1efa0c3b),platform=Mac OS X 10.11.6 x86_64)'}}

In the same function

 # browser.driver.set_window_size(*splinter_window_size)

fixes it. New Chrome versions can't set window size anymore?

pelme commented

For the record: I've faced time consuming debugging because of this recursive call too: MS Edge crashes when removing all cookies (😶 : https://connect.microsoft.com/IE/feedback/details/1864122/edge-driver-cant-delete-cookies). That causes prepare_browser to be called infinite amount of times since it throws WebDriverException is thrown.

I would propose to avoid catching the exceptions and just fail if prepare_browser fails. What is the motivation of retrying on http/io errors? In what kinds of situations would the webdriver server return these kinds of errors where one would retry and keep running the tests? If this happens I would say that your remote selenium server needs fixing. :)

Or maybe we could just avoid catching WebDriverException but still catch http/io errors, that would have solved my problems and brings less changes from the current solution.

In my case this has (probably) caused more harm than good but I am sure there is a reason for this, could you give some hints on this @bubenkoff ? :)

@pelme the reason for retry is that in some cases browser can just quit - happened with ff, but if you retry it will be ok
maybe let's reduce the number of retries?

pelme commented

Sounds good to me, let's retry once or twice and then fail with the last exception?

This issue is a duplicate of #71, let's continue the discussion there.