2016-07-11 2 views
-1

Это сценарий, притворяющийся для входа в вашу учетную запись google (я сделал). Но, очевидно, это не работает. Здесь нет конкретной цели, но чтобы она работала.Ошибка PhantomJS в базовом скрипте

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'); 
}); 

В конце я получаю эти ошибки:

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 

Я перепробовал много способов, и ни один не работал. Я мог бы заставить его работать, хотя с Python и селен веб-драйвером (который был настоящей любовью). Но теперь время прошло, и оно должно быть в javascript (чтобы быть полностью DOM/jQuery ... поэтому совместим с Интернетом).

Помогите пожалуйста, пожалуйста, чтобы это сработало!

EDIT 1: пытаясь сделать снимок экрана, он сохраняет пустой PNG.

EDIT 2: Я думаю, что может быть намеком, когда я phantomjs test.js, это занимает очень много времени, чтобы, наконец, загружать и регистрирует быстро все ...

EDIT 3: Я изменил документ. get (...). value = 'blabla' to $ ('# id'). val ('blabla'); А теперь он печатает

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

Однако он должен печатает только один УСПЕХ, и, видимо, захватить все еще не работает.

+0

Я думаю, что '.value' не является свойством элемента DOM в javascript. Вы пытаетесь использовать 'jQuery ('# Email'). Val ('[email protected]')' как в jQuery? Что такое тип DOM элемента 'Email'? – Fredster

+0

Но зачем понадобится возраст? –

+0

Вы были правы. .value Теперь он печатает то, что я добавил в EDIT 3 –

ответ

0

Для EDIT 1: попытка захвата экрана

Проверьте состояние, чтобы убедиться, что страница загружается.

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

Я принял ответ, как вы помогли. Однако у меня другая проблема. Мой скрипт должен работать все время с помощью цикла, поскольку я изменил скрипт, чтобы сделать это в вопросе. Однако я получаю ошибку «RangeError: Maximum call stack size above.», И все идет очень быстро, тогда как она должна делать все 5 секунд. Что происходит и как мы можем это исправить? –

+0

У вас бесконечная петля в вашей логике. Функция 'dofifth()' вызывает основную функцию с '0' и снова вызывает все остальные функции. Я предлагаю переделать код с помощью phantomJS 'waitFor'. Проверьте это http://stackoverflow.com/a/32502929/2519988 – Fredster

+0

Логика состоит в том, чтобы иметь бесконечный цикл. Я хотел бы запустить каждые x минут/секунд (что-либо) скрипт, который структурирован как 5 функций, называемых ведущим. –

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