CasperJS waitFor*() 的行为非常不明确

CasperJS waitFor*() has very unclear behaviour

我试图了解 CasperJS 的工作原理,以便在我的测试中使用它。我试图完成的是在页面的某些元素准备好并完全加载时截取它们的屏幕截图,我以 Whatsapp Web 为例,因为它具有我正在寻找的加载。

这是我的实现:

var casper = require('casper').create({
  remoteScripts:  [
    'http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js',
    'https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js'
  ],
  pageSettings: {
    userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.1500.71 Safari/537.36'
  },
  viewport: {
    width: 1280,
    height: 1024
  },
  waitTimeout: 60000,
  logLevel: 'debug',
  verbose: true
});

casper.start('https://web.whatsapp.com/', function(){
    this.echo('Starting...')
    this.waitForSelector('.qrcode', function() {
        this.captureSelector('whatsapp.png', 'html');
        this.echo('Screeshot Taken!')
    });
});

casper.run();

似乎 CasperJS 不会在 60 年代找到 <div class="qrcode"></div> 进入页面,那是相当长的时间。 我在这里缺少什么? waitFor*() 应该做什么?

信息:PhantomJS v2.0.0

注意:我能说的是,实际上看起来 waitForSelector() 是异步工作的,我想知道为什么必须这样实现 wait() 函数,我期望的是一个观察者(或无限循环),它将连续获取 DOM 并在一定时间内使用该选择器检查元素。

我终于明白了! 这是一个版本问题,只是避免使用 brew 安装 PhantomJSCasperJS

其实我做的是:

  • brew uninstall phantomjs && brew uninstall casperjs
  • npm i -g phantomjs && npm i -g casperjs

现在我的代码可以正常工作了。 此错误实际上与 PhantomJS 的 v1.9.8 有关,会触发此错误:

Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file:///usr/local/Cellar/casperjs/1.1-beta3/libexec/bin/bootstrap.js. Domains, protocols and ports must match.

如果您使用的是 OSX,请使用 npm 重新安装并正常运行。 希望对你有帮助。