8

我似乎无法让 nightmare.js 在 Ubuntu Linux 14.04 服务器上工作 [通过 DigitalOcean]。

我已经安装了 PhantomJS (1.9.8) 和 Node (4.2.4),据我所知它们运行良好。

例如,当我运行这个时:

phantomjs loadspeed.js http://www.yahoo.com

使用 loadspeed.js 包含以下内容:

"use strict";
var page = require('webpage').create(),
    system = require('system'),
    t, address;

if (system.args.length === 1) {
    console.log('Usage: loadspeed.js <some URL>');
    phantom.exit(1);
} else {
    t = Date.now();
    address = system.args[1];
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('FAIL to load the address');
        } else {
            t = Date.now() - t;
            console.log('Page title is ' + page.evaluate(function () {
                return document.title;
            }));
            console.log('Loading time ' + t + ' msec');
        }
        phantom.exit();
    });
}

我得到以下输出:

Page title is Yahoo
Loading time 700 msec

但是,当我尝试运行一个简单的噩梦时:

node --harmony hello_nightmare.js

hello_nightmare.js 包含以下内容:

var Nightmare = require('nightmare');

var google = new Nightmare()
  .goto('http://google.com')
  .wait()
  .run(function(err, nightmare) {
    if (err) return console.log(err);
    console.log('Done!');
  });

我没有任何输出;感觉就像我只是在命令行上按了“Enter”。

我还尝试了噩梦 github 站点上的示例:

npm install nightmare vo
node --harmony hello_nightmare_main.js

hello_nightmare_main.js 包含以下内容:

var Nightmare = require('nightmare');
var vo = require('vo');

vo(function* () {
  var nightmare = Nightmare({ show: true });
  var link = yield nightmare
    .goto('http://yahoo.com')
    .type('input[title="Search"]', 'github nightmare')
    .click('.searchsubmit')
    .wait('.ac-21th')
    .evaluate(function () {
      return document.getElementsByClassName('ac-21th')[0].href;
    });
  yield nightmare.end();
  return link;
})(function (err, result) {
  if (err) return console.log(err);
  console.log(result);
});

它仍然不起作用。

我该如何解决这个噩梦?

4

4 回答 4

11

您的问题很可能由 https://github.com/segmentio/nightmare/issues/224描述

Nightmare 使用需要 X 显示器的 Electron;由于你的服务器没有显示器,你可以使用 Xvfb 来提供一个虚拟的。安装 xvfb,然后运行

xvfb-run node --harmony hello_nightmare.js

于 2016-01-14T18:21:44.253 回答
9

我只是为了后代发布这个。

下面是在干净的 Ubuntu Linux 机器上使用 node (4.2.4) 安装 nightmarejs 的 bash 脚本。我已经在运行 14.04 的 DigitalOcean 液滴上对此进行了测试。

apt-get -y update
apt-get -y upgrade
apt-get -y --force-yes install make unzip g++ libssl-dev git xvfb x11-xkb-utils xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic x11-apps clang libdbus-1-dev libgtk2.0-dev libnotify-dev libgnome-keyring-dev libgconf2-dev libasound2-dev libcap-dev libcups2-dev libxtst-dev libxss1 libnss3-dev gcc-multilib g++-multilib
mkdir src
cd src
wget https://nodejs.org/dist/v4.2.4/node-v4.2.4.tar.gz
tar xzf node-v4.2.4.tar.gz
cd node-v4.2.4
./configure
make -j2
make install
cd ..
mkdir nightmarejs
cd nightmarejs
npm -f init
npm install --save nightmare vo

然后您只需创建 .js 文件(例如 hello_nightmare.js)(在安装 nightmarejs 的同一目录中),然后使用以下命令运行它(如@yoz 的答案中已经提到的):

xvfb-run node --harmony hello_nightmare.js

我希望这有帮助。

于 2016-01-14T19:49:09.130 回答
7

由于电子需要 X 显示器,您需要安装以下所有软件包

sudo apt-get install -y xvfb x11-xkb-utils xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic x11-apps clang libdbus-1-dev libgtk2.0-dev libnotify-dev libgnome-keyring-dev libgconf2-dev libasound2-dev libcap-dev libcups2-dev libxtst-dev libxss1 libnss3-dev gcc-multilib g++-multilib

在 ubuntu 服务器中测试,aws ec2它工作

然后运行你的脚本:

xvfb-run node --harmony script.js

于 2016-10-30T02:26:44.177 回答
0

Nightmare.js 使用 Electron 浏览器并且需要 X 服务器。安装 xvfb 及其依赖项,以便您可以在没有显示硬件的情况下运行图形应用程序:

sudo apt-get install -y xvfb \
x11-xkb-utils \
xfonts-100dpi \
xfonts-75dpi \
xfonts-scalable \
xfonts-cyrillic \
x11-apps \
clang libdbus-1-dev \
libgtk2.0-dev libnotify-dev \
libgconf2-dev \
libasound2-dev libcap-dev \
libcups2-dev libxtst-dev \
libxss1 libnss3-dev \
gcc-multilib g++-multilib

创建nightmare.js文件并添加以下内容:

const Nightmare = require("nightmare");    
const outputFile = "test.png";

const nightmare = Nightmare({ show: true })

nightmare
  .goto('https://duckduckgo.com')
  .type('#search_form_input_homepage', 'github nightmare')
  .click('#search_button_homepage')
  .wait('#r1-0 a.result__a')
  .evaluate(() => document.querySelector('#r1-0 a.result__a').href)
  .end()
  .then(res => {
    console.log(res)
  })
  .catch(error => {
    console.error('Search failed:', error)
  })

运行脚本:

$ xvfb-run node --harmony nightmare.js
// output: https://github.com/segmentio/nightmare
于 2021-02-23T04:00:45.363 回答