Javascript 如何:使用CasperJS打印选择选项值?
我正在尝试打印“complist”中每个选项的值,如下所示:Javascript 如何:使用CasperJS打印选择选项值?,javascript,list,phantomjs,casperjs,options,Javascript,List,Phantomjs,Casperjs,Options,我正在尝试打印“complist”中每个选项的值,如下所示: <select name="complist"> <option selected="" value="111 1">107-83-5 C6H14 2-Methylpentane</option> <option value="1 24"> 75-07-0 &a
<select name="complist">
<option selected="" value="111 1">107-83-5 C6H14 2-Methylpentane</option>
<option value="1 24"> 75-07-0 C2H4O Acetaldehyde</option>
<option value="6 2">106-93-4 C2H4Br2 Ethylene bromide</option>
</select>
107-83-5 C6H14 2-甲基戊烷
75-07-0 C2H4O乙醛
106-93-4 C2H4Br2溴化乙烯
我试过:
casper.then(function(){
this.evaluate(function(){
//var options = document.querySelectorAll('select[name="complist"]');
var options = document.querySelector('select[name="complist"]');
})
for (var i=0; i< options.length; i++){
console.log(">>> " + options[i].textContent);
}
});
casper.then(函数(){
这个。evaluate(函数(){
//var options=document.querySelectorAll('select[name=“complist”]”);
var options=document.querySelector('select[name=“complist”]”);
})
对于(变量i=0;i>>”+选项[i].textContent);
}
});
但我得到了以下错误:
- 错误>引用错误:找不到变量:选项,错误
- 文件>phantomjs://code/gruppen3.js,警告
- 行>113,警告
- 功能>,警告
如何返回选项值?任何帮助都将不胜感激。
casper.evaluate
在沙箱中执行javascript。您必须专门从该函数返回数据,因为在那里创建的变量在主脚本中不存在。正确的实现:
/// MAIN SCRIPT CONTEXT
casper.then(function(){
// Value which is returned from sandbox must be saved in some local variable
var localOptions = this.evaluate(function(){
// SANDBOX CONTEXT -------------------------------
// Dont return objects. Return arrays, strings, numbers
var options = [];
options = [].map.call(document.querySelectorAll('select[name="complist"] option'), function(option){
return option.innerText;
});
// You have to return scraped data back to the outer script
return options;
// END OF SANDBOX CONTEXT -----------------------
});
console.log(">>> " + localOptions);
// just "options" array does not exist here
});
我已经测试过了,而且效果很好强>
var casper = require('casper').create({verbose: true,logLevel: "debug"});
casper.start('http://www.ddbst.com/unifacga.html',function(){
this.withFrame('ircframe',function(){
this.click('input[id="ID4"]');
this.wait(0,function(){
this.fillSelectors('form[name="opeform"]', {'input[name="ddbnumber"]': '155'},false);
});
this.wait(0,function(){this.click('input[name="search_ddbnum"]');});
this.wait(0,function(){
var i,o=this.fetchText('select[name="complist"]');
console.log("The value is: "+o)
});
});
});
casper.then(function(){this.capture('test.png');});
casper.run();
您可以使用:/casperjs--web security=no test.js>/dev/stdout
更新:现在更快了代码>看一看-这非常有趣,但很难!我建议你将这个答案标记为一个解决方案,让人们知道它确实有效。我很高兴能处理它,iframes真的很有趣!再次感谢!你肯定给了我一些思考的东西,例如,它比我现在拥有的要紧凑得多。然而,作为一个新的蜜蜂,map过程对我来说似乎更直观(这是我的第一个casperJS项目,或者说JS)。不幸的是,对于这个问题,我不能给出两种解决方案…@Igor,为了让你的答案更好,不要只给出代码,试着说明错误,告诉他们你是如何做对的。此外,缩进良好的示例更容易理解;谢谢:)我想我几乎什么都懂;不过,如果有人有什么建议,我会用自己的话写下步骤:1。“then”在casperJS框架内创建一个步骤。2.“evaluate”在沙箱中打开DOM(来自phantomJS?)。3.不是循环选项对象,而是使用“map”类(我假设是因为点)将“option”值加载到一个名为“options”的数组中。这里,调用中使用了“function(option)”,但是如果选择器用于图像,我们可以使用“function(img)”??简言之,我想我理解了语义,但如何学习在其他(类似)问题中使用此答案所需的正确语法?4.然后,选项列表返回到外部脚本(“then”步骤),该脚本将打印到控制台。。。