gpt4 book ai didi

javascript - `querySelectorAll` 没有 't return anything in ` casperjs`

转载 作者:行者123 更新时间:2023-11-30 20:50:24 27 4
gpt4 key购买 nike

使用 casperjs,我知道我可以使用 this.evaluate 在访问页面的上下文中执行 JavaScript。它似乎运行良好,只是我无法使用 document.querySelectordocument.querySelectorAll 找到任何内容,无论起始 URL 是什么。

为了研究这个问题,我创建了两个文件:test.htmltest.js,使用 python3 -m http.server 在本地提供服务在端口 8000 上。这些是文件:

test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Page title</title>
</head>
<body>
<p>A test to see</p>
<p>if casperjs can grab elements</p>
<p>evaluating JS</p>
<p>in the context of the page</p>
</body>
</html>

test.js

function grabTitle(){
return document.title;
}

function grabParagraphs(){
var pars = document.querySelectorAll("p");
for (var i=0; i<pars.length; i++){
texts.push(pars[i].textContent);
}
}

var casper = require("casper").create();
var url = "http://localhost:8000/test.html";
var texts = [];

casper.start(url,function(){
this.echo("Begin");
});

casper.then(function(){
var title = this.evaluate(grabTitle);
this.echo("The title is: " + title);
this.evaluate(grabParagraphs);
this.echo(texts.length + " paragraphs found:\n" + texts);
});

casper.run(function(){
this.echo("Done").exit();
});

运行 casperjs test.js 给了我这个输出:

Begin
The title is: Page title
0 paragraphs found:

Done

它找到了标题,所以 grabTitle 工作正常,在页面的上下文中执行,但没有找到段落。我想也许我没有等待页面加载,所以我尝试了 casper.waitForSelector("p",function(){ ... }); 甚至 casper .wait(10000,function ... ),等待10秒让页面加载,没有任何结果。

使用 document.getElementsByTagName 修改 grabParagraphs 也不起作用。我不知道问题出在哪里,我能找到的每个示例都展示了 querySelector 的用法,所以它应该可以工作。

我在 Linux Mint 上使用 phantomjs 2.1.1casperjs 1.1.4

编辑

按照@Mario Nikolaus 的建议,我更改了test.js:而不是将结果推送到在 的全局上下文中定义的数组texts test.js,现在我在grabParagraphs中定义texts,然后返回结果:

function grabParagraphs(){
var pars = document.getElementsByTagName("p");
var texts = [];
for (var i=0; i<pars.length; i++){
texts.push(pars[i].textContent);
}
return texts;
}

casper.then(function(){
var title = this.evaluate(grabTitle);
this.echo("The title is: "+title);
var texts = this.evaluate(grabParagraphs);
this.echo(texts.length+" paragraphs found:\n"+texts)
});

最初我假设我可以将结果推送到变量 texts 中,因为它是在 test.js 的上下文中定义的,所以它是全局可用的。但是,它在页面上下文中不可用,所以这就是问题所在!

最佳答案

您没有从 grabParagraphs 函数中的 evaluate 返回值。

在浏览器上下文中创建另一个数组变量,将该数组返回给您 casper 上下文并将其分配给数组。

function grabTitle(){
return document.title;
}

function grabParagraphs(){
var arr = [];
var pars = document.querySelectorAll("p");
for (var i=0; i<pars.length; i++){
arr.push(pars[i].textContent);
}
return arr;
}

var casper = require("casper").create();
var url = "http://localhost:8001/a.html";

casper.start(url,function(){
this.echo("Begin");
});

casper.then(function(){
var title = this.evaluate(grabTitle);
this.echo("The title is: " + title);
var texts = this.evaluate(grabParagraphs);
this.echo(texts.length + " paragraphs found:\n" + texts);
});

casper.run(function(){
this.echo("Done").exit();
});

希望对您有所帮助!

关于javascript - `querySelectorAll` 没有 't return anything in ` casperjs`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48248695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com