selenium/standalone-chrome에서 headless로 원격으로 연결하고 다운로드하고 싶습니다.

관련도



selenium/standalone-chrome





이런 느낌으로 연결되어 있는 경우, chrome에 다운로드시켜도 조작하고 있는 ruby측에는 파일이 다운로드되는 것은 아니다(다운로드되더라도 selenium/standalone-chrome의 컨테이너측에 들어간다).

해결 방법



볼륨 사용





env에 패스를 써 두는 것으로, docker-compose.yml, ruby측( ENV["CHROME_DOWNLOAD_DIR"] )에서 같은 값을 참조할 수 있다.

.env
CHROME_DOWNLOAD_DIR=/chrome/downloads

docker-compose.yml
# .envがあればdocker-composeはとりあえずそれを読んでymlに反映してくれる
services:

  # /chrome/downloads
  # を共通のボリュームにしておく
  # ただそれだけだと権限の問題で書き込めないので、適当に777とかにしておく
  # $ sudo chmod 777 chrome/downloads
  chrome:
    image: selenium/standalone-chrome
    shm_size: 256m
    volumes:
      - .${CHROME_DOWNLOAD_DIR}:${CHROME_DOWNLOAD_DIR}

  backend:
    env_file:
      - .env # ファイルを指定
    build:
      context: ./backend
    working_dir: /app
    volumes:
      - ./backend:/app
      - .${CHROME_DOWNLOAD_DIR}:/app${CHROME_DOWNLOAD_DIR}


headless chrome에서 파일을 다운로드하는 방법



일반적인 selenium 사용법이라면 확실히 download_path=들어가는 하지만, 원격 라고 원래 이 모듈 가 들어 있지 않으므로, 아래와 같이 손을 가할 필요가 있다.


Selenium::WebDriver::Chrome::Driver
Selenium::WebDriver::Remote::Driver


include DriverExtensions::DownloadsFiles 예
없음

...
...

driver = Capybara::Selenium::Driver.new(
  app,
  browser: :remote,
  desired_capabilities: caps,
  url: "http://#{DOCKER_CHROME_SELENIUM_HOST_NAME}:4444/wd/hub"
)
bridge = driver.browser.send(:bridge)
bridge.http.call(
:post,
"session/#{bridge.session_id}/chromium/send_command",
cmd: "Page.setDownloadBehavior",
params: { behavior: "allow", downloadPath: ENV["CHROME_DOWNLOAD_DIR"] }
)

후에는 /app/chrome/downloads 에 파일이 들어오는 것이 ruby ​​측에서도 볼 수 있다.

좋은 웹페이지 즐겨찾기