2016-12-28 3 views
3

저는 WWW :: Mechanize :: Firefox의 eval_in_page을 통해 jQuery/Angular calls를 실행하려고합니다. 오류가 발생하기 때문에 범위 문제가 있다고 생각합니다.WWW :: Mechanize :: Firefox를 통해 jQuery 또는 Angular 함수를 호출하려면 어떻게해야합니까?

이 코드를 실행하려고하면 :

angular.element(document.getElementsByClassName("input")[0]).triggerHandler(('change'); 

나는이 응답을 얻을 :

MozRepl::RemoteObject: ReferenceError: angular is not defined at ...

이 코드 실행하려고하면 :

$(".input").val("Foo") 

나는이 응답을받을를 :

MozRepl::RemoteObject: ReferenceError: $ is not defined ...

프레임 워크에 액세스 할 수없는 것 같습니다. 페이지가로드 된 것처럼 보입니다. 브라우저 콘솔에서 코드를 실행하면 정상적으로 작동합니다.

+2

파이어 폭스 내부 정보에 대해 충분히 알지 못하지만 문제는 [this] (https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts)와 관련이 있다고 생각합니다. ([this] (https://bugs.jquery.com/ticket/4151)). eval_in_page는 DOM의 특정 부분에만 액세스 할 수있는 샌드 박스에서 실행됩니다 (관련 코드는 [여기]입니다 (https://metacpan.org/source/CORION/WWW-Mechanize-Firefox-0.79/lib/WWW/). Mechanize/Firefox.pm # L532)). jQuery를 샌드 박스에로드 할 수는 있지만 왜 jQuery 및/또는 Angular를 사용하여 정확히 무엇을 하려는지 확실하지 않습니다. – ThisSuitIsBlackNot

+0

Angular에서 많이 사용하는 웹 페이지 인터페이스를위한 코드를 작성하려고합니다. 특히, ID 또는 이름 요소가없는 입력 필드를 채우려고합니다. 해당 필드가 변경 이벤트를 감지하면 일정 관리를 수행하는 각도 정의 된 함수를 트리거하는 것으로 보입니다. 블러 이벤트를 감지하면 텍스트 입력을 스팬 내에서 예쁜 "태그"로 변환합니다. 이 관리 때문에 나는 가치를 채워야하고 그 기능을 여행 할 필요가 있다고 믿는다. –

답변

1

$mech->click()으로 필드 내부를 클릭하고 x, y 좌표를 허용하고 텍스트를 삽입 한 다음 다시 포커스를 제거 할 수 있습니다. 전에 PhantomJS를 사용 했었습니다. WWW::Mechanize::Firefox에도 적용됩니다.

use WWW::Mechanize::PhantomJS; 
use strict; 
use warnings; 

my $mech = WWW::Mechanize::PhantomJS->new(log => 1); 
$mech->get('http://example.com'); 

if($mech->success) { 
    # accepts x, y coordinates 
    $mech->click(.. field[2]); 

    # set a text for example in input-field number 2 
    $mech->eval('document.getElementsByTagName("input")[2].value = "Your value";'); 

    # Click somewhere else to trigger blur event 
    $mech->click(.. outside the field[2]); 

    # Read the converted textual input from span 
} 
+0

이것은 좋은 접근 방법이지만 좌표를 찾는 방법을 포함시키는 것이 도움이됩니다. – simbabque

+0

나를 도와주었습니다. 문제는 집 뒤에서 작업을 유지하기 위해 변경 이벤트를 트리거해야한다는 것입니다. 지금까지 나는 각성 요소에서 그렇게 할 수 없었습니다. 나는 이것을 올바르게 다루는 방법을 찾고있다. 다른 사람이 해결책을 게시하기 전에 발견하면 다시보고하겠습니다. 감사! –

+0

제쳐두고, getBoundingClientRect()를 사용하여 좌표를 경계로하는 요소를 찾을 수있었습니다. –

0

감사합니다. 원래의 질문을 풀 수는 없었지만,이 대체 솔루션을 생각해 냈습니다. 이 자바 스크립트를 사용하여 필자는 필드를 채우고 적절한 변경 및 이벤트 블러를 트리거 할 수있었습니다. 이 작업을 수행하면 필요한 각 처리 작업을 수행 할 수있었습니다.

$js = qq(
    var myElement = document.getElementsByClassName("input")[0]; 
    myElement.value = "$value"; 

    function fireEvent(element, event) { 
    var evt = document.createEvent("HTMLEvents"); 
    evt.initEvent(event, true, true); // event type,bubbling,cancelable 
    return !element.dispatchEvent(evt); 
    } 

    fireEvent(myElement, 'change'); 
    fireEvent(myElement, 'blur'); 
); 
$mech->eval_in_page($js); 

참고 내가 사용하는 기능은 아래로 트리밍 된 솔루션은 here을 발견했다. 파이어 폭스 코드로 줄였습니다. 다른 브라우저를 사용하고 있다면 더 강력한 코드를 사용하고 싶을 것입니다. 누구든지 원래 질문에 대한 해결책을 생각해 내면 기꺼이 받아 들일 것입니다.