首页 > 解决方案 > 在 webdiver 会话之后,Selenium 节点不会杀死进程

问题描述

我运行`Flask + Celery + Selenium Hub + Selenium Node。

我运行了很多使用远程 webdriver 的任务:

class Task:
    def setup_driver(self):
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument("--disable-notifications")
        chrome_options.add_experimental_option('useAutomationExtension', False)
        self.driver = webdriver.Remote(
            command_executor='url',
            options=chrome_options
        )
        self.driver.implicitly_wait(5)

    def teardown_driver(self):
        self.driver.quit()
    
    def run(self):
        self.setup_driver()
        try:
            pass
            # do some logic
        finally:
            self.teardown_driver()

我总是driver.quit()在任务结束时调用我的 docker-compose.yaml:

version: "3.3"

services:
  webserver:
    build: .
    ports:
      - 5000:5000
    volumes:
      - ./src:/app
      - ./conf.yaml:/conf.yaml
      - ./db:/db
    restart: unless-stopped
    command: 'uwsgi app.ini'

  redis:
    image: redis:latest
    ports:
    - 6379:6379

  celery:
    build: .
    volumes:
      - ./db:/db
    command: celery -A app.celery_app worker --loglevel=INFO

  celerybeat:
    build: .
    command: celery -A app.celery_app beat --loglevel=INFO --scheduler common.scheduler.TaskLockScheduler

  chrome-node-1:
    image: selenium/node-chrome:91.0
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_NODE_SESSION_TIMEOUT=300
      - SE_NODE_MAX_SESSIONS=10
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    ports:
      - "6900:5900"

  chrome-node-2:
    image: selenium/node-chrome:91.0
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_NODE_SESSION_TIMEOUT=300
      - SE_NODE_MAX_SESSIONS=10
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    ports:
      - "6901:5900"

  selenium-hub:
    image: selenium/hub:4.0.0
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"

几个小时后,htop 向我展示了这些信息: 很多节点和集线器进程。在此处输入图像描述 在此处输入图像描述

所以我的问题是:为什么集线器和节点不会杀死这个进程?driver.quit()每次会话后使用。

标签: pythonseleniumselenium-webdriverceleryselenium-grid

解决方案


看到在某些情况下finally可能不会执行该块。 因此,更具体地说,我们需要查看块内的整个代码,但通常可能会跳过该块。 如果是这样,这可能描述了跳过所涉及的 方法。
tryfinally
teardown_driver()self.driver.quit()


推荐阅读