2014-12-23 4 views
3

Я пытаюсь получить casperjs работы со следующей ситуацией:Как я могу заставить casperjs повторять цикл до тех пор, пока не будет выполнено определенное условие?

веб-страница загружается, то в пределах этой страницы, он АЯКС загружает элементы данных вместе с «читать далее» кнопку, которая в свою очередь, загружает некоторые больше данных элементов.

Мне нужен сценарий, чтобы рекурсивно проверить, существует ли кнопка «читать дальше» (так как есть много элементов данных для загрузки), если это так, щелкните по нему, иначе продолжайте с остальной частью скрипта и выведите полный текст как jpeg.

Я попытался написать код ниже, но он не работает так, как я надеялся. Он просто нажимает кнопку один раз, затем выводит изображение, даже если больше данных загружается, и кнопка все еще существует для повторного нажатия.

var casper = require('casper').create({ 
    verbose : true, 
    logLevel : 'debug', 
    pageSettings : { 
     "userAgent" : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.10 (KHTML, like Gecko) Chrome/23.0.1262.0 Safari/537.10', 
     "loadImages" : false, 
     "webSecurityEnabled" : false, 
     "ignoreSslErrors" : true 
    }, 
}); 

var urls = { 
    login : 'http://www.website.com/login', 
    details : 'http://www.website.com/details', 
}; 

casper.start(urls.login, function() { 

    //login stuff 

}); 

//the function I'm trying to recursively loop before moving on to saving the capture image 
function checkMore() { 

    //check to see if the 'read more' button exists 
    if (casper.exists('a.read-more')) { 

     //click the button to load more items   
     casper.click('a.read-more'); 

     //wait for the items to load, then run the check again 
     casper.wait(3000, function() { 
      casper.run(checkMore); 
     }); 

    } 

} 

casper.thenOpen(urls.details, function() { 

    //wait for the page along with ajax items to load shortly after 
    this.wait(3000, function() { 
     this.run(checkMore); 
    }); 

}); 

casper.then(function() { 

    //output the result 
    this.capture('output.jpg'); 

}); 

casper.run(); 
+0

Я думаю, что вы должны только один раз вызвать «запустить». Вы можете просто передать 'checkMore' непосредственно функции ожидания, т. Е. 'this.wait (3000, checkMore)'. Однако в 'checkMore' ссылка' this' не будет работать, поэтому вам придется писать, например. 'Casper.exists ('...')'. – pius

+1

Вы считали 'waitForSelector' ожиданием кнопки' read-more'? Похоже, это подходит для этого сценария. http://casperjs.readthedocs.org/en/latest/modules/casper.html#waitforselector – pius

+0

Как это сделать? Вы не описали, в чем проблема. –

ответ

0

У Пиуса была правильная идея, я изменил свой код, решение ниже.

var urls = { 
    login : 'http://www.website.com/login', 
    details : 'http://www.website.com/details', 
}; 

casper.start(urls.login, function() { 

    //login stuff 

}); 

//the function I'm trying to recursively loop before moving on to saving the capture image 
function checkMore() { 

    //check to see if the 'read more' button exists 
    if (casper.exists('a.read-more')) { 

     //click the button to load more items   
     casper.click('a.read-more'); 

     //wait for the items to load, then run the check again 
     casper.wait(3000, checkMore); 

    } 

} 

casper.thenOpen(urls.details, function() { 

    //wait for the page along with ajax items to load shortly after 
    this.wait(3000, checkMore); 

}); 

casper.then(function() { 

    //output the result 
    this.capture('output.jpg'); 

}); 

casper.run(); 
+0

Что произойдет, если 'a.readmore' никогда не станет видимым? Разве вы не считаете это? – Rippo

+0

Rippo, поэтому я проверяю «if (casper.exists (« a.read-more »))». если ссылка никогда не существовала, или если ссылка перестала отображаться, то сценарий не будет нажимать, а также снова вызвать функцию checkMore. – Paul

+0

и если вызов ajax терпит неудачу? – Rippo