2014-06-20 9 views
4

Windows 8.1에서 PhantomJS 1.9.7을 사용하고 사용자 이름과 암호를 입력 한 후 로그인 버튼을 클릭하겠습니다. 나는 사용자 이름과 패스워드를 쓸 수는 있지만 PhantomJS가 버튼을 클릭하기를 원할 때, 요소를 찾을 수는 있지만 그것을 클릭 할 수는 없다. 이전 게시물에서 이벤트를 만들고 "dispatchEvent"를 사용해야 함을 발견했습니다. 나는 그랬지만 다음과 같은 오류가 발생했다.PhantomJS가 기존 요소를 클릭 할 수 없습니다.

TypeError: 'undefined' is not a function (evaluating 'elm.dispatchEvent(event)')

나는 또한 EventListener로부터 도움을 얻으려고했지만 그와 같은 오류가있다.

요소를 어떻게 클릭 할 수 있습니까?

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

page.open('URL', function() { 
    var submitButton = enterUserAndPassAndLogin();  
    click(submitButton); 
    phantom.exit(); 
}); 

function enterUserAndPassAndLogin() { 
    var element = page.evaluate(function() { 
     document.querySelector('input[name="username"]').value = "*******"; 
     document.querySelector('input[name="password"]').value = "*******"; 
     return document.getElementsByTagName("Button"); 
    }); 
    return element; 
} 

function click(elm) { 
    var event = document.createEvent("MouseEvent"); 
    event.initMouseEvent("click", true, true, window, 
     0, 0, 0, 0, 0, false, false, false, false, 0, null); 
    elm.dispatchEvent(event); 
} 
+0

당신이 버튼을 클릭 할 때 사용하는 코드를 작성할 수 있습니다 :

가능한 스크립트는이 무엇입니까? –

+0

@cracker : [단어 강조 표시를 위해 [인라인 코드 스팬]을 사용하지 마십시오. (http://meta.stackexchange.com/questions/135112/inline-code-spans-should-not-be-used-for-emphasis- 오른쪽) - 종종 필요하지 않으며 무엇인가 정말로 강조해야 할 필요가있는 경우 [굵은 체 또는 이탤릭체 사용] (http://www.etf.europa.eu/authorssite.nsf/Pages/Use%20of%20bold%20and%20italics) 대신. 인라인 코드 스팬은 문장 내 코드의 경우에만 (이름에서 알 수 있듯이) 게시물을 편집 할 때 명심하십시오. –

+0

물론, 다음에 신경을 써서 고마워. – cracker

답변

-1

간단히 jQuery를 연결하고 페이지가 비동기 포스트를 사용하는 경우, 페이지로드 이벤트가 트리거되지 않습니다,

$(selector).trigger('click'); 

주의 할, 그러나 그것은 "로드"당신은 기다려야 응답을 위해.

아마 몇 초 정도 기다리면 간단히 비동기 게시물이 돌아 오기에 충분할 것입니다.

+0

그냥 "대신 jQuery로 해보기!"라고 제안하십시오. OP가 갖는 특정 문제를 해결하는 데는 아무 것도하지 않습니다. –

+0

친애하는 @sphanley : 주목할 점 : 포스터에 의하면 : dispatchEvent는 정의되지 않았습니다. Jquery에는 메서드가 있습니다. 확실히. – Sesertin

+0

그래,하지만 그건 차를 타기 시작하는 데 도움을 청하는 사람에게 버스를 타기 시작하는 것과 같다. 물론, jQuery는 요소를 클릭 할 수 있지만 OP는 jQuery가 아닌 PhantomJS를 사용합니다. –

0

코드에 두 가지 문제점이 있습니다. 첫 번째 DOM 요소는 페이지 컨텍스트 (page.evaluate) 외부에서 전달 될 수 없습니다. docs에서 해당 라인은 :

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

Closures, functions, DOM nodes, etc. will not work!

그래서 submitButton[null]입니다. 배열이 반환되기 때문에 오류 메시지는 실제 문제를 표시하지 않습니다. DOM 요소를 외부로 전달할 수 없기 때문에 클릭은 page.evaluate 내부에서 발생해야합니다.

page.evaluate은 샌드 박스이므로 페이지 구조 내에서 click 함수를 정의해야합니다. 외부의 변수 및 기능에 직접 액세스 할 수 없습니다.

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

page.open('URL', function() { 
    enterUserAndPassAndLogin(); 
    setTimeout(function(){ 
     // wait a little to maybe see the click result 
     phantom.exit(); 
    }, 1000); 
}); 

function enterUserAndPassAndLogin() { 
    page.evaluate(function() { 
     function click(elm) { 
      var event = document.createEvent("MouseEvent"); 
      event.initMouseEvent("click", true, true, window, 
       0, 0, 0, 0, 0, false, false, false, false, 0, null); 
      elm.dispatchEvent(event); 
     } 
     document.querySelector('input[name="username"]').value = "*******"; 
     document.querySelector('input[name="password"]').value = "*******"; 
     click(document.getElementsByTagName("Button")[0]); 
    }); 
} 
관련 문제