After proc.kill(), proc.poll() can transiently return None before the OS reaps the process. The module-scoped geckodriver fixture's reuse check relies on proc.poll() is None to determine liveness, so it incorrectly reuses the dead geckodriver (with port=None). This causes the next test's new_session() to connect to port 80 and fail with ConnectionRefused. Adding proc.wait() after joining the reader thread ensures kill() and stop() return only once the process is fully terminated. Differential Revision: https://phabricator.services.mozilla.com/D310813