为什么';在CasperJS中不使用普通JavaScript吗?

为什么';在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

我是CasperJS的新手。为什么
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节点的表示,例如

艾尔