Selenium.common.exceptions.WebDriverException: Сообщение: "Не удается подключиться к GhostDriver"

Я пытаюсь запустить PhantomJS из selenium.webdriver на сервере Centos. PhantomJS находится на пути и работает нормально с терминала. Однако в script он запускается, но потом не может быть достигнут на указанном порту (я пробовал 2 разных открытых порта у моего провайдера 29842 и 60099, они оба не работают и не запускают его без указанного порта).

Ошибка здесь происходит в selenium.webdriver.common.utils:

try:
    socket_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket_.settimeout(1)
    socket_.connect(("localhost", port))
    socket_.close()
    return True
except socket.error:
    return False

Это из моего script (я пробовал без каких-либо параметров, а также записывал полный путь к исполняемому файлу и не работал):

self.browser = webdriver.PhantomJS(
            port=29842,
            desired_capabilities={
                'javascriptEnabled': True,
                'platform': 'windows',
                'browserName': 'Mozilla',
                'version': '5.0',
                'phantomjs.page.settings.userAgent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36"
            }
        )

И это script, который инициализирует webdriver от selenium.webdriver.phantomjs.service. Я проверил и subprocess.Popen на самом деле lauches phantomjs, ошибка происходит в цикле while:

    try:
        self.process = subprocess.Popen(self.service_args,
                                        stdout=self._log, stderr=self._log)

    except Exception as e:
        raise WebDriverException("Unable to start phantomjs with ghostdriver.", e)

    count = 0
    while not utils.is_connectable(self.port):
        print utils.is_connectable(self.port)
        count += 1
        time.sleep(1)
        if count == 30:
             raise WebDriverException("Can not connect to GhostDriver")

Все пакеты являются последней версией: python 2.7, selenium 2 и phantomjs 1.9 двоичные с интегрированным ghostdriver. Я сделал тот же самый script правильно работающим на своей локальной машине Ubuntu, делая то же самое, что и на сервере. Что на сервере отличается?

Ответы

Ответ 1

У меня была проблема с Ubuntu после обновления до новой версии. Я повторно установил все пакеты nodejs и python, но я решил, что проблема была в том, чтобы убедиться, что исполняемый файл nodejs был символически связан с node.

Это команды, которые я использовал:

apt-get remove node nodejs
apt-get install build-essential python-dev phantomjs npm nodejs
ln -s /usr/bin/nodejs /usr/bin/node
npm install -g phantomjs
pip install selenium bson BeautifulSoup pymongo

Ответ 2

Установка пакета nodejs-legacy на Linux Mint 14 решила это для меня.

sudo apt-get install nodejs-legacy

Ответ 3

Для меня это проблема брандмауэра. Phantom требуется открытый порт для подключения. Если порт заблокирован брандмауэром, вы получите WebDriverException("Can not connect to GhostDriver").

Чтобы исправить:

  • Откройте порт.

sudo iptables -A INPUT -s 127.0.0.1 -p tcp --dport 65000 -j ACCEPT

  1. Создайте драйвер PhantomJS, который использует этот порт

driver = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs', port=65000)

Ответ 4

У меня была эта проблема и выяснилось, что ее вызывает. В другом учебном пособии по разработке приложений Facebook мне сказали nano в /etc/hosts и изменить его из этого -

127.0.0.1    localhost

для этого -

127.0.0.1    test1.com

и сохраните файл. Кстати, PhantomJS() больше не работал после этого. Я только что вернулся в файл /etc/hosts и переключил его обратно на localhost

127.0.0.1    localhost

и он снова работает.

Ответ 5

Я тестирую приложение python/django, используя селен с phantomjs. Все работало нормально во время первого (а иногда и второго теста), но после запуска следующего теста селен печатал то же самое сообщение об ошибке.

Кроме того, если после этого я запускал phantomjs с консоли, я получил следующую ошибку node:

child_process.js:1136 var err = this._handle.spawn(options); 
                                             ^

TypeError: Bad argument 
       at TypeError (native)
       at ChildProcess.spawn (child_process.js:1136:26)
       at exports.spawn (child_process.js:995:9)
       at Object.<anonymous> (/usr/local/lib/node_modules/phantomjs/bin/phantomjs:22:10)
       at Module._compile (module.js:460:26)
       at Object.Module._extensions..js (module.js:478:10)
       at Module.load (module.js:355:320)
       at Function.Module._load (module.js:310:12)
       at Function.Module.runMain (module.js:501:10)
       at startup (node.js:129:16)

Я пытался переустановить phantomjs через npm (как локально, так и глобально) несколько раз, но поведение сохранялось.

В конце концов, я удалил phantomjs через npm и вместо этого загрузил bin phantomjs из phantomjs.org. Поместите это внутри моего /usr/local/bin (я на MacOS) и избавился от ошибки, так как!