2016-07-11 11 views
-1

Dies ist ein Skript vorgibt, in Ihrem Google-Konto einzuloggen (ich habe gemacht). Aber offensichtlich funktioniert das nicht. Es gibt hier kein bestimmtes Ziel, aber dafür, dass es funktioniert.PhantomJS Bug in grundlegenden Skript

var page = require('webpage').create(); 
page.onConsoleMessage = function(msg) { 
    console.log('CONSOLE: ' + msg); 
}; 
page.open('https://google.com/', function() { 
    page.injectJs('jquery-2.2.1.min.js'); 
    page.evaluate(function() { 
     function include(arr,obj) { // those functions are not part of scraping 
      return (arr.indexOf(obj) != -1); 
     } 
     function add(a, b) { 
      return a + b; 
     } 
     Array.min = function(array){ 
      return Math.min.apply(Math, array); 
     }; 
     function dofirst() { 
      $('#gb_70').click(); 
      main(1, 0); 
     } 
     function dosecond() { 
      document.getElementById('Email').value = '[email protected]'; 
      $('#next').click(); 
      main(2, 0); 
     } 
     function dothird() { 
      document.getElementById('Passwd').value = 'P4SSW0RD'; 
      $('#signIn').click(); 
      main(3, 0); 
     } 
     function dofourth() { 
      L1 = ['test', 'test2', 'google']; 
      for (var i = 0; i < 1; i++) { 
       if (L1, 'google') { 
        console.log('SUCCESS!'); 
       } 
      } 
      main(4, 0); 
     } 
     function dofifth() { 
      $('.gb_b.gb_8a.gb_R').click() 
      setTimeout(function(){$('#gb_71').click()}, 500); 
      main(0, 5000); 
     } 
     function main(i, j) { 
      if (i === 0) { 
       console.log('launching 0'); 
       setTimeout(dofirst(), j); // connections 
      } 
      else if (i === 1) { 
       console.log('launching 1'); 
       setTimeout(dosecond(), 5000); 
      } 
      else if (i === 2) { 
       console.log('launching 2'); 
       setTimeout(dothird(), 5000); 
      } 
      else if (i === 3) { 
       console.log('launching 3'); 
       setTimeout(dofourth(), 5000); 
      } else if (i === 4) { 
       console.log('launching 4'); 
       setTimeout(dofifth(), 5000); 
      } 
     } 
     main(0, 5000); 
    }); 
    console('super end'); 
    page.render('google.png'); 
}); 

Am Ende bekomme ich diese Fehler:

CONSOLE: launching 0 
CONSOLE: launching 1 
TypeError: null is not an object (evaluating 'document.getElementById('Email').value = '[email protected]'') 

    undefined:7 in dosecond 
    :22 in main 
    :4 in dofirst 
    :18 in main 
    :29 
    :30 

ich viele Möglichkeiten, und niemand arbeitete versucht. Ich könnte es mit Python und Selen-Web-Treiber (was wirklich Liebe war) machen. Aber jetzt ist die Zeit vergangen, und es muss in Javascript sein (um vollständig DOM/jQuery ... so Web-kompatibel zu sein).

Können Sie mir bitte helfen, damit es funktioniert!

EDIT 1: indem Sie versuchen, einen Screenshot zu erfassen, speichert es ein leeres PNG.

EDIT 2: Ich denke, dass ein Hinweis darauf sein kann, wenn ich PhantomJS test.js tun, ist es eine sehr lange Zeit in Anspruch nimmt, um endlich zu laden und meldet sich schnell alles ...

EDIT 3: Dokument, das ich geändert. get (...). value = 'blabla' bis $ ('# id'). val ('blabla'); Und jetzt druckt es

CONSOLE: launching 0 
CONSOLE: launching 1 
CONSOLE: launching 2 
CONSOLE: launching 3 
CONSOLE: SUCCESS! 
CONSOLE: SUCCESS! 
CONSOLE: SUCCESS! 
CONSOLE: SUCCESS! 
CONSOLE: SUCCESS! 

Es sollte jedoch nur einen ERFOLG drucken, und offensichtlich erfassen noch funktioniert nicht.

+0

Ich denke, '.value' ist keine Eigenschaft eines DOM-Elements in Javascript. Versuchen Sie, 'jQuery ('# Email'). Val ('[email protected]')' wie in jQuery zu verwenden? Was ist der DOM-Typ des Elements 'Email'? – Fredster

+0

Aber warum dauert es ewig zu laden? –

+0

Sie hatten Recht über. Wert Jetzt druckt, was ich in EDIT 3 –

Antwort

0

Für EDIT 1: versuchen, den Bildschirm

Überprüfen Sie den Status zu erfassen die Seite, um sicherzustellen, geladen wird.

page.open(url, function(status) { 
    if (status !== 'success') { 
     // exit if it fails to load the page 
     console.log(status); 
     phantom.exit(1); 
    } 
    else{ 
     // your code here 
    } 
}); 
+0

Ich akzeptierte die Antwort, wie Sie geholfen haben. Ich habe jedoch ein anderes Problem. Mein Skript muss die ganze Zeit mit einer Schleife laufen, da ich das Skript dazu in der Frage geändert habe. Allerdings bekomme ich einen 'RangeError: Maximale Callstackgröße überschritten.' Fehler und alles geht sehr schnell, wohingegen es die Sache alle 5s machen sollte. Was passiert und wie können wir es beheben? –

+0

Sie haben eine Endlosschleife in Ihrer Logik. Die Funktion 'dofifth()' ruft die Hauptfunktion mit '0' auf und beginnt alle anderen Funktionen erneut aufzurufen. Ich schlage vor, den Code mit phantomJS 'waitFor' zu restrukturieren. Überprüfen Sie diese http://stackoverflow.com/a/32502929/2519988 – Fredster

+0

Die Logik besteht darin, eine Endlosschleife zu haben. Ich möchte in der Lage sein, alle x Minuten/Sekunden (alles) das Skript zu starten, das als 5 Funktionen strukturiert ist, die von einem Master aufgerufen werden. –