2016-04-26 2 views
0

Почему это ожидание в 'clickOldShares' не работает? Даже когда я помещаю внутри оценки, ожидание не работает. Я считаю, что это небольшая деталь со ссылками, но сейчас у меня нет идей.В CasperJS, как вы можете подождать?

function clickOldShares(){ 
    console.log("Waiting for Old Shares"); 
    element = document.querySelector("#pagelet_scrolling_pager > div > div > a"); 
    console.log("ELEMENT: " + element); 
    if(element){ 
    console.log('click and waiting...'); 
    element.click(); 
    console.log('clicked!'+ element); 

    //THIS WAIT IS NOT WORKING!!!! I DON'T KNOW WHY!!!! 
    this.wait(2000,clickOldShares); 

    } 
    else { 
    console.log("done!"); 
    } 
    return element; 
}; 

//Initializing Casper 
casper.start('https://www.facebook.com/', function() { 
    console.log("Entering on Facebook"); 
}); 

//Remote Message Handler - now I can see what happen inside evaluates 
casper.on('remote.message', function(msg) { 
    this.echo(msg); 
}) 


//Facebook login 
casper.then(function(){ 
    console.log("Login using username and password"); 
    this.evaluate(function(){ 
     document.getElementById("email").value = '[email protected]'; 
     document.getElementById("pass").value = 'somepass'; 
     document.getElementById("login_form").submit(); 
     }) 
    if(this.exists('#u_0_2 > div:nth-child(1) > div:nth-child(1) > div > a > span')){ 
     console.log("Login ok!"); 
    } 
    else { 
     console.log("Login not ok!"); 
     casper.exit(); 
    } 
}); 


    casper.thenOpen("https://www.facebook.com/shares/view?id=1063249230414580" ,function(){ 
    console.log("Open post with object-id"); 
    }); 


casper.thenClick("#pagelet_scrolling_pager > div > div > a",function(){ 
     this.wait(2000,function(){ this.evaluate(clickOldShares)}); 
}); 

ответ

0

this внутри контекста страницы (внутри casper.evaluate()) относится к window и не casper. Вы не можете использовать casper внутри контекста страницы.

Вы должны переместить вещи вокруг:

function clickOldShares(){ 
    var elementAvailable = this.evaluate(function(){ 
     console.log("Waiting for Old Shares"); 
     element = document.querySelector("#pagelet_scrolling_pager > div > div > a"); 
     console.log("ELEMENT: " + element); 
     if(element){ 
     console.log('click and waiting...'); 
     element.click(); 
     console.log('clicked!'+ element); 
     } 
     return !!element; 
    }); 
    if (elementAvailable) { 
     this.wait(2000, clickOldShares); 
    } 
}; 

и использовать его как это:

casper.thenClick("#pagelet_scrolling_pager > div > div > a",function(){ 
    this.wait(2000, clickOldShares); 
}); 

Поскольку DOM узлы не могут быть переданы из, вам нужно какое-то представление, которое существовало DOM элемент в контексте страницы. Этого можно легко добиться, принудив узел DOM к boolean с !element, а затем немедленно отменив его !!element, чтобы проверить, является ли «element» «правдивым».

+0

Я был так близок! Но благодаря вам, я понимаю немного больше о «игре областей» в javascript. Спасибо огромное! Изображение не в порядке, потому что много данных. Но я призываю getHTML посмотреть, и все есть! Я обязан вам пивом! Еще раз спасибо! : D –

+0

Как насчет «элемента». Я не знал этого в javascript. Есть документация об этом? Кстати, могу ли я спросить вас о рекомендации статьи Javascript? –

+0

[Что означает этот символ в JavaScript?] (Http://stackoverflow.com/q/9549780/1816580) ссылки ссылки ссылки на [Что такое !! (не) в JavaScript?] (http://stackoverflow.com/q/784929/1816580), который необходим здесь, поскольку узлы DOM не могут быть удалены из контекста страницы. Это ограничение является особенностью PhantomJS и не связано с JavaScript. –

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