Skip to content

[🚀 Feature]: Service shutting down via __del__ is unintuitive (as Remote only consumes the service url) #14464

@GideonBear

Description

@GideonBear

Feature and motivation

I recently faced a weird bug where returning from a function would cause the browser to close and Selenium to complain they couldn't reach the driver. Turned out, my Service was garbage collected (and quitting it via __del__) after I had used its service_url.

from selenium import webdriver
from selenium.webdriver.chrome import service


def get_driver():
    webdriver_service = service.Service("operadriver")
    webdriver_service.start()

    options = webdriver.ChromeOptions()
    options.add_experimental_option('w3c', True)

    driver = webdriver.Remote(webdriver_service.service_url, options=options)

    return driver


driver = get_driver()
driver.get("https://example.com")

While in hindsight it is expected behavior based on the code (I did not pass webdriver_service, I passed a string I got from it), it's not very weird (especially if you don't know the internals of how webdrivers work) to overlook the .service_url and assume that Remote would set webdriver_service as an instance attribute, keeping it from being garbage collected.
This behavior is in my opinion very unintuitive. A possible solution would be to only allow passing the whole Service into Remote instead of just the service_url (and setting it as an instance attribute), but this would be backwards-incompatible. Maybe add another method for passing the whole Service (or overload the original method), and encourage using that (for example by raising a warning when the service_url parameter is accessed) instead of the service_url? I don't have a good proposal, but I thought I would submit an issue anyway, since it cost me a lot of time to debug.

After writing this, it came to mind that using Service and Remote directly might not have been intended anyway. The readme of webdriver-manager told me to do it this way, probably because Opera was deprecated. I'll submit it anyway, but if this is the case, it's probably a lot less important.

Usage example

Not applicable

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-needs-triagingA Selenium member will evaluate this soon!I-enhancementSomething could be better

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions