我正在加载带有预设搜索字词的Google搜索页面(" Apples")。然后我想在搜索框中键入以查找其他内容,但它没有按预期运行(代码下方的详细说明)。
var links = [];
var casper = require('casper').create({
// verbose: true,
// logLevel: "debug"
// pageSettings: {
// userAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5'
// }
});
function getLinks() {
var links = document.querySelectorAll('h3.r a');
return Array.prototype.map.call(links, function(e) {
return e.innerText;
});
}
casper.start('https://www.google.com/#safe=off&q=Apples', function() {
// search for 'casperjs' from google form
this.fill('form[action="/search"]', { q: 'casperjs' }, true);
casper.capture('screenshot/googleresults1.png');
});
casper.then(function() {
// aggregate results for the 'casperjs' search
links = this.evaluate(getLinks);
casper.capture('screenshot/googleresults2.png');
// now search for 'phantomjs' by filling the form again
this.fill('form[action="/search"]', { q: 'phantomjs' }, true);
});
casper.then(function() {
// aggregate results for the 'phantomjs' search
links = links.concat(this.evaluate(getLinks));
});
casper.run(function() {
// echo results in some pretty fashion
this.echo(links.length + ' links found:');
casper.capture('screenshot/googleresults3.png');
this.echo(' - ' + links.join('\n - ')).exit();
});
我遇到的错误:
我的问题:
答案 0 :(得分:2)
Google会根据用户代理,视口大小和其他指标提供不同的页面。
不同的页面可以在PhantomJS中无法正常运行的其他JavaScript中显示出来(点击和提交内容总是一个问题)。也可以在不同配置(用户代理,视口大小)之间添加,删除或更改其ID。
您应截取屏幕截图(casper.capture(filename)
)并保护当前页面来源(fs.write(filename, casper.getHTML())
),以查看与您在桌面浏览器中看到的内容相比是否存在差异。
脚本中的特定问题:
如果没有页面加载,则应使用其中一个casper.wait*
函数来等待更改的内容。 casper.then()
是一个异步步骤函数,通常只捕获整页加载
在该注释中,casper.fill()
立即完成,但页面可能需要一段时间,直到实际加载了输入的内容。因此,casper.capture()
之后立即使用casper.fill()
将无法提供预期结果。
this
始终引用casper
。所以,你可以互换使用它们。