2014-05-21 3 views
4

나는 크롤러로 PhantomJS를 사용하고 있습니다. 페이지에 JS가 없다면 onLoadFinished이 실행될 때 완전히로드되었다고 추측 할 수 있지만 페이지에 JS가 있으면 스크립트에 작업 할 수있는 기회를주기 위해 약간 기다려야합니다.PhantomJS에로드 된 페이지에서 자바 스크립트를 감지

var pageHasJS = page.evaluate(function() { 
    return (document.getElementsByTagName("script").length > 0 || 
      document.evaluate("count(//@*[starts-with(name(), 'on')])", 
           document, null, XPathResult.NUMBER_TYPE, 
           null).numberValue > 0); 
}) 

<script> 태그와 onsomething 속성을 가진 요소를 찾습니다이 감지 JS에서 내 현재 자상이다.

Q1 : JS를 페이지에 몰래 넣을 수있는 다른 HTML 구문이 있습니까? javascript: 아무 것도 클릭하지 않기 때문에 URL은 계산되지 않습니다.
질문 2 : 두 번째 테스트를 수행하는 더 좋은 방법이 있습니까? I 이라고 믿는다면 querySelector으로 할 수 없으므로 XPath를 사용하지만 동일한 작업을 수행하는 다른 기능이있을 수 있습니다.
Q3 : 크롤러가로드되면 크롤러가 페이지와 상호 작용하지 않습니다. onload 이벤트는 사용자 상호 작용이 없을 때 발생하는이라는 기존 레거시 이벤트 속성 인 입니다. 다른 사람들이 있습니까? 즉, 두 번째 테스트를 document.evaluate("count(//@onload)", ...) 또는 심지어 !!document.body.getAttribute("onload")으로 바꾸는 것이 안전할까요?

+0

나는 당신이 좋은 사람이라고 생각합니다. 'onunload' 속성에 js가있을 수 있지만, 이것은 당신을 걱정하지 않아야합니다. –

답변

1

스크립트 태그를 확인하고 일정한 시간을주는 대신 onResourceRequested/onResourceReceived에서 실제 HTTP 요청을 가로 채고 모든 리소스가로드 된 후 스크린 샷을 찍을 수 있습니다. 좀 봐 ajax-render

+1

불행히도 충분하지 않습니다. 자바 스크립트를 사용하여 몇 초에서 몇 분 뒤에 'window.location'을 변경하는 페이지의 놀랍게 일반적인 경우를 생각해보십시오. – zwol

+0

그러나 팁을 주셔서 감사합니다 - 나는 이것을해야합니다 * 또한 *. – zwol

관련 문제