2015-03-12 4 views
1
function checkMessages(user, password, callback) { 
    var page = require('webpage').create(); 
    page.open('http://mywebpage.com', function (status) { 
     if (status === 'fail') { 
      console.log(user + ': ?'); 
     } else { 
      page.evaluate(function (user, password) { 
       document.querySelector('input[name=username]').value = user; 
       document.querySelector('input[name=password]').value = password; 
       document.querySelector('button[name=yt0]').click(); 
      }, user, password); 
      waitFor(function() { 
       return page.evaluate(function() { 
        var el = document.getElementById('fancybox-wrap'); 
        if (typeof(el) != 'undefined' && el != null) { 
         return true; 
        } 
        return false; 
       }); 
      }, function() { 
       var messageCount = page.evaluate(function() { 
        var el = document.querySelector('span[class=unread-number]'); 
        if (typeof(el) != 'undefined' && el != null) { 
         return el.innerText; 
        } 
        return 0; 
       }); 
       console.log(messageCount); 
      }); 
     } 
     page.close(); 
     callback.apply(); 
    }); 
} 

По какой-то причине я просто не могу заставить это работать. PhantomJS жалуется: «Ошибка: не может получить доступ к члену« оценить »удаленного объекта QObject. Это потому, что у меня есть несколько page.evaluates?PhantomJS не могут получить доступ к члену 'оценить' удаленных QObject

ответ

0

PhantomJS является асинхронным. В этом случае waitFor() является асинхронным, поэтому вам нужно закрыть page после того, как вы это сделали. Вы должны переместить

page.close(); 
callback.apply(); 

в последнюю функцию, которая будет выполняться, которая является обратным вызовом waitFor(). Вы можете захотеть изменить waitFor немного, так что есть еще один обратный вызов, когда тайм-аут достигается, который является филиалом ошибка, которая также требует закрытия страницы и обратного вызова:

function waitFor(testFx, onReady, timeOutMillis) { 
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000, 
     start = new Date().getTime(), 
     condition = false, 
     interval = setInterval(function() { 
      if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { 
       condition = testFx(); 
      } else { 
       var error = null; 
       if(!condition) { 
        error = "'waitFor()' timeout"; 
        console.log(error); 
       } else { 
        console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms."); 
        clearInterval(interval); 
       } 
       onReady(error); 
      } 
     }, 250); 
}; 
+0

Так сразу после моего console.log (MessageCount) является правильным местом для этих двух? – phantomguy

+0

Да, это подходящее место. Я добавил правильную реализацию 'waitFor()'. –