17

我正在尝试PhantomJSselenium.webdriverCentos 服务器内部运行。PhantomJS 在路径中并且从终端正常运行。但是在脚本中它似乎已启动,但之后无法在指定端口上访问(我尝试了来自我的提供商 29842 和 60099 的 2 个不同的打开端口,它们都不起作用,并且在没有指定端口的情况下也不会启动它)。

错误发生在这里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

这是来自我的脚本(我尝试不使用任何参数以及编写可执行文件的完整路径但均未成功):

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"
            }
        )

这是初始化 webdriver 的脚本selenium.webdriver.phantomjs.service。我检查并subprocess.Popen实际启动了 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。我让相同的脚本在我的 Ubuntu 本地机器上正常工作,做的事情与我在服务器上做的完全一样。服务器上有什么不同?

4

5 回答 5

9

升级到新版本后,我在 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
于 2013-11-17T20:09:22.137 回答
4

在 Linux Mint 14 上安装 nodejs-legacy 包为我解决了这个问题。

sudo apt-get install nodejs-legacy
于 2014-04-26T10:14:51.187 回答
2

对我来说,这是一个防火墙问题。Phantom 需要一个开放的端口才能连接。如果端口被防火墙阻止,您将获得WebDriverException("Can not connect to GhostDriver").

修理:

  1. 打开一个端口。

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)

于 2015-02-16T18:10:24.927 回答
2

我遇到了这个问题,并找出了导致它的原因。在另一个关于开发 Facebook 应用程序的教程中,有人告诉我将 nano 放入 /etc/hosts 并将其更改为 -

127.0.0.1    localhost

对此——

127.0.0.1    test1.com

并保存文件。顺便说一句,PhantomJS() 在那之后就不再工作了。我刚刚回到 /etc/hosts 文件并将其切换回 localhost

127.0.0.1    localhost

它再次起作用。

于 2015-08-04T18:01:10.287 回答
1

我正在使用 selenium 和 phantomjs 测试 python/django 应用程序。在第一次(有时是第二次测试)期间一切正常,但是一旦运行下一个测试,selenium 就会打印出完全相同的错误消息。

此外,如果我之后从控制台运行 phantomjs,我会收到以下节点错误:

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)

我尝试通过 npm(本地和全局)多次重新安装 phantomjs,但行为仍然存在。

最终,我通过 npm 卸载了 phantomjs,并从 phantomjs.org 下载了 phantomjs bin。把它放在我的 /usr/local/bin 中(我在 MacOS 上)并摆脱了错误!

于 2015-10-26T12:27:33.327 回答