Skip to content
This repository has been archived by the owner on Sep 21, 2021. It is now read-only.

UnreachableBrowserException in middle of testing #1090

Closed
joshzcold opened this issue Nov 15, 2019 · 3 comments
Closed

UnreachableBrowserException in middle of testing #1090

joshzcold opened this issue Nov 15, 2019 · 3 comments

Comments

@joshzcold
Copy link

🐛 Bug Report

During testing we will have chrome instances launch successfully to start testing.
after a couple of tests automation has trouble launching new chrome instances.
This error will fail almost all of our test repeatally.

Here is the error

INFO: Using `new ChromeOptions()` is preferred to `DesiredCapabilities.chrome()`
org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.
Build info: version: '3.12.0', revision: '7c6e0b3', time: '2018-05-08T14:04:26.12Z'
System info: host: 'prvqeaa950', ip: '10.204.128.209', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-66-generic', java.version: '1.8.0_191'
Driver info: driver.version: RemoteWebDriver```

we have a 4 node k8s cluster that seems healthy

prvqeaa959   Ready    master   119d    v1.15.1
vlab002304   Ready    <none>   6d18h   v1.15.3
vlab002307   Ready    <none>   23h     v1.15.3
vlab002308   Ready    <none>   23h     v1.15.3
NAME                                    READY   STATUS    RESTARTS   AGE
zal-release-zalenium-6cd9c87889-mjswn   1/1     Running   2          41h
zalenium-40000-dhggs                    1/1     Running   0          40h
zalenium-40000-vt78s                    1/1     Running   0          40h
zalenium-40000-wncbg                    1/1     Running   0          40h
zalenium-40000-xhm59                    1/1     Running   0          40h
zalenium-6494c49645-pcvdx               1/1     Running   3          42h

Here is an error output that might be related found in the pod logs

io.fabric8.kubernetes.client.KubernetesClientException: Operation: [get]  for kind: [Pod]  with name: [zalenium-40000-dpn94]  in namespace: [default]  failed.
	at io.fabric8.kubernetes.client.KubernetesClientException.launderThrowable(KubernetesClientException.java:64)
	at io.fabric8.kubernetes.client.KubernetesClientException.launderThrowable(KubernetesClientException.java:72)
	at io.fabric8.kubernetes.client.dsl.base.BaseOperation.getMandatory(BaseOperation.java:221)
	at io.fabric8.kubernetes.client.dsl.base.BaseOperation.get(BaseOperation.java:177)
	at de.zalando.ep.zalenium.container.kubernetes.KubernetesContainerClient.isTerminated(KubernetesContainerClient.java:418)
	at de.zalando.ep.zalenium.proxy.DockeredSeleniumStarter.containerHasFinished(DockeredSeleniumStarter.java:350)
	at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
	at java.util.concurrent.ConcurrentHashMap$KeySpliterator.forEachRemaining(ConcurrentHashMap.java:3527)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
	at de.zalando.ep.zalenium.proxy.AutoStartProxySet.checkContainers(AutoStartProxySet.java:353)
	at de.zalando.ep.zalenium.proxy.AutoStartProxySet.lambda$0(AutoStartProxySet.java:124)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.ConnectException: Failed to connect to /10.96.0.1:443
	at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:247)
	at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:165)
	at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
	at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
	at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
	at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
	at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
	at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
	at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
	at okhttp3.internal.http.RealInterceptorChain.pr

Here is some of the code to launch the remote web driver.

// browser is set to chrome eariler in the code. We have found the same issue on chrome and firefox

        capabilities.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT)
//        capabilities.setCapability("name", testName)
//        capabilities.setCapability("idleTimeout", 600)

            webDriver = new RemoteWebDriver(new URL("http://10.204.128.218:32222/wd/hub"), capabilities)

We also have a method that cleans up the driver after a test is done with it (this is supposed to be compatible with parallel testing. We have tested commenting out this method and we still get the same error)

List currentDriver = WebDriverTracker.WEB_DRIVERS.getDrivers().get(Thread.currentThread().getId() as String)
        currentDriver.each { driver ->
            driver.quit()
        }

To Reproduce

Steps to reproduce the behavior (including the docker command/docker-compose/Kubernetes manifests to start Zalenium):

Manifest specified at the bottom

Expected behavior

A clear and concise description of what you expected to happen.
Successful launch of new browsers with a stable connection between them.

Test script reproducing this issue (when applicable)

Unfortunalty I can't share the repo, but I can seek out more logs and try as many differn't scenarios as needed.

Environment

OS:
Zalenium Image Version(s):
Docker version:

Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        2d0083d
 Built:             Fri Aug 16 14:19:32 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       2d0083d
  Built:            Wed Aug 14 19:38:45 2019
  OS/Arch:          linux/amd64
  Experimental:     false

If using Kubernetes, specify your environment, and if relevant your manifests:
zalenium deploy yaml created from helm template:

---
# Source: zalenium/templates/service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: zal-release-zalenium
  labels:
    role: grid
    app: zalenium
    chart: zalenium-3.141.59
    release: zal-release
    heritage: Tiller
    app.kubernetes.io/name: zalenium
    helm.sh/chart: zalenium-3.141.59
    app.kubernetes.io/instance: zal-release
    app.kubernetes.io/managed-by: Tiller
---
# Source: zalenium/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: zal-release-zalenium
  labels:
    role: grid
    app: zalenium
    chart: zalenium-3.141.59
    release: zal-release
    heritage: Tiller
    app.kubernetes.io/name: zalenium
    helm.sh/chart: zalenium-3.141.59
    app.kubernetes.io/instance: zal-release
    app.kubernetes.io/managed-by: Tiller
spec:
  type: "NodePort"
  sessionAffinity: "None"
  ports:
  - name: hub
    port: 80
    targetPort: 4444
    nodePort: 32222
  selector:
    app.kubernetes.io/name: zalenium
    app.kubernetes.io/instance: zal-release

---
# Source: zalenium/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: zal-release-zalenium
  labels:
    role: grid
    app: zalenium
    chart: zalenium-3.141.59
    release: zal-release
    heritage: Tiller
    app.kubernetes.io/name: zalenium
    helm.sh/chart: zalenium-3.141.59
    app.kubernetes.io/instance: zal-release
    app.kubernetes.io/managed-by: Tiller
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: zalenium
      app.kubernetes.io/instance: zal-release
  template:
    metadata:
      labels:
        role: grid
        app: zalenium
        chart: zalenium-3.141.59
        release: zal-release
        heritage: Tiller
        app.kubernetes.io/name: zalenium
        helm.sh/chart: zalenium-3.141.59
        app.kubernetes.io/instance: zal-release
        app.kubernetes.io/managed-by: Tiller
      annotations:
        {}

    spec:
      securityContext:
        {}

      volumes:
        - name: zal-release-zalenium-videos
          emptyDir: {}
        - name: zal-release-zalenium-data
          emptyDir: {}
      containers:
        - name: zalenium
          image: "dosel/zalenium:3"
          imagePullPolicy: IfNotPresent
          securityContext:
            {}

          ports:
            - containerPort: 4444
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /status
              port: 4444
            initialDelaySeconds: 90
            periodSeconds: 5
            timeoutSeconds: 1
          readinessProbe:
            httpGet:
              path: /status
              port: 4444
            timeoutSeconds: 1
          env:
            - name: ZALENIUM_KUBERNETES_CPU_REQUEST
              value: "250m"
            - name: ZALENIUM_KUBERNETES_CPU_LIMIT
              value: "1000m"
            - name: ZALENIUM_KUBERNETES_MEMORY_REQUEST
              value: "500Mi"
            - name: ZALENIUM_KUBERNETES_MEMORY_LIMIT
              value: "2Gi"
            - name: DESIRED_CONTAINERS
              value: "2"
            - name: MAX_DOCKER_SELENIUM_CONTAINERS
              value: "10"
            - name: SELENIUM_IMAGE_NAME
              value: "elgalu/selenium"
            - name: VIDEO_RECORDING_ENABLED
              value: "true"
            - name: SCREEN_WIDTH
              value: "1440"
            - name: SCREEN_HEIGHT
              value: "900"
            - name: MAX_TEST_SESSIONS
              value: "1"
            - name: NEW_SESSION_WAIT_TIMEOUT
              value: "600000"
            - name: DEBUG_ENABLED
              value: "false"
            - name: SEND_ANONYMOUS_USAGE_INFO
              value: "true"
            - name: TZ
              value: "UTC"
            - name: KEEP_ONLY_FAILED_TESTS
              value: "false"
            - name: RETENTION_PERIOD
              value: "3"
          args:
            - start
          resources:
            requests:
              cpu: 500m
              memory: 500Mi

          volumeMounts:
            - name: zal-release-zalenium-videos
              mountPath: /home/seluser/videos
            - name: zal-release-zalenium-data
              mountPath: /tmp/mounted
      serviceAccountName: zal-release-zalenium
---
# Source: zalenium/templates/role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: "Role"
metadata:
  name: zal-release-zalenium
  labels:
    role: grid
    app: zalenium
    chart: zalenium-3.141.59
    release: zal-release
    heritage: Tiller
    app.kubernetes.io/name: zalenium
    helm.sh/chart: zalenium-3.141.59
    app.kubernetes.io/instance: zal-release
    app.kubernetes.io/managed-by: Tiller
rules:
- apiGroups:
  - ""
  attributeRestrictions: null
  resources:
  - pods
  verbs:
  - create
  - delete
  - deletecollection
  - get
  - list
  - watch
- apiGroups:
  - ""
  attributeRestrictions: null
  resources:
  - pods/exec
  verbs:
  - create
  - get
---
# Source: zalenium/templates/role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: "RoleBinding"
metadata:
  name: zal-release-zalenium
  labels:
    role: grid
    app: zalenium
    chart: zalenium-3.141.59
    release: zal-release
    heritage: Tiller
    app.kubernetes.io/name: zalenium
    helm.sh/chart: zalenium-3.141.59
    app.kubernetes.io/instance: zal-release
    app.kubernetes.io/managed-by: Tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: "Role"
  name: zal-release-zalenium
subjects:
- kind: ServiceAccount
  name: zal-release-zalenium
---
# Source: zalenium/templates/deployment-config.yaml

---
# Source: zalenium/templates/ingress.yaml

---
# Source: zalenium/templates/pvc-data.yaml

---
# Source: zalenium/templates/pvc-video.yaml

---
# Source: zalenium/templates/route.yaml

---
# Source: zalenium/templates/secret.yaml

Thank you for any help, I know this issue is ambiguous, but I am willing to provide any extra help I can.

@joshzcold
Copy link
Author

joshzcold commented Nov 15, 2019

More investigating, it does seem like /wd/hub endpoint is unavailable when new remote drivers are trying to be created.

here is the output of /wd/hub when it comes back up (Not sure if the errors on this page are any help :\ )

{
  "sessionId": null,
  "status": 13,
  "value": {
    "class": "java.lang.NullPointerException",
    "error": "unknown error",
    "message": null,
    "stackTrace": [
      {
        "className": "org.openqa.grid.internal.ExternalSessionKey",
        "fileName": "ExternalSessionKey.java",
        "lineNumber": 79,
        "methodName": "fromWebDriverRequest"
      },
      {
        "className": "org.openqa.grid.web.servlet.handler.WebDriverRequest",
        "fileName": "WebDriverRequest.java",
        "lineNumber": 58,
        "methodName": "extractSession"
      },
      {
        "className": "org.openqa.grid.web.servlet.handler.RequestHandler",
        "fileName": "RequestHandler.java",
        "lineNumber": 240,
        "methodName": "getSession"
      },
      {
        "className": "org.openqa.grid.web.servlet.handler.RequestHandler",
        "fileName": "RequestHandler.java",
        "lineNumber": 123,
        "methodName": "process"
      },
      {
        "className": "org.openqa.grid.web.servlet.DriverServlet",
        "fileName": "DriverServlet.java",
        "lineNumber": 85,
        "methodName": "process"
      },
      {
        "className": "org.openqa.grid.web.servlet.DriverServlet",
        "fileName": "DriverServlet.java",
        "lineNumber": 63,
        "methodName": "doGet"
      },
      {
        "className": "javax.servlet.http.HttpServlet",
        "fileName": "HttpServlet.java",
        "lineNumber": 687,
        "methodName": "service"
      },
      {
        "className": "javax.servlet.http.HttpServlet",
        "fileName": "HttpServlet.java",
        "lineNumber": 790,
        "methodName": "service"
      },
      {
        "className": "org.seleniumhq.jetty9.servlet.ServletHolder",
        "fileName": "ServletHolder.java",
        "lineNumber": 865,
        "methodName": "handle"
      },
      {
        "className": "org.seleniumhq.jetty9.servlet.ServletHandler$CachedChain",
        "fileName": "ServletHandler.java",
        "lineNumber": 1655,
        "methodName": "doFilter"
      },
      {
        "className": "io.prometheus.client.filter.MetricsFilter",
        "fileName": "MetricsFilter.java",
        "lineNumber": 170,
        "methodName": "doFilter"
      },
      {
        "className": "org.seleniumhq.jetty9.servlet.ServletHandler$CachedChain",
        "fileName": "ServletHandler.java",
        "lineNumber": 1642,
        "methodName": "doFilter"
      },
      {
        "className": "org.seleniumhq.jetty9.servlet.ServletHandler",
        "fileName": "ServletHandler.java",
        "lineNumber": 533,
        "methodName": "doHandle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
        "fileName": "ScopedHandler.java",
        "lineNumber": 146,
        "methodName": "handle"
      },
      {
        "className": "org.seleniumhq.jetty9.security.SecurityHandler",
        "fileName": "SecurityHandler.java",
        "lineNumber": 548,
        "methodName": "handle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.HandlerWrapper",
        "fileName": "HandlerWrapper.java",
        "lineNumber": 132,
        "methodName": "handle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
        "fileName": "ScopedHandler.java",
        "lineNumber": 257,
        "methodName": "nextHandle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.session.SessionHandler",
        "fileName": "SessionHandler.java",
        "lineNumber": 1595,
        "methodName": "doHandle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
        "fileName": "ScopedHandler.java",
        "lineNumber": 255,
        "methodName": "nextHandle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.ContextHandler",
        "fileName": "ContextHandler.java",
        "lineNumber": 1340,
        "methodName": "doHandle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
        "fileName": "ScopedHandler.java",
        "lineNumber": 203,
        "methodName": "nextScope"
      },
      {
        "className": "org.seleniumhq.jetty9.servlet.ServletHandler",
        "fileName": "ServletHandler.java",
        "lineNumber": 473,
        "methodName": "doScope"
      },
      {
        "className": "org.seleniumhq.jetty9.server.session.SessionHandler",
        "fileName": "SessionHandler.java",
        "lineNumber": 1564,
        "methodName": "doScope"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
        "fileName": "ScopedHandler.java",
        "lineNumber": 201,
        "methodName": "nextScope"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.ContextHandler",
        "fileName": "ContextHandler.java",
        "lineNumber": 1242,
        "methodName": "doScope"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.ScopedHandler",
        "fileName": "ScopedHandler.java",
        "lineNumber": 144,
        "methodName": "handle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.StatisticsHandler",
        "fileName": "StatisticsHandler.java",
        "lineNumber": 174,
        "methodName": "handle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.handler.HandlerWrapper",
        "fileName": "HandlerWrapper.java",
        "lineNumber": 132,
        "methodName": "handle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.Server",
        "fileName": "Server.java",
        "lineNumber": 503,
        "methodName": "handle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.HttpChannel",
        "fileName": "HttpChannel.java",
        "lineNumber": 364,
        "methodName": "handle"
      },
      {
        "className": "org.seleniumhq.jetty9.server.HttpConnection",
        "fileName": "HttpConnection.java",
        "lineNumber": 260,
        "methodName": "onFillable"
      },
      {
        "className": "org.seleniumhq.jetty9.io.AbstractConnection$ReadCallback",
        "fileName": "AbstractConnection.java",
        "lineNumber": 305,
        "methodName": "succeeded"
      },
      {
        "className": "org.seleniumhq.jetty9.io.FillInterest",
        "fileName": "FillInterest.java",
        "lineNumber": 103,
        "methodName": "fillable"
      },
      {
        "className": "org.seleniumhq.jetty9.io.ChannelEndPoint$2",
        "fileName": "ChannelEndPoint.java",
        "lineNumber": 118,
        "methodName": "run"
      },
      {
        "className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill",
        "fileName": "EatWhatYouKill.java",
        "lineNumber": 333,
        "methodName": "runTask"
      },
      {
        "className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill",
        "fileName": "EatWhatYouKill.java",
        "lineNumber": 310,
        "methodName": "doProduce"
      },
      {
        "className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill",
        "fileName": "EatWhatYouKill.java",
        "lineNumber": 168,
        "methodName": "tryProduce"
      },
      {
        "className": "org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill",
        "fileName": "EatWhatYouKill.java",
        "lineNumber": 126,
        "methodName": "run"
      },
      {
        "className": "org.seleniumhq.jetty9.util.thread.ReservedThreadExecutor$ReservedThread",
        "fileName": "ReservedThreadExecutor.java",
        "lineNumber": 366,
        "methodName": "run"
      },
      {
        "className": "org.seleniumhq.jetty9.util.thread.QueuedThreadPool",
        "fileName": "QueuedThreadPool.java",
        "lineNumber": 765,
        "methodName": "runJob"
      },
      {
        "className": "org.seleniumhq.jetty9.util.thread.QueuedThreadPool$2",
        "fileName": "QueuedThreadPool.java",
        "lineNumber": 683,
        "methodName": "run"
      },
      {
        "className": "java.lang.Thread",
        "fileName": "Thread.java",
        "lineNumber": 748,
        "methodName": "run"
      }
    ],
    "stacktrace": "java.lang.NullPointerException\n\tat org.openqa.grid.internal.ExternalSessionKey.fromWebDriverRequest(ExternalSessionKey.java:79)\n\tat org.openqa.grid.web.servlet.handler.WebDriverRequest.extractSession(WebDriverRequest.java:58)\n\tat org.openqa.grid.web.servlet.handler.RequestHandler.getSession(RequestHandler.java:240)\n\tat org.openqa.grid.web.servlet.handler.RequestHandler.process(RequestHandler.java:123)\n\tat org.openqa.grid.web.servlet.DriverServlet.process(DriverServlet.java:85)\n\tat org.openqa.grid.web.servlet.DriverServlet.doGet(DriverServlet.java:63)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:687)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\n\tat org.seleniumhq.jetty9.servlet.ServletHolder.handle(ServletHolder.java:865)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655)\n\tat io.prometheus.client.filter.MetricsFilter.doFilter(MetricsFilter.java:170)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler.doHandle(ServletHandler.java:533)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.handle(ScopedHandler.java:146)\n\tat org.seleniumhq.jetty9.security.SecurityHandler.handle(SecurityHandler.java:548)\n\tat org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)\n\tat org.seleniumhq.jetty9.server.session.SessionHandler.doHandle(SessionHandler.java:1595)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)\n\tat org.seleniumhq.jetty9.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler.doScope(ServletHandler.java:473)\n\tat org.seleniumhq.jetty9.server.session.SessionHandler.doScope(SessionHandler.java:1564)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)\n\tat org.seleniumhq.jetty9.server.handler.ContextHandler.doScope(ContextHandler.java:1242)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.handle(ScopedHandler.java:144)\n\tat org.seleniumhq.jetty9.server.handler.StatisticsHandler.handle(StatisticsHandler.java:174)\n\tat org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.seleniumhq.jetty9.server.Server.handle(Server.java:503)\n\tat org.seleniumhq.jetty9.server.HttpChannel.handle(HttpChannel.java:364)\n\tat org.seleniumhq.jetty9.server.HttpConnection.onFillable(HttpConnection.java:260)\n\tat org.seleniumhq.jetty9.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)\n\tat org.seleniumhq.jetty9.io.FillInterest.fillable(FillInterest.java:103)\n\tat org.seleniumhq.jetty9.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)\n\tat org.seleniumhq.jetty9.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)\n\tat org.seleniumhq.jetty9.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)\n\tat org.seleniumhq.jetty9.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)\n\tat java.lang.Thread.run(Thread.java:748)\n"
  }
}

more readable stack trace

  "java.lang.NullPointerException\n\tat org.openqa.grid.internal.ExternalSessionKey.fromWebDriverRequest(ExternalSessionKey.java:79)\n\tat org.openqa.grid.web.servlet.handler.WebDriverRequest.extractSession(WebDriverRequest.java:58)\n\tat org.openqa.grid.web.servlet.handler.RequestHandler.getSession(RequestHandler.java:240)\n\tat org.openqa.grid.web.servlet.handler.RequestHandler.process(RequestHandler.java:123)\n\tat org.openqa.grid.web.servlet.DriverServlet.process(DriverServlet.java:85)\n\tat org.openqa.grid.web.servlet.DriverServlet.doGet(DriverServlet.java:63)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:687)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\n\tat org.seleniumhq.jetty9.servlet.ServletHolder.handle(ServletHolder.java:865)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655)\n\tat io.prometheus.client.filter.MetricsFilter.doFilter(MetricsFilter.java:170)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler.doHandle(ServletHandler.java:533)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.handle(ScopedHandler.java:146)\n\tat org.seleniumhq.jetty9.security.SecurityHandler.handle(SecurityHandler.java:548)\n\tat org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)\n\tat org.seleniumhq.jetty9.server.session.SessionHandler.doHandle(SessionHandler.java:1595)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)\n\tat org.seleniumhq.jetty9.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)\n\tat org.seleniumhq.jetty9.servlet.ServletHandler.doScope(ServletHandler.java:473)\n\tat org.seleniumhq.jetty9.server.session.SessionHandler.doScope(SessionHandler.java:1564)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)\n\tat org.seleniumhq.jetty9.server.handler.ContextHandler.doScope(ContextHandler.java:1242)\n\tat org.seleniumhq.jetty9.server.handler.ScopedHandler.handle(ScopedHandler.java:144)\n\tat org.seleniumhq.jetty9.server.handler.StatisticsHandler.handle(StatisticsHandler.java:174)\n\tat org.seleniumhq.jetty9.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)\n\tat org.seleniumhq.jetty9.server.Server.handle(Server.java:503)\n\tat org.seleniumhq.jetty9.server.HttpChannel.handle(HttpChannel.java:364)\n\tat org.seleniumhq.jetty9.server.HttpConnection.onFillable(HttpConnection.java:260)\n\tat org.seleniumhq.jetty9.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)\n\tat org.seleniumhq.jetty9.io.FillInterest.fillable(FillInterest.java:103)\n\tat org.seleniumhq.jetty9.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)\n\tat org.seleniumhq.jetty9.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)\n\tat org.seleniumhq.jetty9.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)\n\tat org.seleniumhq.jetty9.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)\n\tat org.seleniumhq.jetty9.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)\n\tat java.lang.Thread.run(Thread.java:748)\n"

@joshzcold
Copy link
Author

To solve this issue we made a method to retry the driver connection multiple times.

static WebDriver executeRemoteDriver (capabilities, testName){
        def webdriver
        def i = 0

        while (webdriver == null && i < 30) {
            try{
                webdriver = new RemoteWebDriver(new URL("http://10.204.128.218:32222/wd/hub"), capabilities)
            } catch(Exception e){
                if(webdriver == null){
                    System.out.println("Retrying driver with test: $testName date: ${LocalDateTime.now()}")
                }
            }
            i++
        }

        return webdriver
    }

I'm suspecting more of a k8s network issue than a zalenium issue. As a result of this method we will have the remote driver try to connect about 3 times before a sucessful connection

Do you guys recommend a specific network plugin for zalenium? We are using Weave.
Also would you guys recommend an L4 load balancer connecting to /wd/hub for each node to lessen the load of registration?

@joshzcold
Copy link
Author

Overall After switching to Flannel from Weave test execution has stabilized. No more problems launching browsers or browsers quiting during tests

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant