[英]Passing variable from this.evaluate to casper.then
我一定是对此已经失去了理解,但为什么它没有打印出"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();
我在这里使用这些库:
问题在于谷歌似乎在使用不同的用户代理浏览时提供不同的版本,原因有些晦涩难懂。 我怀疑沉重的浏览器/用户代理嗅探。
在我们的例子中,使用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();
});
我认为casper.js或phantom.js在evaluate()中的调试存在严重问题。 如果我替换下面的行,它的工作原理
var myTxt = document.querySelector('.gbts').innerHTML;
问题是:如果在evaluate()中有javascript错误,如何调试? 没有办法知道......
你试过这个调试吗?
casper.on('remote.message', function(message) {
this.echo('remote console message: ' + message);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.