Skip to content

[py] Allow free_port() to bind to IPv6 if IPv4 is unavailable #16003

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 21 commits into from
Jul 14, 2025
Merged
Changes from 17 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
89f87ab
[py] Allow free_port() to bind to IPv6 if IPv4 is unavailable
cgoldberg Jul 6, 2025
ee82768
[py] Fix comment
cgoldberg Jul 6, 2025
a691cef
Merge branch 'trunk' into py-support-ipv6-only-systems
cgoldberg Jul 7, 2025
e1b3716
[py] Prevent socket resource leak
cgoldberg Jul 7, 2025
814af84
[py] Better error handling
cgoldberg Jul 7, 2025
0eca4f5
[py] Better error handling
cgoldberg Jul 7, 2025
68f600d
Merge branch 'trunk' into py-support-ipv6-only-systems
cgoldberg Jul 7, 2025
7e9888a
[py] Add character
cgoldberg Jul 7, 2025
03daf3e
Merge branch 'trunk' into py-support-ipv6-only-systems
cgoldberg Jul 7, 2025
9d14268
Merge branch 'trunk' into py-support-ipv6-only-systems
cgoldberg Jul 7, 2025
d27dd25
Merge branch 'trunk' into py-support-ipv6-only-systems
cgoldberg Jul 7, 2025
35f74f9
Merge branch 'SeleniumHQ:trunk' into py-support-ipv6-only-systems
cgoldberg Jul 9, 2025
5526d9d
Merge branch 'SeleniumHQ:trunk' into py-support-ipv6-only-systems
cgoldberg Jul 9, 2025
6b54a3d
Merge branch 'trunk' into py-support-ipv6-only-systems
cgoldberg Jul 9, 2025
e3b1d07
Merge branch 'SeleniumHQ:trunk' into py-support-ipv6-only-systems
cgoldberg Jul 9, 2025
31e4460
Merge branch 'SeleniumHQ:trunk' into py-support-ipv6-only-systems
cgoldberg Jul 10, 2025
2bb39de
Merge branch 'SeleniumHQ:trunk' into py-support-ipv6-only-systems
cgoldberg Jul 10, 2025
004d273
[py] Remove call to socket.listen()
cgoldberg Jul 10, 2025
6cc54d5
Merge branch 'SeleniumHQ:trunk' into py-support-ipv6-only-systems
cgoldberg Jul 11, 2025
5e5d915
Merge branch 'SeleniumHQ:trunk' into py-support-ipv6-only-systems
cgoldberg Jul 12, 2025
9fbcec1
Merge branch 'SeleniumHQ:trunk' into py-support-ipv6-only-systems
cgoldberg Jul 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 25 additions & 6 deletions py/selenium/webdriver/common/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,31 @@


def free_port() -> int:
"""Determines a free port using sockets."""
free_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
free_socket.bind(("127.0.0.1", 0))
free_socket.listen(5)
port: int = free_socket.getsockname()[1]
free_socket.close()
"""Determines a free port using sockets.

First try IPv4, but use IPv6 if it can't bind (IPv6-only system).
"""
free_socket = None
try:
# IPv4
free_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
free_socket.bind(("127.0.0.1", 0))
except OSError:
if free_socket:
free_socket.close()
# IPv6
try:
free_socket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
free_socket.bind(("::1", 0))
except OSError:
raise RuntimeError("Can't find free port (Unable to bind to IPv4 or IPv6)")
try:
free_socket.listen(5)
port: int = free_socket.getsockname()[1]
except Exception as e:
raise RuntimeError(f"Can't find free port: ({e})")
finally:
free_socket.close()
return port


Expand Down