Ruby - невозможно связать с блокирующим портом 7054 в течение 45 секунд (Selenium:: WebDriver:: Error:: WebDriverError)

Недавно я начал видеть это сообщение об ошибке при попытке выполнить любые тесты Cucumber. Я провел некоторое исследование и обнаружил несколько других подобных случаев этой ошибки, но большинство из них были связаны с браузером. В этом выпуске я не вижу сообщений об ошибках конкретного браузера:

unable to bind to locking port 7054 within 45 seconds (Selenium::WebDriver::Error::WebDriverError)

Я увидел еще один вопрос, на который был дан ответ (Исключение selenium webdriver), однако это решение не сработало для меня. Выполнение " lsof -i TCP: 7054" не производит никакого вывода.

На всякий случай, когда кто-либо предлагает это, я уже несколько раз перезапускал свою машину и вытер свой гемсет и перезапустил "пакет".

Вот соответствующие камни, которые я использую:

capybara (0.4.1.2)
cucumber (0.10.7)   
cucumber-rails (0.4.1)
fuubar-cucumber (0.0.9)
selenium-webdriver (0.2.0)

Чтобы быть уверенным, я также попробовал запустить эти тесты с Firefox 3.6, 4.0 и 5.0. Это же сообщение каждый раз.

Не быть теоретиком заговора или чем-то еще, но все отлично работало, прежде чем я вручную вышел из запуска моего набора тестов и запустил pkill во всех активных процессах Firefox, которые запущен Cucumber. Во время набора тестов у меня было около 9 экземпляров Firefox. Я не уверен, что это могло бы привести к тому, что что-то случилось, что приведет к результатам, которые я вижу сейчас, после выполнения тестов Cucumber.

Есть ли у кого-нибудь предложения по устранению этой проблемы?

Ответ 1

Обновление: проблема решена

После установки $DEBUG в true и повторного запуска тестов эта ошибка была наиболее интересной:

<Selenium::WebDriver::Firefox::SocketLock:0x00000102f9c010>: getaddrinfo: nodename nor servname provided, or not known
Exception `SocketError' at /Users/bobrossasaurus/.rvm/gems/ruby-1.9.2-p136/gems/selenium-webdriver-0.2.0/lib/selenium/webdriver/common/platform.rb:131 - getaddrinfo: nodename nor servname provided, or not known

Посмотрев на platform.rb: 131, я заметил, что он пытался подключиться к "localhost" на порту 80, но не смог. Это подняло красный флаг, поскольку в последнее время у меня возникли проблемы с доступом к "localhost" через браузер и вместо этого пришлось использовать 127.0.0.1:3000 для просмотра моих проектов рельсов.

Решение:

Мне не хватало запись файла хоста localhost в /etc/hosts:

127.0.0.1 localhost

Довольно смущающая проблема, но тем не менее это был ответ.

Ответ 2

Так как это самая лучшая запись в этой проблеме, как в google, так и в утиной утке, я буду документировать мой обходной путь здесь. Проблема, насколько я понимаю, заключается в том, что селен использует порт 7054 в качестве мьютекса * для решения проблемы, с которой firefox начинает запускать реальный firefox и выходит из стартера script. Таким образом, PID реальной лисы можно только угадать из селена, и запуск нескольких копий firefox параллельно приведет к постоянным условиям гонки. Таким образом, блокирующий порт, который затем может стать проблемой, если многие firefox должны запускаться параллельно.

Наше решение - увеличить этот тайм-аут.

# Starting many firefoxen in parallel can easily take more than 45 (default) seconds
module Selenium
  module WebDriver
    module Firefox
      class Launcher
        remove_const(:SOCKET_LOCK_TIMEOUT)
      end
    end
  end
end
Selenium::WebDriver::Firefox::Launcher::SOCKET_LOCK_TIMEOUT = 90

в стартовом коде для селена.

Исправление, смоделированное после этого намека: http://www.assertselenium.com/selenium-tips-tricks/

* Мьютекс - это программный объект, который позволяет нескольким потокам программ совместно использовать один и тот же ресурс, такой как доступ к файлам, но не одновременно.

Ответ 3

Я смог reset эту константу в инициализаторе с меньшим количеством работы. Мне нужно было установить его короче, поэтому мой script мог просто создать другой браузер.

# config/initializers/selenium.rb

module Selenium module WebDriver module Firefox class Launcher Selenium::WebDriver::Firefox::Launcher::SOCKET_LOCK_TIMEOUT = 10 end end end end