Selenium WebDriver о многопоточности в Сидеки - PullRequest
0 голосов
/ 05 мая 2018

У меня есть вопрос о Selenium WebDriver и его использовании с несколькими потоками. У меня есть приложение, которое получает некоторые данные с веб-сайтов, поэтому для этого я использую браузер Watir, который использует Selenium WebDriver. У меня тоже Sidekiq настроен. Мой поток состоит в том, что я ставлю в очередь несколько заданий, которые инициализируют watir с помощью chromedriver, поэтому одновременно работают 6 параллельных потоков с Selenium WebDriver. Время от времени я замечаю некоторые ошибки, такие как: Selenium::WebDriver::Error::WebDriverError: unable to connect to chromedriver 127.0.0.1:9519 или Selenium::WebDriver::Error::WebDriverError: unable to bind to locking port 9514 within 45 seconds или Selenium::WebDriver::Error::UnknownError: unknown error: failed to start a thread for the new session. Связано ли это с тем, что Selenium не является потокобезопасным? Я думал, что если я инициализирую браузер в разных потоках, он должен работать правильно, но это не так. Есть ли способ как-то это исправить?

# frozen_string_literal: true

require 'selenium/webdriver/remote/http/curb'

module Scrapers
  class Browser
    def run
      Watir::Browser.new(:chrome, watir_options)
    end

    private

    def chrome_args
      [
        '--ignore-certificate-errors',
        '--disable-popup-blocking',
        '--no-sandbox',
        '--window-size=1024,768',
        '--disable-extensions'
      ]
    end

    def chrome_options
      chrome_bin = ENV.fetch('GOOGLE_CHROME_SHIM', nil)
      chrome_bin ? { 'chromeOptions' => { 'binary' => chrome_bin } } : {}
    end

    def watir_options
      {
        headless: true,
        timeout: 60,
        http_client: Selenium::WebDriver::Remote::Http::Curb.new,
        args: chrome_args
      }.merge!(chrome_options)
    end
  end
end

В большинстве случаев происходит сбой при вызове метода run или когда объект уже инициализирован и вызывает goto.

...