Selenium Chrome 节点在执行后无法停止进程

Selenium Chrome nodes fail to stop the processes after execution

我在 Kubernetes 集群中使用最新版本 4.1.2 的 SeleniumGrid。

在很多情况下(我会说大约一半)当我通过网格执行测试时,节点无法终止进程并且不会回到空闲状态。然后容器一直使用一个完整的 CPU 直到我手动杀死它。

容器中的日志如下:

10:51:34.781 INFO [NodeServer.lambda$start] - Sending registration event...
10:51:35.680 INFO [NodeServer.lambda$createHandlers] - Node has been added
Starting ChromeDriver 98.0.4758.102 (273bf7ac8c909cde36982d27f66f3c70846a3718-refs/branch-heads/4758@{#1151}) on port 39592
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
[1C6h4r6o1m2e9D1r2i3v.e9r8 7w]a[sS EsVtEaRrEt]e:d  bsiuncdc(e)s sffauillleyd.:
 Cannot assign requested address (99)
11:08:24.970 WARN [SeleniumSpanExporter.lambda$export[=11=]] - {"traceId": "99100300a4e6b4fe2afe5891b50def09","eventTime": 1646129304968456597,"eventName": "No slot matched the requested capabilities. ","attributes"

11:08:44.672 INFO [OsProcess.destroy] - Unable to drain process streams. Ignoring but the exception being swallowed follows.
org.apache.commons.exec.ExecuteException: The stop timeout of 2000 ms was exceeded (Exit value: -559038737)
    at org.apache.commons.exec.PumpStreamHandler.stopThread(PumpStreamHandler.java:295)
    at org.apache.commons.exec.PumpStreamHandler.stop(PumpStreamHandler.java:180)
    at org.openqa.selenium.os.OsProcess.destroy(OsProcess.java:135)
    at org.openqa.selenium.os.CommandLine.destroy(CommandLine.java:152)
    at org.openqa.selenium.remote.service.DriverService.stop(DriverService.java:281)
    at org.openqa.selenium.grid.node.config.DriverServiceSessionFactory.apply(DriverServiceSessionFactory.java:183)
    at org.openqa.selenium.grid.node.config.DriverServiceSessionFactory.apply(DriverServiceSessionFactory.java:65)
    at org.openqa.selenium.grid.node.local.SessionSlot.apply(SessionSlot.java:143)
    at org.openqa.selenium.grid.node.local.LocalNode.newSession(LocalNode.java:314)
    at org.openqa.selenium.grid.node.NewNodeSession.execute(NewNodeSession.java:52)
    at org.openqa.selenium.remote.http.Route$TemplatizedRoute.handle(Route.java:192)
    at org.openqa.selenium.remote.http.Route.execute(Route.java:68)
    at org.openqa.selenium.grid.security.RequiresSecretFilter.lambda$apply[=11=](RequiresSecretFilter.java:64)
    at org.openqa.selenium.remote.tracing.SpanWrappedHttpHandler.execute(SpanWrappedHttpHandler.java:86)
    at org.openqa.selenium.remote.http.Filter.execute(Filter.java:64)
    at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:336)
    at org.openqa.selenium.remote.http.Route.execute(Route.java:68)
    at org.openqa.selenium.grid.node.Node.execute(Node.java:240)
    at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:336)
    at org.openqa.selenium.remote.http.Route.execute(Route.java:68)
    at org.openqa.selenium.remote.AddWebDriverSpecHeaders.lambda$apply[=11=](AddWebDriverSpecHeaders.java:35)
    at org.openqa.selenium.remote.ErrorFilter.lambda$apply[=11=](ErrorFilter.java:44)
    at org.openqa.selenium.remote.http.Filter.execute(Filter.java:64)
    at org.openqa.selenium.remote.ErrorFilter.lambda$apply[=11=](ErrorFilter.java:44)
    at org.openqa.selenium.remote.http.Filter.execute(Filter.java:64)
    at org.openqa.selenium.netty.server.SeleniumHandler.lambda$channelRead0[=11=](SeleniumHandler.java:44)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
11:08:44.673 ERROR [OsProcess.destroy] - Unable to kill process Process[pid=75, exitValue=143]
11:08:44.675 WARN [SeleniumSpanExporter.lambda$export[=11=]] - {"traceId": "99100300a4e6b4fe2afe5891b50def09","eventTime": 1646129316638154262,"eventName": "exception","attributes": {"driver.url": "http:\u002f\u002f

以下是 Kubernetes 清单的摘录:

        - name: selenium-node-chrome
          image: selenium/node-chrome:latest
...
          env:
            - name: TZ
              value: Europe/Berlin
            - name: START_XVFB
              value: "false"
            - name: SE_NODE_OVERRIDE_MAX_SESSIONS
              value: "true"
            - name: SE_NODE_MAX_SESSIONS
              value: "1"
          envFrom:
            - configMapRef:
                name: selenium-event-bus-config
...
          volumeMounts:
            - name: dshm
              mountPath: /dev/shm
...
      volumes:
        - name: dshm
          emptyDir:
            medium: Memory

selenium-event-bus-config 包含以下变量:

data:
  SE_EVENT_BUS_HOST: selenium-hub
  SE_EVENT_BUS_PUBLISH_PORT: "4442"
  SE_EVENT_BUS_SUBSCRIBE_PORT: "4443"

我是不是配置有误?有人知道我该如何解决这个问题吗?

如果您不需要使用 Xvfb,您可以将其从您的代码中删除,您的问题将得到解决。

Apparently the issue resolves when removing the START_XVFB parameter. With a node with only the timezone config I did not yet have the problem.

对于解决方法,您可以尝试将驱动程序更改为 Chromedriver. You can read about the differences between them

另见 this similar problem