为什么';在CasperJS中不使用普通JavaScript吗?
我是CasperJS的新手。为什么为什么';在CasperJS中不使用普通JavaScript吗?,javascript,casperjs,Javascript,Casperjs,我是CasperJS的新手。为什么this.echo(this.getTitle())工作,但控制台.log(“页面标题”,文档.Title)没有?还有为什么我的document.querySelector不工作?有人有好的解释吗?在CasperJS文档中的哪里可以找到答案 这是我的密码: var casper = require('casper').create(); var url = 'http://www.example.com/'; casper.start(url, functi
this.echo(this.getTitle())代码>工作,但控制台.log(“页面标题”,文档.Title)代码>没有?还有为什么我的document.querySelector不工作?有人有好的解释吗?在CasperJS文档中的哪里可以找到答案
这是我的密码:
var casper = require('casper').create();
var url = 'http://www.example.com/';
casper.start(url, function() {
this.echo(this.getTitle()); // works
this.echo(this.getCurrentUrl()); // works
});
casper.then(function(){
this.echo(this.getCurrentUrl()); // works
console.log("this is URL: ", document.URL); // doesn't work
console.log("Page Title ", document.title); // doesn't work
var paragraph = document.querySelectorAll('p')[0].innerHTML;
console.log(paragraph); // doesn't work
});
casper.run();
编辑:
我现在正在使用casper.thenEvaluate和casper.evaluate,但仍然不起作用。有什么想法吗
var casper = require('casper').create();
var url = 'http://www.example.com/';
casper.start(url, function() {
this.echo(this.getTitle()); // works
this.echo(this.getCurrentUrl()); // works
console.log('page loaded: '); // works
});
casper.thenEvaluate(function(){
var paragraph = document.querySelectorAll('p')[0].innerHTML; // doesn't work
console.log(paragraph); // doesn't work
console.log("Page Title ", document.title); // doesn't work
});
casper.run();
您必须使用此调用依赖于文档的函数。评估:
var paragraph = this.evaluate(function() {
return document.querySelector('p').innerHtml;
});
如有疑问,请咨询。您必须使用此调用依赖于文档的函数。评估:
var paragraph = this.evaluate(function() {
return document.querySelector('p').innerHtml;
});
如有疑问,请参阅。this.getTitle()在Casper对象上执行getTitle()函数,并在Casper上下文中运行,因此它会产生预期的结果
但是,“文档”在Casper上下文中不可用。根本原因是Casper正在运行PhantomJS,这是一种web浏览器。因此,“文档”仅在浏览器中可用,比在Casper上下文中运行的代码“更深”一级。没有直接的方法在两个环境之间共享变量,但是可以通过复制值将变量作为参数传递
两个环境(Casper和Phantom)之间的“桥梁”是Casper的“评估”功能。函数中作为参数传递给“evaluate”的所有内容都将在浏览器上下文中执行,而不是在Casper上下文中执行。这是一个重要的区别。如Blender所述,文件可在此处查阅:
示例如下:
casper.evaluate(function(username, password) {
document.querySelector('#username').value = username;
document.querySelector('#password').value = password;
document.querySelector('#submit').click();
}, 'sheldon.cooper', 'b4z1ng4');
在给定的示例中,您可以看到如何将“用户名”和“密码”参数从Casper环境传递到浏览器(页面)环境
匿名“函数(用户名、密码)”将在浏览器中执行。因此,您可以在其中使用“文档”
您还可以传回该值,该值可以在Casper端拾取。即
var result = casper.evaluate(function run_in_browser(){
return document.title;
});
这个.getTitle()在Casper对象上执行getTitle()函数,并在Casper上下文中运行,因此它产生预期的结果
但是,“文档”在Casper上下文中不可用。根本原因是Casper正在运行PhantomJS,这是一种web浏览器。因此,“文档”仅在浏览器中可用,比在Casper上下文中运行的代码“更深”一级。没有直接的方法在两个环境之间共享变量,但是可以通过复制值将变量作为参数传递
两个环境(Casper和Phantom)之间的“桥梁”是Casper的“评估”功能。函数中作为参数传递给“evaluate”的所有内容都将在浏览器上下文中执行,而不是在Casper上下文中执行。这是一个重要的区别。如Blender所述,文件可在此处查阅:
示例如下:
casper.evaluate(function(username, password) {
document.querySelector('#username').value = username;
document.querySelector('#password').value = password;
document.querySelector('#submit').click();
}, 'sheldon.cooper', 'b4z1ng4');
在给定的示例中,您可以看到如何将“用户名”和“密码”参数从Casper环境传递到浏览器(页面)环境
匿名“函数(用户名、密码)”将在浏览器中执行。因此,您可以在其中使用“文档”
您还可以传回该值,该值可以在Casper端拾取。即
var result = casper.evaluate(function run_in_browser(){
return document.title;
});
尝试this.echo(this.fetchText('p')代码>以获取innerhtml 试试this.echo(this.fetchText('p')代码>以获取innerhtml CasperJS从PhantomJS继承了DOM上下文(页面上下文)和外部上下文之间的分离。您只能通过访问沙盒DOM上下文<evaluate()
回调内部的code>document
是普通JavaScript中所期望的变量,但是evaluate()
外部还有一个document
,它只是一个虚拟对象,不提供对页面DOM的访问
如果要访问DOM属性,则需要使用evaluate()
但这对DOM节点不起作用,因为只有基元对象才能从DOM上下文中传递出去。PhantomJS文档说明如下:
注意:参数和evaluate
函数的返回值必须是一个简单的原语对象。经验法则:如果可以通过JSON对其进行序列化,那么就可以了
闭包、函数、DOM节点等将无法工作强>
如果要使用document.querySelector()
,则需要生成可以传递到外部的DOM节点表示:
var form = casper.evaluate(function() {
var f = document.querySelector('form');
return { html: f.innerHTML, action: f.action };
});
casper.echo(JSON.stringify(form, undefined, 4));
您还可以使用所有可用的CasperJS函数,这些函数可以提供DOM节点的表示,例如
另外,请看一看。CasperJS继承了DOM上下文(页面上下文)和PhantomJS的外部上下文之间的分离。您只能通过访问沙盒DOM上下文<evaluate()
回调内部的code>document
是普通JavaScript中所期望的变量,但是evaluate()
外部还有一个document
,它只是一个虚拟对象,不提供对页面DOM的访问
如果要访问DOM属性,则需要使用evaluate()
但这对DOM节点不起作用,因为只有基元对象才能从DOM上下文中传递出去。PhantomJS文档说明如下:
注意:参数和evaluate
函数的返回值必须是一个简单的原语对象。经验法则:如果可以通过JSON对其进行序列化,那么就可以了
闭包、函数、DOM节点等将无法工作强>
如果要使用document.querySelector()
,则需要生成可以传递到外部的DOM节点表示:
var form = casper.evaluate(function() {
var f = document.querySelector('form');
return { html: f.innerHTML, action: f.action };
});
casper.echo(JSON.stringify(form, undefined, 4));
您还可以使用所有可用的CasperJS函数,这些函数可以提供DOM节点的表示,例如
艾尔