4

我一定对此失去了理智,但为什么它没有打印"1: Google Search"出来"2: Google Search"?基本上:如何在 this.evaluate 中获取变量并在 casper.js 范围的其余部分使用它?

var casper = require("casper").create();
var buttonText;

casper.start("http://google.com");

casper.then(function() {
  buttonText = this.evaluate(function () {
    var myTxt = document.querySelector('#gbqfsa').innerText;
    console.log('1: ' + myTxt);

    return myTxt;
  }); 
});

casper.then(function() {
  this.echo('2: ' + buttonText);
});

casper.on('remote.message', function(msg) {
    this.echo('remote message caught: ' + msg);
});

casper.run();

我在这里使用这些库:

https://github.com/ariya/phantomjs

http://casperjs.org/index.html

4

3 回答 3

9

问题在于,由于某些非常模糊的原因,当使用不同的用户代理浏览时,Google 似乎提供了不同的版本。我怀疑浏览器/用户代理嗅探很重。

在我们的例子中,使用Casper.debugHTML()显示代码不包含与#gbqfsa选择器匹配的按钮(而 Chrome 显示一个);取而代之的是标准提交<input name="btnG">

所以这是使用按钮的实际选择器的脚本:

var casper = require("casper").create();
var buttonText;

casper.start("http://google.com/", function() {
    buttonText = this.evaluate(function () {
        var myTxt = document.querySelector('input[name="btnG"]').getAttribute('value');
        __utils__.echo('1: ' + myTxt);
        return myTxt;
    });
    this.echo('2: ' + buttonText);
});

casper.run();

只是一个想法,尝试使用Casper.userAgent()将 UA 设置为更常见的东西,例如。最近的 chrome 版本。

PS:还要注意__utils__.echo()直接从内部打印东西的使用evaluate()

编辑:它通过设置一个通用的 UA 来工作:

casper.start();

casper.userAgent("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16");

casper.thenOpen('http://google.com/', function() {
    this.test.assertExists('#gbqfsa'); // PASS
});

casper.run(function() {
    this.test.done();
});
于 2012-12-15T21:03:45.960 回答
0

我认为 casper.js 或 phantom.js 在评估()中的调试存在严重问题。如果我替换下面的行,它可以工作

var myTxt = document.querySelector('.gbts').innerHTML;

问题是:当evaluate() 中出现javascript 错误时如何调试?没有办法知道...

于 2012-12-09T23:20:12.870 回答
0

你试过这个调试吗?

casper.on('remote.message', function(message) {
    this.echo('remote console message: ' + message);
});

查看事件和过滤器 - 在运行时挂钩和更改 CasperJS 环境

于 2012-12-15T18:46:06.400 回答