这个变量怎么仍然是NULL

时间:2017-06-02 19:51:34

标签: javascript phantomjs casperjs

我正在编写CasperJS脚本以自动化搜索表单并捕获后续页面。但是,搜索表单首先进入加载启动页面,直到数据到达。所以我添加了waitForSelector函数,它似乎适用于我的某些页面,但其他函数将变量name作为NULL返回。如果它是真正的等待"那怎么可能呢?该元素是否在DOM上?

casper.each(searchPages,function(casper,index){
    var currentTime = new Date();
    var month = currentTime.getMonth() + 2;
    var day = currentTime.getDate();
    var year = currentTime.getFullYear();
    var dateStart = month + "/" + day + "/" + year;
    month = currentTime.getMonth() + 3;
    var dateEnd = month + "/" + day + "/" + year;

    casper.thenOpen(url,function(){
        var myfile = "data-"+year + "-" + month + "-" + day+".html";
        this.evaluate(function(j) {
            document.querySelector('select[name="searchParameters.localeId"]').selectedIndex = j;
        },index);
        this.evaluate(function(start) {
            $("#leaveDate").val(start);
        },dateStart);
        this.evaluate(function(end) {
            $("#returnDate").val(end);
        },dateEnd);
        this.evaluate(function() {
            $("#OSB_btn").click();
        });

        this.waitForSelector('#destinationForPackage', function() {
            var name = casper.evaluate(function() {
                return $("#destinationForPackage option[value='" + $("#destinationForPackage").val() + "']").text()
            });
            if (name != "Going To"){
                if (name == null){
                    console.log("it's null");
                }else{
                    name = name.replace("/","_");
                    casper.capture('Captures/Searches/search_' + name + '.jpg');
                    console.log("Capturing search_" + name);
                }
            }
        },function(){
            console.log("Search page timed-out.");  
        },20000);
    });
});

1 个答案:

答案 0 :(得分:0)

如果元素仍然不可用,我可以通过创建递归函数来解决这个问题。现在我有一个内存问题,这里的新问题=> CasperJS running out of memory

casper.each(searchPages,function(casper,index){
    loadSearch(casper,index);
});


function loadSearch(casper,index){
    var currentTime = new Date();
    var month = currentTime.getMonth() + 2;
    var day = currentTime.getDate();
    var year = currentTime.getFullYear();
    var dateStart = month + "/" + day + "/" + year;
    month = currentTime.getMonth() + 3;
    var dateEnd = month + "/" + day + "/" + year;

    casper.thenOpen(url,function(){
        var myfile = "data-"+year + "-" + month + "-" + day+".html";
        this.evaluate(function(j) {
            document.querySelector('select[name="searchParameters.localeId"]').selectedIndex = j;
        },index);
        this.evaluate(function(start) {
            $("#leaveDate").val(start);
        },dateStart);
        this.evaluate(function(end) {
            $("#returnDate").val(end);
        },dateEnd);
        this.evaluate(function() {
            $("#OSB_btn").click();
        });

        this.waitForSelector('#destinationForPackage', function() {
            if (this.exists('#destinationForPackage')){
                var name = casper.evaluate(function() {
                    return $("#destinationForPackage option[value='" + $("#destinationForPackage").val() + "']").text()
                });
                if (name != "Going To"){
                    if (name == null){
                        console.log("it's null");
                    }else{
                        name = name.replace("/","_");
                        casper.capture('Captures/Searches/search_' + name + '.jpg');
                        console.log("Capturing search_" + name);
                    }
                }
            }else{
                console.log("Still doesn't exist...retry");
                loadSearch(casper,index);
            }

        },function(){
            console.log("Search page timed-out.");  
        },20000);
    });
}