2013-12-03 5 views
2

У меня есть минимальные знания в casperjs & JavaScript, и мы пытались протестировать наш новый сайт. Пройдя через документацию casperjs и разработав несколько примеров программ, я получил некоторое представление о функции оценки(). Но теперь я застрял в странной проблеме. Я использовал функцию оценки, чтобы найти все ссылки внутри веб-страницы. Теперь я пытаюсь перейти на все эти ссылки и получить информацию о них. Теперь моя проблема в том, что во второй раз, когда я использую функцию оценки(), она просто пропускается. Это совершенно неожиданное поведение. Пожалуйста, заполните, что мне не хватает. Я прикрепил этот пример кода, который я использовал для воспроизведения проблемы.CasperJS функция оценки не работает во второй раз

var BASE_URL = "http://www.google.com"; 
var links = []; 
var divs = []; 
var casper = require('casper').create({verbose: true,}); 

function getLinks() { 
    var links = document.querySelectorAll('h3.r a'); 
    return Array.prototype.map.call(links, function(e) { 
     return e.getAttribute('href'); 
    }); 
} 

function getDivs(){ 
     __util__.echo("get Divs Function"); 
     var divs = document.getElementsByTagName('div'); 
     return Array.prototype.map.call(divs, function(e) { 
     return e; 
    }); 
} 

casper.start(BASE_URL, function() { 
    this.fill('form[action="/search"]', { q: 'casperjs' }, true); 
}); 

casper.then(function() { 
    links = this.evaluate(getLinks); 
    this.echo("links == " + links); 
}); 

casper.waitForUrl(BASE_URL, function(){ 
    this.echo(this.getCurrentUrl()); 
}, function(){}, 20000); 

casper.then(function() { 
    this.echo("------------------") 
    divs = this.evaluate(getDivs); 
    this.echo("^^^^^^^^^^^^^^^^^^") 
    this.echo("divs == " + divs); 
}); 

casper.run(); 

ответ

2

Это работает. У вас отсутствует функция 's' on getDivs __utils__.

var BASE_URL = "http://www.google.com"; 
var links = []; 
var divs = []; 
var casper = require('casper').create({verbose: true,}); 

function getLinks() { 
    var links = document.querySelectorAll('h3.r a'); 
    return Array.prototype.map.call(links, function(e) { 
     return e.getAttribute('href'); 
    }); 
} 

function getDivs(){ 
    __utils__.echo("get Divs Function"); 
    var divs = document.getElementsByTagName("div"); 
    return Array.prototype.map.call(divs, function(e) { 
     return e; 
    }); 
} 

casper.start(BASE_URL, function() { 
    this.fill('form[action="/search"]', { q: 'casperjs' }, true); 
}); 

casper.then(function() { 
    links = this.evaluate(getLinks); 
    this.echo("links == " + links); 
}); 

casper.waitForUrl(BASE_URL, function(){ 
    this.echo(this.getCurrentUrl()); 
}, function(){}, 20000); 

casper.then(function() { 
    this.echo("------------------"); 
    divs = this.evaluate(getDivs); 
    this.echo("^^^^^^^^^^^^^^^^^^"); 
    this.echo(JSON.stringify(divs)); 
}); 

casper.run(); 
+0

Будет интересно, если это исправить, так как эти полуколоны являются необязательными. См. Http://www.codecademy.com/blog/78-your-guide-to-semicolons-in-javascript (но, лично, я всегда их вставлял!) (Кстати, я не видел никаких * неверно совпадающие * двойные/одинарные кавычки - это то, что вы имели в виду?) –

+0

@ DarrenCook, вы правы. Мои извинения. Я отредактировал свой ответ с рабочим решением. –

Смежные вопросы