Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何:使用CasperJS打印选择选项值?_Javascript_List_Phantomjs_Casperjs_Options - Fatal编程技术网

Javascript 如何:使用CasperJS打印选择选项值?

Javascript 如何:使用CasperJS打印选择选项值?,javascript,list,phantomjs,casperjs,options,Javascript,List,Phantomjs,Casperjs,Options,我正在尝试打印“complist”中每个选项的值,如下所示: <select name="complist"> <option selected="" value="111 1">107-83-5&nbsp;&nbsp;C6H14&nbsp;&nbsp;2-Methylpentane</option> <option value="1 24">&nbsp;75-07-0&nbsp;&a

我正在尝试打印“complist”中每个选项的值,如下所示:

<select name="complist">
    <option selected="" value="111 1">107-83-5&nbsp;&nbsp;C6H14&nbsp;&nbsp;2-Methylpentane</option>
    <option value="1 24">&nbsp;75-07-0&nbsp;&nbsp;C2H4O&nbsp;&nbsp;&nbsp;&nbsp;Acetaldehyde</option>
    <option value="6 2">106-93-4&nbsp;&nbsp;C2H4Br2&nbsp;&nbsp;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,警告
  • 功能>,警告
这是由于for循环中的options.length导致的:/

我尝试了其他几种方法(例如)返回选项列表,但到目前为止没有任何效果

要确切了解我在说什么,您可以:

  • 导航到
  • 选择选项4(DDB搜索)
  • 输入例如174作为ddb编号并提交
  • 您现在应该看到一个“complist”,其中有一个水选项

  • 如何返回选项值?任何帮助都将不胜感激。

    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”步骤),该脚本将打印到控制台。。。