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