2014-03-25 3 views
1

PhantomJs를 사용하여 ASP.Net 웹 앱을 크롤링하고 URL의 간단한 텍스트 파일에 정의 된 페이지 목록의 스크린 샷을 찍으려고합니다. 로그인 벽 뒤에있는 페이지는 제대로 작동하지만 PhantomJs 인스턴스를 인증받지 못하는 것 같습니다. 로그 메시지는 내가 두 개의 간격 함수로 올바른 순서로 일을하고 있음을 보여줍니다. 어떤 아이디어가 먼저 로그인했는지 확인하는 방법은 무엇입니까?로그인 후 스크린 샷에 PhantomJS 사용하기

var fs = require('fs'), 
    system = require('system'); 

var content = '', 
    f = null, 
    lines = null, 
    pages =null, 
    destinations = null, 
    eol = system.os.name == 'windows' ? "\r\n" : "\n"; 

//read in a line break separated list of urls 
//page at index 0 is the login page 
try { 
    f = fs.open(".\\urls.txt", "r"); 
    content = f.read(); 
} catch (e) { 
    console.log(e); 
} 

if (f) { 
    f.close(); 
} 

if (content) { 
    lines = content.split(eol); 
    pages = new Array(); 
    destinations = new Array(); 

    for (var i = 0, len = lines.length; i < len; i++) { 
     var pageName = lines[i].substring(lines[i].lastIndexOf('/') + 1); 
     pages[i] = pageName;  
     destinations[i] = ".\\NewScreenShot\\" + pageName + '.png'; 
    } 
} 

console.log('Pages found: ' + pages.length); 


var page = require('webpage').create(); 


var loginIndex = 0; 
var loginInProgress = false; 
var loginSteps = [ 
    function() { 
    //Enter Credentials 
    page.evaluate(function() { 
     document.getElementById("txtusername").value = "[email protected]"; 
     document.getElementById("txtpassword").value ="12345678";  
     return; 
    }); 
    }, 
    function() { 
    //Login 
    page.evaluate(function() { 
     var arr = document.getElementById("form1"); 
     var i; 
     for (i=0; i < arr.length; i++) { 
     if (arr[i].getAttribute('method') == "POST") { 
      arr[i].submit(); 
      return; 
     } 
     } 
    }); 
    } 
]; 

var LoadPage = function() { 
    if (!loadInProgress && pageindex < pages.length) { 
     console.log("image " + (pageindex + 1) + " of " + lines.length); 
     page.open(lines[pageindex]); 
    } 
    if (pageindex == lines.length) { 
     console.log("<< Image render complete! >>"); 
     phantom.exit(); 
    } 
} 


//PNG RENDER 
var pageindex = 0; 
var loadInProgress = false; 
var interval = setInterval(LoadPage, 500); 

page.onLoadStarted = function() { 
    loadInProgress = true; 
    if(pageindex == 0) { 
     loginInProgress = true; 
    } 
    console.log('page ' + (pageindex + 1) + ' load started'); 
}; 

page.onLoadFinished = function() { 
    loadInProgress = false; 

    if(pageindex == 0) 
    { 
     loginInProgress = false; 
     console.log("stopping page interval"); 
     clearInterval(interval); 
    } 

    page.evaluate( 
     function() { 
     var scaleVal = "scale("+arguments[0] || '1.0'+")"; 
     document.body.style.webkitTransform = scaleVal; 
     }  
    ); 
    console.log("rendering:" + destinations[pageindex]); 
    page.render(destinations[pageindex]); // RENDER PAGE // 

    if (pageindex == 0){ 
     var loginInterval = setInterval(function() { 
      if (!loginInProgress && typeof loginSteps[loginIndex] == "function") { 
      console.log("login step: " + loginIndex) 
      loginSteps[loginIndex](); 
      loginIndex++; 
      } 
      if (typeof loginSteps[loginIndex] != "function") { 
      console.log("stopping login interval"); 
      clearInterval(loginInterval); 

      console.log("starting page interval"); 
      setInterval(LoadPage, 500); 
      } 
     }, 50); 
    } 

    pageindex++; 
} 
+0

StackOverflow를 사용하면 내일까지 게시 할 수 없습니다. 쥐. –

답변

2

문제는 양식 제출 대 버튼 클릭이라고 나타납니다. 아래 작업 코드 :

var urlsLocation = "C:\\PhantomJs\\urls.txt"; 
var newScreenshotFolder = "C:\\PhantomJs\\NewScreenShot\\"; 

var fs = require('fs'), 
    system = require('system'); 

var content = '', 
    f = null, 
    lines = null, 
    pages =null, 
    destinations = null, 
    eol = system.os.name == 'windows' ? "\r\n" : "\n"; 

//read in a return separated list of urls 
try { 
    f = fs.open(urlsLocation, "r"); 
    content = f.read(); 
} catch (e) { 
    console.log(e); 
} 

if (f) { 
    f.close(); 
} 

if (content) { 
    lines = content.split(eol); 
    pages = new Array(); 
    destinations = new Array(); 

    for (var i = 0, len = lines.length; i < len; i++) { 
     var pageName = lines[i].substring(lines[i].lastIndexOf('/') + 1); 
     pages[i] = pageName;  
     destinations[i] = newScreenshotFolder + pageName.replace(/[^a-zA-Z0-9\.]/g, "") + '.png'; 
    } 
} 

console.log('Pages found: ' + pages.length); 


var page = require('webpage').create(); 


var loginIndex = 0; 
var loginInProgress = false; 
var loginCompleted = false; 
var loginSteps = [ 
    function() { 
    //Enter Credentials 
    page.evaluate(function() { 
     document.getElementById("txtusername").value = "[email protected]"; 
     document.getElementById("txtpassword").value = "12345678";  
     return; 
    }); 
    }, 
    function() { 
    //Login 
    page.evaluate(function() { 
     document.getElementById("btnLogin").click();   
      return; 
    }); 
    } 
]; 

var LoadPage = function() { 
    if (!loadInProgress && pageindex < pages.length) { 
     console.log("image " + (pageindex + 1) + " of " + lines.length); 
     page.open(lines[pageindex]); 
    } 
    if (pageindex == lines.length) { 
     console.log("<< Image render complete! >>"); 
     phantom.exit(); 
    } 
} 


//PNG RENDER 
var pageindex = 0; 
var loadInProgress = false; 
var interval = setInterval(LoadPage, 500); 

page.onLoadStarted = function() { 
    loadInProgress = true; 
    if(pageindex == 0) { 
     loginInProgress = true; 
    } 
    console.log('page ' + (pageindex + 1) + ' load started'); 
}; 

page.onLoadFinished = function() { 
    loadInProgress = false; 

    if(pageindex == 0) 
    { 
     loginInProgress = false; 
     console.log("stopping page interval"); 
     clearInterval(interval); 
    } 

    page.evaluate( 
     function() { 
     var scaleVal = "scale("+arguments[0] || '1.0'+")"; 
     document.body.style.webkitTransform = scaleVal; 
     }  
    ); 
    console.log("rendering:" + destinations[pageindex]); 
    page.render(destinations[pageindex]); // RENDER PAGE // 

    if (pageindex == 0){ 
     var loginInterval = setInterval(function() { 
      if (!loginInProgress && typeof loginSteps[loginIndex] == "function") { 
      console.log("login step: " + loginIndex) 
      loginSteps[loginIndex](); 
      loginIndex++; 
      } 
      if (typeof loginSteps[loginIndex] != "function") { 
      console.log("stopping login interval"); 
      clearInterval(loginInterval); 

      console.log("starting page interval"); 
      setInterval(LoadPage, 1000); 
      } 
     }, 50); 
    } 

    pageindex++; 
} 
관련 문제