- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 casperjs
,我知道我可以使用 this.evaluate
在访问页面的上下文中执行 JavaScript。它似乎运行良好,只是我无法使用 document.querySelector
或 document.querySelectorAll
找到任何内容,无论起始 URL 是什么。
为了研究这个问题,我创建了两个文件:test.html
和 test.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.1
和 casperjs 1.1.4
编辑
按照@Mario Nikolaus 的建议,我更改了test.js
:而不是将结果推送到在 的全局上下文中定义的数组
,现在我在texts
test.jsgrabParagraphs
中定义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/
我有以下内容: var searchSuggestionsItems = document.querySelectorAll("#search-user-results .live-search-re
我正在尝试查找具有以下内容的元素: doc.querySelectorAll('#divContentList article'); 它运行良好,但另一位开发人员告诉我我应该写: doc.queryS
尝试在错误控制台中执行这 2 个代码块: 第一个。输出节点列表。 var selector = "*[data-type=day][data-day='23']"; var a = document.
这是我的 JavaScript 代码: function answer(){ var list = document.querySelectorAll("#fish"); list[1].onclic
假设我有: ... ... ... ... ... ... ... 如何选择 元素,但仅限于 testimonials-wrapper 内的元素 尝试过:d
我创建了一个表,我们将其命名为 RPT_ACCOUNTS 代码|描述|类型01|银行|BA02|税|TA 当我从数据表中提取信息时,我会在 html 中直观地创建表格 row.dataset.rpt_
document.querySelectorAll('#salary-min, #salary-max').addEventListener('input', event => event.tar
这个问题已经有答案了: What do querySelectorAll and getElementsBy* methods return? (12 个回答) 已关闭 2 年前。 javaScrip
为了简单起见,我有以下 html,它不是我编写的,我无法控制。 我正在尝试为我们的职员编写一个脚本,该脚本必须将数据输入到此 Web 界面,以便她可以将数据从 Excel 复制并粘贴到 Web
我的代码有问题。现在,如果我单击第一个元素,所有元素将变为红色,如果我第二次单击它们将变为绿色。我想为 fa-heart 类的每个元素设置两个独立的事件。我会更好地解释:如果我第一次点击第一个元素 D
我已经创建了简单的 html 表单,我想使用 javascript 为输入字段标签设置动画。我使用 querySellectorAll 方法来识别对象,并使用控制台记录 querySelectorAl
我目前正在尝试适应this demo当您单击应用了相同类的链接时,用于页面转换。 我不确定如何在使用 querySelectorAll 后为具有相同类的所有元素调整以下代码。您认为应该进行哪些调整才能
我目前正在尝试适应this demo当您单击应用了相同类别的链接时,可以实现页面转换。目前,在 @ourmaninamsterdam 的推荐 here 后,我有以下代码:但我似乎无法让它发挥作用。您对
var arr = [].slice.call(document.querySelectorAll("a[href*='pricing']")); 返回一个长度为6的数组。 var arr = [].
我在 querySelectorAll 方面遇到问题。 这是我的代码: $(window).load( function() { // Add animations
在 JavaScript 中使用 :checked 选择器 document.querySelectorAll() 时,我发现存在不一致的行为。当 :checked 选择器用于复选框或单选按钮时,它不
我有一个表单,其中有多个选择框和带有类似名称的数组的输入。所以我有多个名称为 personroom[] 的选择框。我想用这个得到这些 var personroom=document.querySel
不确定这是否是导致我的项目出现错误的原因。 所以我有一堆具有相同类的 div,我通过选择它们 var CampaignInfo = document.querySelectorAll(".campai
假设我有以下标记... 无论如何,我可以使用 querySelectorAll 选择它们吗? 我尝试过 document.querySelectorAll([data-namespace-*])
我想使用 querySelectorAll 获取页面上多个下拉列表的选定值,然后将它们打印在页面上的其他位置。 我正在努力寻找正确的方法来执行此操作,因为它们都有不同的名称(“dropDown[0]”
我是一名优秀的程序员,十分优秀!