diff --git a/websocket_test.go b/websocket_test.go
index 06e0fc6d732e5901029a378857f756d18d41eb3f..be592d914a187d0e18aae77003e636c199c12f89 100644
--- a/websocket_test.go
+++ b/websocket_test.go
@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"io"
 	"io/ioutil"
+	"net"
 	"net/http"
 	"net/http/cookiejar"
 	"net/http/httptest"
@@ -781,12 +782,28 @@ func discardLoop(ctx context.Context, c *websocket.Conn) {
 	}
 }
 
+func unusedListenAddr() (string, error) {
+	l, err := net.Listen("tcp", "localhost:0")
+	if err != nil {
+		return "", err
+	}
+	l.Close()
+	return l.Addr().String(), nil
+}
+
 // https://github.com/crossbario/autobahn-python/blob/master/wstest/testee_client_aio.py
 func TestAutobahnClient(t *testing.T) {
 	t.Parallel()
 
+	serverAddr, err := unusedListenAddr()
+	if err != nil {
+		t.Fatalf("failed to get unused listen addr for wstest: %v", err)
+	}
+
+	wsServerURL := "ws://" + serverAddr
+
 	spec := map[string]interface{}{
-		"url":    "ws://localhost:9001",
+		"url":    wsServerURL,
 		"outdir": "ci/out/wstestClientReports",
 		"cases":  []string{"*"},
 		// See TestAutobahnServer for the reasons why we exclude these.
@@ -814,9 +831,10 @@ func TestAutobahnClient(t *testing.T) {
 	ctx, cancel := context.WithTimeout(ctx, time.Minute*10)
 	defer cancel()
 
-	args := []string{"--mode", "fuzzingserver", "--spec", specFile.Name()}
-	if os.Getenv("CI") == "" {
-		args = append([]string{"--debug"}, args...)
+	args := []string{"--mode", "fuzzingserver", "--spec", specFile.Name(),
+		// Disables some server that runs as part of fuzzingserver mode.
+		// See https://github.com/crossbario/autobahn-testsuite/blob/058db3a36b7c3a1edf68c282307c6b899ca4857f/autobahntestsuite/autobahntestsuite/wstest.py#L124
+		"--webport=0",
 	}
 	wstest := exec.CommandContext(ctx, "wstest", args...)
 	err = wstest.Start()
@@ -835,9 +853,9 @@ func TestAutobahnClient(t *testing.T) {
 
 	var cases int
 	func() {
-		c, _, err := websocket.Dial(ctx, "ws://localhost:9001/getCaseCount", websocket.DialOptions{})
+		c, _, err := websocket.Dial(ctx, wsServerURL+"/getCaseCount", websocket.DialOptions{})
 		if err != nil {
-			t.Fatalf("failed to dial: %v", err)
+			t.Fatal(err)
 		}
 		defer c.Close(websocket.StatusInternalError, "")
 
@@ -862,17 +880,17 @@ func TestAutobahnClient(t *testing.T) {
 			ctx, cancel := context.WithTimeout(ctx, time.Second*45)
 			defer cancel()
 
-			c, _, err := websocket.Dial(ctx, fmt.Sprintf("ws://localhost:9001/runCase?case=%v&agent=main", i), websocket.DialOptions{})
+			c, _, err := websocket.Dial(ctx, fmt.Sprintf(wsServerURL+"/runCase?case=%v&agent=main", i), websocket.DialOptions{})
 			if err != nil {
-				t.Fatalf("failed to dial: %v", err)
+				t.Fatal(err)
 			}
 			echoLoop(ctx, c)
 		}()
 	}
 
-	c, _, err := websocket.Dial(ctx, fmt.Sprintf("ws://localhost:9001/updateReports?agent=main"), websocket.DialOptions{})
+	c, _, err := websocket.Dial(ctx, fmt.Sprintf(wsServerURL+"/updateReports?agent=main"), websocket.DialOptions{})
 	if err != nil {
-		t.Fatalf("failed to dial: %v", err)
+		t.Fatal(err)
 	}
 	c.Close(websocket.StatusNormalClosure, "")
 
@@ -944,7 +962,7 @@ func benchConn(b *testing.B, echo, stream bool, size int) {
 
 	c, _, err := websocket.Dial(ctx, wsURL, websocket.DialOptions{})
 	if err != nil {
-		b.Fatalf("failed to dial: %v", err)
+		b.Fatal(err)
 	}
 	defer c.Close(websocket.StatusInternalError, "")