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

How to: Print Select Option Values Using CasperJS?

我正在尝试打印 "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>

我试过了:

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);
    }
});

但我收到以下错误:

由 for 循环中的 options.length 产生:/

我尝试了一些其他方法(例如 )来 return 选项列表,但到目前为止没有任何效果。

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

  1. 导航到 http://www.ddbst.com/unifacga.html
  2. Select 选项编号。 4(DDB 搜索)
  3. 输入例如174作为ddb编号并提交。
  4. 您现在应该会看到 "complist" 只有一个水选项。

如何 return 期权价值?任何帮助将不胜感激。

casper.evaluate 在沙箱内执行 javascript。您必须专门 return 来自该函数的数据,因为在那里创建的变量将不存在于主脚本中。正确的实现方式:

/// 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