У меня есть вопрос о 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
.