如何通过WWW :: Mechanize :: Firefox调用jQuery或Angular函数?

时间:2016-12-28 21:11:02

标签: jquery angularjs perl www-mechanize-firefox

我正在尝试通过WWW :: Mechanize :: Firefox的eval_in_page执行jQuery / Angular调用。我猜是存在某种范围问题,因为我遇到了错误。

如果我尝试执行此代码:

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

我收到了这个回复:

  

MozRepl :: RemoteObject:ReferenceError:angular未定义为...

如果我尝试执行此代码:

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

我收到了这个回复:

  

MozRepl :: RemoteObject:ReferenceError:$未定义...

似乎我无法访问任何一个框架。但是,该页面似乎都已加载。如果我在浏览器控制台中执行代码,它可以正常工作。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

感谢所有想法。我无法解决原来的问题,但我能够提出这个替代解决方案。使用这个javascript我能够填写该字段并触发相应的更改和模糊事件。这样做允许角度进行它需要做的处理。

$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的精简解决方案。我把它修剪成Firefox代码。如果您使用的是其他浏览器,则需要使用更强大的代码。如果有人想出原始问题的解决方案,我很乐意接受它。